2012-05-24 2 views
3
내 솔루션은 3 개 개의 프로젝트로 구성

이상한 예외가 발생합니다 :자바 EE6 : 정적 직물과 FetchType.LAZY는

  • EJB의 엔티티 클래스를 관리하는 넷빈즈 자동으로 생성 된 외관과 프로젝트와의 persistence.xml을

  • 모든 @Entity가 주석과 정적에 대한 데이터베이스 클래스와 원격 인터페이스를 길쌈 보유
  • 클래스 라이브러리 외관 EJB의 구성

  • 독립형 클라이언트 (EJB 및 독립 실행 형 클라이언트간에 공유) 주로 스윙 GUI 클래스

저는 Glassfish 3.1.2, Eclipselink 2.3을 JPA 공급자, Netbeans 7.1.1 및 MySQL 데이터베이스로 사용합니다. 나는 persistence.xml 기반으로 앤티 티 클래스를 정적으로 묶는 Ant 태스크를 구성했다.

fetch = FetchType.LAZY로 장식 된 엔티티 사이에 @OneToOne, @ManyToOne 및 @ManyToMany 어노테이션이있는 관계가 여러 개 있습니다.

은 지금은 모두 다음과 같은 오류가 함께 얻을 :

Exception in thread "Mainframe Loader" Local Exception Stack: 
Exception [EclipseLink-7242] (Eclipse Persistence Services - 2.3.2.v20111125-r10461):  org.eclipse.persistence.exceptions.ValidationException 
Exception Description: An attempt was made to traverse a relationship using indirection that had a null Session. This often occurs when an entity with an uninstantiated LAZY relationship is serialized and that lazy relationship is traversed after serialization. To avoid this issue, instantiate the LAZY relationship prior to serialization. 
at org.eclipse.persistence.exceptions.ValidationException.instantiatingValueholderWithNullSession(ValidationException.java:998) 
at org.eclipse.persistence.internal.indirection.UnitOfWorkValueHolder.instantiate(UnitOfWorkValueHolder.java:220) 
at org.eclipse.persistence.internal.indirection.DatabaseValueHolder.getValue(DatabaseValueHolder.java:88) 
at org.eclipse.persistence.indirection.IndirectList.buildDelegate(IndirectList.java:244) 
at org.eclipse.persistence.indirection.IndirectList.getDelegate(IndirectList.java:414) 
at org.eclipse.persistence.indirection.IndirectList.size(IndirectList.java:752) 
at ch.lawsuite.gui.mail.PosteingangUI.updateDokumentTable(PosteingangUI.java:47) 
at ch.lawsuite.gui.mail.MailboxUI.updateDokumentTables(MailboxUI.java:81) 
at ch.lawsuite.gui.mail.MailboxUI.initMailboxes(MailboxUI.java:37) 
at ch.lawsuite.gui.mail.MailboxUI.<init>(MailboxUI.java:23) 
at ch.lawsuite.gui.MainframeUI.initModules(MainframeUI.java:191) 
at ch.lawsuite.gui.login.LoginUI$MainframeLoader.run(LoginUI.java:131) 

어떤 도움이 높게 평가된다. 나는 완전히 사전에 지금 일주일 이상 :-(

많은 감사를 위해이 문제로 교착 상태에있어

+0

원격으로 "클라이언트"에서 왔습니까? 그렇다면 무엇이 발생할 것입니까? – esej

+0

예, 원격 독립 실행 형 클라이언트에서 예외가 발생했습니다. 느리게 연결된 객체가 처음 액세스 될 때 데이터베이스에서 자동으로 가져 오게됩니다.이 경우이 가정에 잘못 맞습니까? – salocinx

답변

2

엔티티가 원격 클라이언트에 전달되면! - 당신은 없음 -로드 게으른 속성을로드 할 수 없습니다. 스태틱 위빙은 이것과 아무런 관련이 없습니다 (정적/동적/위빙이 아닌 경우 자동 처리가 다릅니다). 그러나 개념적으로 개발자로서 우리는 차이가 없습니다)

+0

귀하의 답변에 많은 감사드립니다. 내가 올바르게 이해한다면, 위빙은 데이터베이스 계층과 엔티티 관리자 사이의 엔티티를 처리하기위한 것일뿐입니다. 이것은 second-level 캐시와 관련이 있습니까? 엔티티가 직렬화되어 네트워크를 통해 전송 되 자마자 관리되지 않은 상태에 있으며 가져 오기 유형과 관련이 없습니까? 죄송합니다. 많은 질문에 대해서는 하나의 질문으로 모두 대답 할 수 있습니다 .-) – salocinx

+1

JPA 구현이 엔티티를 "처리"할 수있는 여러 가지 방법이 있습니다. 확장 (JPA (2.0 이상) 사양으로 모든 엔티티에 공개 또는 보호 된 기본 생성자가 있어야하는 이유), 바이트 코드 삽입 조작 (EclipseLink에서이 직조라고 함) 등이 있습니다. EclipseLink의 경우 가장 효율적인 (가장 빠른 등) 직조입니다. 내 생각에는 확실하지 않지만, EclipseLink가 Weaved 모드에서만 지원하는 몇 가지 기능이 있습니다 (예 : 2 차 레벨 캐시). ... "는 un-managed 상태에 있으며 정확히 가져온 유형과 관련이 없습니다. – esej

+1

이제 나는이 문제를 이해한다고 생각합니다. 분리 된 객체는 JPA 제공자의 범위를 완전히 벗어나기 때문에 클라이언트가 포괄적으로 수동으로 관리해야합니다 (독립 실행 형 클라이언트를 사용하는 3 단계 솔루션의 경우). 많은 감사합니다 esej! – salocinx