Hibernate.initialize(...)出现问题,但出现LazyInitializationException,但调试时一切正常

时间:2018-09-20 08:05:09

标签: java hibernate debugging lazy-initialization

我正在向MS SQL加载250万个复杂对象。 由于性能原因,我在内存中使用了某种缓存。 在此过程中,我致电Hibernate.initialize(...) 使用默认的JVM设置应用程序总是在同一位置失败(每次同一记录失败)。

我有三个Set<>,我打了三次Hibernate.initialize(...) A部分) 总是Set<>的第二秒未正确初始化。

  • 当我在初始化之前设置断点并检查代码后, 一切都很好(没有问题发生/没有异常发生)
  • 当我在LazyInitializationException之后设置断点时 然后问题总是会发生。
  • 当我测试记录的id并在初始化后调用toString()时 那么一切都很好(没有问题发生/没有异常发生)- B部分

代码如下:

 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. 如何调试这种 有问题吗?

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

我发现了解决方法(以避免更改休眠配置等)-使用时:

    ((SomeParentObject)obj.getField()).getSetA().size();
    ((SomeParentObject)obj.getField()).getSetB().size();
    ((SomeParentObject)obj.getField()).getSetC().size();

代替Hibernate.initialize(...)可以正常工作。