2016-06-01 6 views
1

작동 방법에 대한 이해를 방해하는 문제가 있습니다. JPA 쿼리로 저장소 메소드를 테스트하는 Arquillian 테스트가 있습니다.JPA EntityManager.detach()가 여전히 지연 관계를로드합니다.

테스트는 개체를 유지 한 다음 필드에 첫 번째 지속 된 개체가있는 다른 개체를 유지합니다. 그런 다음 저장소 메소드를 호출합니다. 다음으로 테스트는 분리되고 (entitymanager를 지우고, 객체가 em 등에 들어 있지 않은지 검사한다.) 마지막으로 테스트는 관련 객체가 있는지 여부를 확인합니다 (쿼리가 관계를 읽지 않아야하므로).

예상대로 디버거를 볼 때 관련된 객체는 null이지만 assert가 실제로 getRelatedObject-method를 사용할 때 관련 객체를로드합니다.

의사 코드는 (내가) 희망 명확히 : 잘못 내 이해, 관련 객체가 여전히로드해야

FirstObject f = new FirstObject(); 
em.persist(f); 
SecondObject s = new SecondObject(); 
s.setFirstObject(f); 
em.persist(f); 
MyRepo r = new MyRepo(); 
SecondObject result = r.runQuery(f.getId()); 
em.detach(result); //result.getFirstObject is null 
em.clear(); 
assertIsNull(result.getFirstObject()); //loads first object and test fails 

인가? 나는 LazyInit 예외를 예상했다.

내가 이해할 수 없다면, 쿼리가 관련 객체를 채우지 않는 것을 확인하는 방법은 무엇입니까?

답변

3

JPA 2 프로 책 (예, 엔티티 대신 DTO - 객체를 사용하여 더 나은, 나는 알고있다 ... 우리가 토론이 있었다 내가이 기각되었다) (Apress의는, P160)을

노트

"엔티티가 다른 사람들이 단순히 예외를 던지거나 초기화되지 않은 속성을 떠날 수있는 반면 정의되지 않은 분리. 일부 업체의 관계를 해결하기 위해 시도 할 수 있습니다 때 언로드 속성을 액세스하는 동작."

개인적으로 EclipseLink에 대한 경험이 없으므로이 영역의 설명서에서 확실한 내용을 찾을 수 있지만 다음 링크는 모두 분리 링크 모음에서 지연 연결에 액세스 할 때 EclipseLink가 시도하고 해결할 것을 제안합니다.

Eclipselink Lazy Loading

http://issues.apache.org/jira/browse/OPENJPA-2483

http://blog.ringerc.id.au/2012/06/jpa2-is-very-inflexible-with-eagerlazy.html