2013-07-03 70 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