Hibernate代理并不总是加载对象

时间:2012-05-11 00:50:15

标签: hibernate proxy

我有一个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);
    }
    

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

0 个答案:

没有答案