Hibernate:更新不同Session中的对象?

时间:2013-05-09 16:06:47

标签: java hibernate

在Hibernate中更新一个不同于最初创建的会话中的对象是不是很糟糕?我认为答案是肯定的,因为Hibernate会话(默认情况下)将缓存其会话对象,并在会话关闭或对象被驱逐时释放它们。因此,在一个Session中创建一个Object然后在另一个Session中更新它(当Object在第一个Session中仍处于'活着状态'时)对我来说似乎是不好的做法。任何人都可以解释为什么会有什么后果?例如,请考虑此代码(为清楚起见,缩短了代码):

private void updateRequest(Request req){ //Request came from another Hibernate Session
        MyDAO myDB = null;
        myDB = new MyDAO();
            Transaction trans = myDB.getSession().beginTransaction();
            myDB.getSession().update(object);
            trans.commit();
    }

1 个答案:

答案 0 :(得分:1)

这称为“每个操作的会话反模式”,这里有一个quote from hibernate documentation可以更好地解释这个问题:

  

不要使用session-per-operation反模式:不要打开和   为单个线程中的每个简单数据库调用关闭一个Session 。的的   数据库事务也是如此。数据库调用   应用程序使用计划的序列;它们分为   原子工作单位。这也意味着每次都自动提交   单个SQL语句在此模式下在应用程序中无用   用于ad-hoc SQL控制台工作。 Hibernate禁用或预期   应用程序服务器立即禁用,自动提交模式。   数据库事务绝不是可选的。所有与...沟通   数据库必须发生在事务中。自动提交行为   应该避免读取数据,因为许多小事务都是如此   不太可能比一个明确定义的工作单元表现更好。该   后者也更易于维护和扩展。