1

我有一个 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,就像上面的代码一样。

4

0 回答 0