在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();
}
答案 0 :(得分:1)
这称为“每个操作的会话反模式”,这里有一个quote from hibernate documentation可以更好地解释这个问题:
不要使用session-per-operation反模式:不要打开和 为单个线程中的每个简单数据库调用关闭一个Session 。的的 数据库事务也是如此。数据库调用 应用程序使用计划的序列;它们分为 原子工作单位。这也意味着每次都自动提交 单个SQL语句在此模式下在应用程序中无用 用于ad-hoc SQL控制台工作。 Hibernate禁用或预期 应用程序服务器立即禁用,自动提交模式。 数据库事务绝不是可选的。所有与...沟通 数据库必须发生在事务中。自动提交行为 应该避免读取数据,因为许多小事务都是如此 不太可能比一个明确定义的工作单元表现更好。该 后者也更易于维护和扩展。