2017-11-03 1 views
1

을 사용하는 표준 JEE7 응용 프로그램이 있고 관계에 엔티티 트리가 CascadeType.ALL으로 주석 된 모든 엔티티가 있습니다. 모든 엔터티에는 데이터베이스 시퀀스의 @GeneratedValue 개의 ID가 있습니다.Eclipse 엔티티 트리를 다시 부착 한 후 이상한 동작 연결

트랜잭션 중에 엔티티 트리의 관리 인스턴스를 가져온 다음 루트를 분리 한 다음 트리의 모든 @Id 필드와 @Version 필드에 null을 설정하고 루트 엔티티를 병합합니다.

트리의 모든 관리 된 엔터티 (두 개를 제외하고는 새 ID가 있어야 함)가 예상됩니다. 주로 관한 피하기 위해 내가 그 EntityA 내의 equals와 hashCode 방법에 몇 가지 변화를 시도

org.eclipse.persistence.exceptions.ValidationException 
Exception Description: Null or zero primary key encountered in unit of work clone [EntityA [id=null, businessId=17EN000000000083]], primary key [null] 

: 문제는 다른 종류의 두 개체가 자신의 ID 필드에 널 (null)을 유지하고 나는 다음과 같은 예외를 받고 있어요 투입 할 때이다 2 개의 엔티티는, 양쪽 모두의 ID가 null의 경우는 동일하지만, 아무것도 발생하지 않습니다. 문제는 결정적이지 않습니다. 디버깅 중에 ID가 생성되었지만 일반적으로 null입니다.

누구나 문제에 대한 힌트를 줄 수 있습니까? 예상대로

--edit는

우리가 문제가 관계 FetchType.EAGER 대신 FetchType.LAZY을 사용

merge는 ID를 만들었습니다. 왜 이런 일이 일어 났는지 설명 할 수 있습니까?

+0

기존 트리를 복제하려는 경우 복제 방법을 구현하여 새 복사본을 만들지 않는 이유는 무엇입니까? 그렇지 않으면 문제 엔티티를 그래프가 아닌 직접 병합 (또는 더 좋게 유지)하면 어떻게됩니까? – Chris

+0

엔티티 트리의 새 버전을 만들려고합니다. ID를 분리하고 설정하면 각 항목의 버전 번호가 증가합니다. 클론을 사용하는 경우 트리의 모든 엔티티를 수동으로 복제해야합니다. 즉, 분리 된 엔티티와 함께 ​​루트 엔티티를 분리하고 변경 후에 다시 병합합니다. 이클립스 링크의 아이덴티티 맵과 관련된 것이 문제를 일으키는 것으로 생각됩니다. 문제가있는 엔티티를 분리하면 새로운 엔티티가 생성되고 모든 것이 잘 작동합니다. 엔티티가 이미 캐시에 존재하는 경우 병합 중에 일식 링크 엔티티 관리자가 확인하는 방법을 알고 있습니까? –

+0

EclipseLink가 변경 사항 추적을 사용하는 환경에서 잘못 작성하고 있습니다. 기존 엔티티를 재사용하고 PK 만 변경하는 것이 아니라 엔티티의 복사본을 만들어야합니다. 그것을 시도하거나, 내가 제안한대로 객체를 직접 영속적으로 시도하십시오. 당신이보고있는 행동은 당신의 게으른 관계가 당신의 '분리 (detachment)'이전에 가져 오지 않았다면 쉽게 설명 될 수 있습니다. 당신이 어떻게이 주체들을 어떻게 분리하는지 설명하지 않았습니다. EclipseLink는 읽은 컨텍스트가 계속 사용 가능할 때까지 게으른 관계에 액세스 할 수 있으므로 해당 관계에 액세스하는 것은 관리되는 엔터티에서 읽는 것입니다. – Chris

답변

0

엔티티를 직렬화하지 않으면 실제로 분리되지 않습니다. EclipseLink는 Context가 여전히 사용 가능할 때까지 게으른 관계를 가져 오는 기능을 제공합니다. 이는 EntityManagerFactory가 닫히거나 엔티티가 직렬화 될 때까지 의미합니다. 그래서 당신이 당신의 엔티티를 떼어 놓고 게으른, unfetched 관계를 횡단한다면, 참조 된 엔티티는 초기 읽기를 수행 한 EntityManager로부터 읽혀지고 관리 될 것입니다.

변경 사항에 관계없이 다른 아티팩트를 엔티티에 포함 시키면 새 ID로 데이터를 유지하려는 경우 엔티티를 복사하는 것이 좋습니다.

관련 문제