首页 > 解决方案 > Hibernate.initialize(...) 的问题我得到了 LazyInitializationException 但是当我调试时一切都很好

问题描述

我正在将 250 万个复杂对象加载到 MS SQL。由于性能原因,我在内存中使用了某种缓存。在此过程中,我调用Hibernate.initialize(...) Using default JVM settings 应用程序总是在同一个地方失败(每次相同的记录失败)。

我有三个Set<>,我调用了 3 次Hibernate.initialize(...)A 部分)总是第二个Set<>没有正确初始化。

代码如下:

 private SomeObject getObject(int id) {
     SomeObject result = null;
     if(!cache.containsKey(id)) {
         SomeObject obj = context.getEntity(SomeObject.class, new ContextKey(id));

         // section A
         Hibernate.initialize(((SomeParentObject)obj.getField()).getSetA());
         Hibernate.initialize(((SomeParentObject)obj.getField()).getSetB());
         Hibernate.initialize(((SomeParentObject)obj.getField()).getSetC());

         // section B
         if(id == 1234) {
             ((SomeParentObject)obj.getField()).getSetB().toString();
         }

         cache.put(id, obj);
         result = obj;
     } else {
         result = cache.get(id);
     }
     return result;
 }

LazyInitializationException使用此方法后发生。

  1. 知道为什么会这样吗?
  2. 如何调试此类问题?

标签: javahibernatedebugginglazy-initialization

解决方案


您可能将 Set<> 的 fetch 类型设置为 Lazy,当您调用它时,它们可能不在同一个事务中。

因此,导致问题,但它会在您调试时分叉正常。尝试将获取类型设置为 EAGER。


推荐阅读