我有一个 Hibernate 实体,我已经使用了一段时间,没有任何问题。我添加了一些代码来保护带有状态变量的方法(没有任何问题),在单独的事务中设置和清除状态。这给我在同一个类中访问本地私有变量的方法带来了问题。以前我可以直接访问这些变量,但现在我必须使用 get 方法来检索变量,否则我会得到这些变量的卸载值。
以下是有效的初始代码
- 开启交易
- 通过 Hibernate 获取对象
- 调用方法 (doTheWork())
- 引用私有变量
我看到变量的保存值,而不是初始化为 (1) 的值
public class Desktop { public static void main() { String tx = createTransaction(); Desktop desktop = getDesktop(tx); desktop.doTheWork(); commitTransaction(tx); } private static Desktop getDesktop(String tx) { return (Desktop)txFactory.getSession(tx).load(Desktop.class, 5L); } Long nextVersion = new Long(1); public Long getNextVersion() { return nextVersion; } public void doTheWork() { Log.info("Value of nextVersion is " + nextVersion); }
}
下面是修改后的代码
- 打开事务并获取对象
- 调用方法
- 在单独的事务中设置状态变量
- 打开另一个事务并在新事务中获取此对象的副本
- 调用(本质上)相同的方法(doTheWorkImpl())
现在我看到了变量 (1) 的初始化值,而不是持久化的值。
公共课桌面
public static void main() { String tx = createTransaction(); // Hibernate transaction Desktop desktop = getDesktop(tx); // Fetch object using Hibernate desktop.doTheWork(); commitTransaction(tx); }
长 nextVersion = new Long(1);
public Long getNextVersion() { return nextVersion; } private void doTheWork() { String tx = createTransaction(); setState(State.BUSY); commitTransaction(tx); tx = createTransaction(); Desktop desktop = getDesktop(tx); desktop.doTheWorkImpl(); commitTransaction(tx); tx = createTransaction(); setState(State.NORMAL); commitTransaction(tx); } private void doTheWorkImpl() { Log.info("Value of nextVersion is " + nextVersion); }
}
如果我更改对变量的直接引用以调用 getNextVersion(),我会看到正确的值。
我知道 Hibernate 使用代理,但我不明白为什么这段代码以前有效,现在我需要强制加载代理。我们有很多基本相同的 Hibernate 对象(通过 Hibernate 加载后直接引用变量),所以我想了解我在这里介绍的会改变模式的内容。
我在这里看到一个答案,建议使用 session.get() 而不是 session.load(),但我们一直使用 load,就像上面的代码一样。