【问题标题】:How do you retrieve nested Sets?你如何检索嵌套集?
【发布时间】:2013-07-01 13:12:32
【问题描述】:

我是否缺少注释或者这是对休眠检索的限制?

实体:

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)

【问题讨论】:

  • 你用的是什么Hibernate版本?
  • 还请发布完整的堆栈跟踪(至少到您自己的代码为止)。
  • 对我来说无论如何它看起来像 Hibernate 错误。我搜索了他们的错误数据库,但在StatefulPersistenceContext.java:853 中没有 NPE。然后你可以提交一个错误。

标签: hibernate hibernate-mapping


【解决方案1】:

我遇到了一个与此非常相似的问题,即我有嵌套集合,并且每个集合的 hashCode 方法都显示在堆栈跟踪中。在 hashCode 方法中,它们相互引用,所以我在 hashcode 方法中删除了对每个对象的引用,我不再得到这个异常

【讨论】:

  • 我的班级也有 Set 并通过删除 HashCode 和 Equals 中的相互引用解决了相同的异常。
  • 你用什么代替了它?
  • 非常感谢,我有一个来自 lombok 的 @Data,它正在使用所有属性生成我的 hashCode 方法。我刚刚添加了@EqualsAndHashCode(exclude={"mySet"}),它成功了!
【解决方案2】:

我认为这不是完全的例外,对吧?

A 类的 setter 在哪里? A 类中的 b 集合是友好范围的,那么休眠将无法写入/注入它的值。 B 类中的 C 集合也是如此。

请在此处复制您的 hibernate.xml 和任何其他配置类。 hibernate/java 版本也很重要。

【讨论】:

  • 这是正确的例外。你可以假设 DAO 正常工作,并且拥有所有必要的 getter 和 setter 方法
  • 如果只是缺少合适的 setter,Hibernate 就不会抛出 NPE...
  • 我不知道你为什么这么说,但如果这是真的,它仍然是 Hibernate 的错误。 (除非 Hibernate 记录了这种行为——它可能没有)。
猜你喜欢
  • 2013-10-04
  • 1970-01-01
  • 2020-08-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多