2012-10-13 7 views
3

@Any 관계를 어떻게 처리 할 수 ​​있습니까?LazyInitializationException으로 인해 @ 관련 항목을 가져올 수 없습니다

나는 어떤 종류의 메시징 상호 작용에 참여하고 싶어하는 모든 사람이 구현하는 InteractionParticipate 인터페이스를 가지고 있습니다. 송신자와 수신자가있는 메시지는 InteractionMessage으로 표시됩니다. InteractionParticipate을 구현하는 엔티티가 메시지의 수신자 (또는 송신기)가 될지 모르기 때문에 @Any 관계를 사용해야합니다.

@Any(metaColumn = @Column(name = "Transmitter_Type")) 
@AnyMetaDef(
     idType = "long", 
     metaType = "string", 
     metaValues = { 
       @MetaValue(value = "Applicant", targetEntity = Applicant.class), 
       @MetaValue(value = "Vacancy", targetEntity = Vacancy.class) 
     }) 
@JoinColumn(name = "Transmitter_Id") 
@LazyToOne(LazyToOneOption.FALSE) 
private InteractionParticipate transmitter; 

@Any(metaColumn = @Column(name = "Receiver_Type")) 
@AnyMetaDef(idType = "long", metaType = "string", 
     metaValues = { 
       @MetaValue(targetEntity = Applicant.class, value = "Applicant"), 
       @MetaValue(targetEntity = Vacancy.class, value = "Vacancy") 
     }) 
@JoinColumn(name = "Receiver_Id") 
@LazyToOne(LazyToOneOption.FALSE) 
private InteractionParticipate receiver; 

데이터베이스 잘 생성되고 나는 실체가 제대로 저장 볼 수 있습니다

나는 나에게 영감과 같은 InteractionMessage 뭔가 쓴 this one을 읽었습니다. 나는 데이터베이스

InteractionMessage message = (InteractionMessage) session.get(InteractionMessage.class, id);

에서 InteractionMessage를 얻을 때하지만 방법은 'org.hibernate.LazyInitializationException'예외를 던져 때문에 나는 receivertransmitter도 얻을 수 없습니다 직면하고 있습니다. 평가할 수 없습니다 ... 공석 _ $$ _ javassist_49.toString(). (공석 클래스는 InteractionParticipate을 구현 중입니다.)

@LazyToOne과 심지어는 @LazyCollection으로 게임을했지만 실패했습니다.

알아서 도와주세요. 미리 감사드립니다!

답변

0

분리 된 개체의 모음에 액세스하려고합니다. 분리 된 개체는 세션에 연결되어 있지 않다는 것을 의미합니다. 결과적으로, lazy 콜렉션에 액세스 할 때 예외가 발생합니다. 이것은 여러 가지 이유로 발생할 수 있습니다. 예를 들어 프런트 엔드에서 직렬화하여 개체를받습니다. 원하는 결과에 따라 가능한 두 가지 솔루션이 있습니다.

1) 열심히 가져올 컬렉션을 정의 할 수 있습니다. 즉, 부모 객체가 초기화 되 자마자 컬렉션이 초기화됩니다. 2) 개체 (T mergedObject em.merge (detachedObject);)를 병합하여 컬렉션에 액세스 할 수 있습니다.

작은 경고 : em.merge()는 병합 된 개체를 반환합니다. 그러나 이전 버전은 여전히 ​​분리되어 있으므로 병합 된 버전에 액세스해야합니다.