java - Hibernate.initialize(...) 的问题我得到了 LazyInitializationException 但是当我调试时一切都很好
问题描述
我正在将 250 万个复杂对象加载到 MS SQL。由于性能原因,我在内存中使用了某种缓存。在此过程中,我调用Hibernate.initialize(...)
Using default JVM settings 应用程序总是在同一个地方失败(每次相同的记录失败)。
我有三个Set<>
,我调用了 3 次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
使用此方法后发生。
- 知道为什么会这样吗?
- 如何调试此类问题?
解决方案
您可能将 Set<> 的 fetch 类型设置为 Lazy,当您调用它时,它们可能不在同一个事务中。
因此,导致问题,但它会在您调试时分叉正常。尝试将获取类型设置为 EAGER。
推荐阅读
- node.js - 安装聚合物元件时出现错误代码 134
- android - Android应用程序在后台运行时可以检测到方向变化吗?
- powershell - 在 powershell 脚本中显示进度条
- neo4j - 如何在 Neo4j 中对十六进制进行按位运算
- pandas - 为什么我在有或没有列选择的情况下使用 pandas groupby() 获得不同的组大小数?
- group-by - “错误:n() 只能在数据上下文中调用”
- javascript - 如何在使用节点 js 调用 API 时获得准确的响应状态码?
- android - 如何仅使用 simpledateformat 更改包含月份和年份的字符串
- html - 如何修复页面以在谷歌缓存中正确显示
- android - 我正在尝试让代码工作以解码并显示原始 H264 tcp/ip 视频流。有人可以诊断出什么问题吗?