2012-11-29 4 views
10

주기를 형성하는 서로 연결된 엔티티 집합이 있습니다. 즉, 상위 엔티티 P는 두 개의 하위 엔티티 C1 및 C2와 두 개의 일대 다 관계를 갖고 각각 이들 중 하나는 다른 엔티티 A와 일대 다 관계를가집니다. 엔티티 A는 이러한 엔티티 (C1, C2)의 연결을 실현하고 관계의 속성을 정의합니다 (단순한 조인 테이블이 아님). 모든 관계는 양방향으로 탐색 할 수 있습니다.
domain objects
다음과 같은 질문이 설계에서 발생 : 엔티티 A는 항상 루트 엔티티 P에 엔티티 관리자 작업을 호출하는 것으로,/병합 지속 제공 할 수 있도록 무엇 캐스케이드 전략이어야 하는가? A가 두 경로 모두에서 연결할 수 있어야합니까?JPA + Hibernate - 엔티티 관계의 사이클 - 캐스케이드 전략

고려 사항 : 응용 프로그램에서 하나의 캐스케이드 경로 만 제공하도록 선택하는 경우 TransientObjectException을 throw하는 시나리오가있을 수 있습니다. 두 경로를 모두 제공하는 경우이 경로는 예를 들어 C1이 A를 통해 저장되도록 시도 할 수 있으므로 전체 경로를 만들어야합니다.

버전 : JPA 2.0, Hibernate core 4.1.7, hibernate-jpa-2.0-api 1.0 .1

답변

3

나는 내 2 센트를 줄 수 있는데, 내 대답이 조금 길다면 유감스럽게 생각한다.

이 종류의 계단식 충돌이있는 경우 계단식 접근 방식이나 도메인 모델이 잘 정의되지 않았기 때문일 수 있습니다. 캐스케이드 전략을 전체 그래프 또는 관련없는 요소 집합으로 일반화하는 데주의해야합니다.

캐스케이드 전략은 강하게 결합 된 데이터 집합과 Java 세계의 클래스 및 해당 (개인) 내부 클래스와 같은 유형의 데이터에만 사용해야한다고 조언합니다. 상위 클래스와 하위 클래스 간의 관계도 독점적이어야합니다 (UML에서는 비공유 연합이라고 함).

물론 우리는 다르게 할 수 있지만 (우리 모두가 게으름을 피울 수 있습니다.) 결국 단일 지속성 흐름 (또는 지속성 구성)과 비즈니스 흐름을 연결하는 웹을 만들 수 있습니다. 예외를 많이 관리하고 이전에 저장 한 계단식 전략 (저장, 업데이트, 삭제)을 중심으로 많은 구성 논리를 수행해야합니다.

극단적 인 접근법은 하나의 큰 루트 객체 만 저장하려는 경우가있을 수 있습니다. 왜 안돼? 나머지는 계단식으로 지속되어야한다. 그러나 실제로 이것은 시스템의 유지 보수성을 심각하게 제한 할 수 있습니다. 또한,로드, 저장 및 병합 할 때 메모리에서 큰 그래프의 상태를 관리해야 할 수도 있습니다.

웹 응용 프로그램 또는 클라이언트 - 서버 응용 프로그램을 수행하는 경우 웹 워크 플로는 루트 요소의 모든 것을 저장하지 않고도 요청할 때마다 제한된 개체 집합을 저장할 수 있어야합니다. 나는 당신의 질문에 직접 응답하지 않는다는 것을 압니다. 따라서 예로 돌아가십시오.

P는 은행이고 C1과 C2는 두 개의 클라이언트이고 A는 제품입니다.

나는 2 개의 쉬운 대답을 가지고있다 : 1) 각 레이어는 계단식없이 별도로 저장할 수있다. 그러나 동일한 트랜잭션 내에서, 그리고 동일한 DAO에서 또는 원하는 경우에 수행 할 수 있습니다.

2) P와 C는 케스케이드 될 수 있습니다. 그러나 A는 다른 워크 플로우에 저장되어야합니다.

그는 "도메인 기반 분석"에 대해 이야기하는 곳은 피터 코드의 장을 생각 나게 : http://www.petercoad.com/download/bookpdfs/jmcuch01.pdf

이 장에서는 그래프에서 다른 개체가 다른 원형에서 분리 될 수있는 방법에 대해 설명합니다. 지속성 워크 플로는 트랜잭션 데이터와 설명 또는 "사물"간에 동일하지 않아야합니다. 이렇게하면 계단식 전략을보다 효과적으로 구현하는 데 도움이됩니다.

The four archetypes of Peter Coad are: 
- Is it a moment or interval? 
- Is it a role played? 
- Is it a catalog-entry-like description? 
- Otherwise, it's a party, place, or thing. 

도움이되기를 바랍니다.

3

일반적으로 가까운 연결에서만 계단식 연결을하고 부모 -> 자식 (또는 소유자 - 소유) 방향에서만 계단식 연결하는 것이 좋습니다. 귀하의 경우 아마도 P->C1P->C2 일 것입니다. A에는 부모가 하나도 없으므로 따로 저장해야합니다. 이 작업은 DAO에서 단일 트랜잭션으로 P (및 C1, C2)과 함께 언급 된 @etienno로 수행 할 수 있습니다. 귀하의 도메인 모델을 모르겠지만 어쩌면 A도 별도의 저장이 훨씬 더 정당화되는 개념적 수준의 별도 엔티티에 있습니다.

긴밀하게 관련되지 않은 많은 개체에 계단식 연결하면 그래프가 커지고 관리하기 어려워 질 때 전체 그래프를 만들 수 있습니다.

이와 같은 상황에서는 "최대 절전 모드가 없는데 어떻게 할 수 있습니까?"라는 질문을하는 것이 좋습니다. 귀하의 경우에는 먼저 P을 저장하고 C1, C2A을 먼저 저장하십시오. AFAIK JPA/Hibernate는 그러한 순서를 명시 적으로 제공하지 않기 때문에 수동으로 수행해야하는 것들이있다.

관련 문제