2013-04-27 44 views
2

我有3個實體命名,紀律DisciplineMembershipDisciplineManagement休眠LazyInitializing悖論

一個紀律有很多DisciplineMemberships
一個紀律有很多DisciplineManagements
一個DisciplineManagem耳鼻喉科有一個與DisciplineMembership

紀委相關HBM文件的相關部分一對一的關係是這樣的:

Discipline.hbm

<class name="Discipline" table="DISCIPLINES"> 
    <id name="id" type="java.lang.Long"> 
     <generator class="increment" /> 
    </id> 

    <set name="memberships" inverse="false" cascade="all-delete-orphan" > 
     <key column="disciplineId" not-null="true" /> 
     <one-to-many class="DisciplineMembership" /> 
    </set> 

    <set name="managements" inverse="false" cascade="all-delete-orphan"> 
     <key column="disciplineId" not-null="true" /> 
     <one-to-many class="DisciplineManagement" /> 
    </set> 

</class> 

在一個名爲功能A,我想遍歷DisciplineMemberships和DisciplineManagements of a Discipline:

public void A(){ 
    Discipline discipline = this.getObject(); 
    for(DisciplineMembership mem: discipline.getMembers()){ 
     System.out.print(mem); 
    } 
    for(DisciplineManagement man: discipline.getManagements()){ 
     System.out.print(man); 
    } 
} 

第一語句運行正常,但在第二個,我趕上LazyInitializationException異常如下:

13-04-27 13:54:26,115 [hibernate.LazyInitializationException (<init>:42)] ERROR: failed to lazily initialize a collection of role: Discipline.managements, no session or session was closed 
org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: Discipline.managements, no session or session was closed 
    at org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:383) 
    at org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationExceptionIfNotConnected(AbstractPersistentCollection.java:375) 
    at org.hibernate.collection.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:368) 
    at org.hibernate.collection.AbstractPersistentCollection.read(AbstractPersistentCollection.java:111) 
    at org.hibernate.collection.PersistentSet.iterator(PersistentSet.java:186) 
    at ObjectManagementPart_Edit.A(ObjectManagementPart_Edit.java:6) 

我很困惑如何可能呢?紀律會議是開放的,我可以迭代其成員資格,但是當我想通過其管理迭代時,hibernate不能懶惰初始化它們。

我該怎麼辦?

更新: 我試圖用狀態,Hibernate.initialize()函數,所以函數A現在是這樣的:

public void A(){ 
    Discipline discipline = this.getObject(); 
    Hibernate.initialize(discipline.getMembeships()); 
    for(DisciplineMembership mem: discipline.getMemberships()){ 
     System.out.print(mem); 
    } 
    Hibernate.initialize(discipline.getManagements()); 
    for(DisciplineManagement man: discipline.getManagements()){ 
     System.out.print(man); 
    } 
} 

Membeships第一使用狀態,Hibernate.initialize()的具有沒問題,但 在管理層秒使用我得到這個異常:

org.hibernate.HibernateException: collection is not associated with any session 
    at org.hibernate.collection.AbstractPersistentCollection.forceInitialization(AbstractPersistentCollection.java:474) 
    at org.hibernate.Hibernate.initialize(Hibernate.java:431) 
    at discipline.ObjectManagementPart_Edit.A(ObjectManagementPart_Edit.java:6) 

現在我更困惑了:/

+0

你應該怎麼做?不要懶惰,渴望。 – 2013-04-27 10:17:13

+1

編號:D 我不想清除問題, – Ehsan 2013-04-27 10:19:41

+0

我有一個想法,如果你把一些註釋或標誌不去集合或只是返回空集合,所以你不需要自然地初始化它當你穿過樹。 – 2013-04-27 10:24:20

回答

1

只是因爲你可以迭代成員身份不會告訴你,它實際上只是懶得提取他們。如果之前加載的會員資格(會話開放時),他們會保留。如果列表已經初始化,Hibernate.initialize(...)將不會執行任何操作。

要獲得更準確的答案,您需要描述會話管理策略。 hibernate的大多數問題都源於會話管理不好的事實。