2

在 Hibernate 中更新与最初创建对象不同的会话中的对象是不好的做法吗?我认为答案是肯定的,因为 Hibernate Session(默认情况下)会缓存其 Session 对象,并在 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();
    }
4

1 回答 1

1

这称为“每个操作的会话反模式”,这是来自休眠文档的引用,可以更好地解释该问题:

不要使用 session-per-operation 反模式:不要在单个线程中为每个简单的数据库调用打开和关闭 Session数据库事务也是如此。应用程序中的数据库调用是使用计划的顺序进行的;它们被分组为原子工作单元。这也意味着在应用程序中每个 SQL 语句之后的自动提交是无用的,因为这种模式旨在用于临时 SQL 控制台工作。Hibernate 禁用或期望应用程序服务器立即禁用自动提交模式。数据库事务永远不是可选的。与数据库的所有通信都必须发生在事务中。应该避免读取数据的自动提交行为,因为许多小事务不太可能比一个明确定义的工作单元执行得更好。后者也更具可维护性和可扩展性。

于 2013-05-09T16:35:10.630 回答