我有一个Hibernate实体,我已经使用了一段时间没有任何问题。我添加了一些代码来保护一个方法(没有任何问题)和一个状态变量,在一个单独的事务中设置和清除状态。这使我在访问同一类中的本地私有变量的方法中遇到了问题。以前我可以直接访问这些变量,但现在我必须使用get方法来检索变量,否则我得到这些变量的卸载值。
以下是有效的初始代码
我看到变量的保存值,而不是它初始化为的值(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);
}
}
以下是更改后的代码
现在我看到变量(1)的初始值而不是持久值。
公共类桌面
public static void main()
{
String tx = createTransaction(); // Hibernate transaction
Desktop desktop = getDesktop(tx); // Fetch object using Hibernate
desktop.doTheWork();
commitTransaction(tx);
}
Long 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对象的,所以我想了解我介绍这里将改变格局。
我在这里看到一个建议使用session.get()而不是session.load()的答案,但是我们总是使用load,就像上面的代码一样。