我正在向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
在使用此方法后发生。
答案 0 :(得分:1)
您可能将Set <>的获取类型设置为Lazy,并且在调用它时,它们可能不在同一事务中。
因此,会导致此问题,但是在调试时它将正常进行。 尝试将获取类型设置为EAGER。
答案 1 :(得分:0)
我发现了解决方法(以避免更改休眠配置等)-使用时:
((SomeParentObject)obj.getField()).getSetA().size(); ((SomeParentObject)obj.getField()).getSetB().size(); ((SomeParentObject)obj.getField()).getSetC().size();
代替Hibernate.initialize(...)
可以正常工作。