【问题标题】:Hibernate.initialize exception - Cutting dependency chainHibernate.initialize 异常 - 切割依赖链
【发布时间】:2015-12-14 15:40:23
【问题描述】:

我有一个 A 类,它有一个 B 类的对象,它有一个 C 类的对象。我想从A 类的对象中获取B 类的对象,而不在b 中获取C 类的对象。 (我有,并希望保持这种方式,延迟加载的所有内容)

我在做:

Hibernate.initialize(a.getObjectOfClassB());

但是得到异常。有什么办法可以做我想做的事吗?切断休眠初始化链?

提前致谢!

【问题讨论】:

  • 您是否要求获取既不与 A 也不与 C 关联的 List
  • 不,我要求获取我的 A 类对象所具有的 List,而不是从数据库中获取 List 中的每个对象所具有的 List

标签: java json spring hibernate


【解决方案1】:

因此您的实体结构似乎映射如下:

 public class EntityA {
   @OneToMany(mappedBy = "a") 
   private List<EntityB> bList;
 }

 public class EntityB {
   @ManyToOne
   private EntityA a;
   @OneToMany(mappedBy = "b")
   private List<EntityC> cList; 
 }

 public class EntityC {
   @ManyToOne
   private EntityB b;
 }

因此,您有一个特定的 EntityA 想要获取它的关联 EntityB 实例。您可以在查询时或作为初始化后步骤获取该列表。

这里要注意的重要一点是,A - B - C 之间的映射使用@OneToMany,默认情况下会延迟获取。

在查询时执行此操作:

SELECT a
  FROM EntityA a
  JOIN FETCH EntityB b
 WHERE a.id = :entityAId

返回的EntityA 已经为您加载了List&lt;EntityB&gt;,您无需执行任何其他操作。

在您获取单个 EntityA 实例后,将此作为初始化后的步骤。

Hibernate.initialize(entityA.getBList());

or

entityA.getBList().size();

【讨论】:

  • 正如我在帖子中解释的那样,这正是我正在做的事情,但问题是,正如我在帖子中提到的那样,由于 B 类的每个对象的 List,此解决方案会引发异常并且不工作
  • 更新你的帖子,然后我可以相应地调整我的答案。我怀疑你的会话结束后你可能正在做initialize :)。
  • 不,这不是问题所在。问题是,当您进行初始化时,如果您渴望并且如果您懒惰,它会将所有对象都带入对象 b 中,这就是我所拥有和想要的,它会引发异常。例外情况如下: HTTP 状态 500 - 无法写入 JSON:无法初始化代理 - 无会话(通过引用链:ar.com.anovo.business.A["b"]->ar.com.anovo.business .B_$$_jvst767_1e["c"]->ar.com.anovo.business.C_$$_jvst767_6["code"]);如果我这样做: Hibernate.initialize(a.getB().getC());
  • 如果我这样做:Hibernate.initialize(a.getB().getC());它有效,但问题是在这种情况下,我只想要对象 B 而不从数据库中获取 c。
猜你喜欢
  • 2021-03-31
  • 1970-01-01
  • 2013-05-25
  • 2018-12-07
  • 1970-01-01
  • 2020-04-21
  • 2013-01-12
  • 2018-12-19
  • 2021-04-08
相关资源
最近更新 更多