2013-07-03 69 views
7

是否有我缺少的註釋或者這是對hibernate檢索的限制?如何檢索嵌套集?

實體:

class A { 
    Long id; 
    Set<B> b; 

    @ManyToMany(fetch = FetchType.EAGER) 
    @JoinTable(name = "A_B", joinColumns = @JoinColumn(name = "A_ID"), inverseJoinColumns = @JoinColumn(name = "B_ID") 
    public Set<B> getBs() { 
     return b; 
    } 

} 

class B { 
    Long id; 
    Set<C> c; 

    @ManyToMany(fetch = FetchType.EAGER) 
    @JoinTable(name = "B_C", joinColumns = @JoinColumn(name = "B_ID"), inverseJoinColumns = @JoinColumn(name = "C_ID") 
    public Set<C> getCs() { 
     return C; 
    } 

} 

的DAO:

class ADaoImpl {  
    public A load(Long id) { 
     return new A((A) session.load(A.class, id); 
    } 
} 

當我嘗試加載A,我得到一個

Caused by: java.lang.NullPointerException 
at org.hibernate.engine.internal.StatefulPersistenceContext.getLoadedCollectionOwnerOrNull(StatefulPersistenceContext.java:853) 
+0

您使用的是何種Hibernate版本? – yair

+0

也請發佈完整的堆棧跟蹤(至少達到您自己的代碼)。 – yair

+0

無論如何,它看起來像Hibernate的bug。我在'StatefulPersistenceContext.java:853'中搜索了他們的缺陷數據庫,但沒有與NPE進行比較。然後你可以提交一個bug。 – yair

回答

1

我認爲這是不完整的例外吧?

A級二傳手在哪裏? A類中的b集合是友好的作用域,那麼hibernate將無法寫入/注入它的值。 B類中的C集合也是如此。

請將您的hibernate.xml和任何其他配置類複製到此處。休眠/ Java版本也很重要。

+0

這是正確的例外。並且你可以假設DAO正常工作,並且擁有所有必要的getter和setter方法 – stackoverflow

+0

如果它只是缺少一個合適的setter,Hibernate不會拋出NPE ... – yair

+0

我不知道你爲什麼說如果這是真的,它仍然是Hibernate的bug。 (除非Hibernate記錄了這種行爲 - 它可能不會)。 – yair

6

我有一個非常相似的問題是我有嵌套集,每個hashCode方法出現在堆棧跟蹤。在hashCode方法中,它們互相引用,所以我刪除了散列碼方法中每個對象的引用,並且我不再有這種例外

+0

There's也設置在我的課上,並通過在HashCode和Equals中刪除相互引用來解決相同的Exception。 – Junjie

+0

你用什麼替換它? –

+0

非常感謝你,我有一個來自lombok的@ Data,它使用所有屬性生成我的'hashCode'方法。我剛剛添加了@EqualsAndHashCode(exclude = {「mySet」})',它工作! – tehCivilian