我有一个用@Transactional 注释的方法。我从 Oracle DB 检索一个对象,更改一个字段,然后从该方法返回。我忘记保存对象,但发现数据库无论如何都会更新。
应用上下文
<tx:annotation-driven />
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
我的方法
@Transactional
public void myMethod(long id) {
MyObject myObj = dao.getMstAttributeById(id);
myObj.setName("new name");
//dao.update(myObj);
}
我的问题是为什么 MyObject 会持久保存到数据库中?
因为 hibernate 会自动检测对执着的实体并相应地更新数据库。此行为记录在第11章Hibernate 参考手册。相关部分内容如下:
Hibernate 定义并支持以下对象状态:
-
短暂的- 如果一个对象刚刚使用 new 运算符实例化,并且它不与 Hibernate Session 关联,则该对象是瞬态的。它在数据库中没有持久表示,也没有分配标识符值。如果应用程序不再持有引用,则瞬时实例将被垃圾收集器销毁。使用 Hibernate Session 使对象持久化(并让 Hibernate 处理此转换需要执行的 SQL 语句)。
-
执着的- 持久实例在数据库中具有表示形式和标识符值。它可能刚刚被保存或加载,但是,根据定义,它位于会话范围内。 Hibernate 将检测对持久状态对象所做的任何更改,并在工作单元完成时将状态与数据库同步。当对象应该成为瞬态时,开发人员不会执行手动 UPDATE 语句或 DELETE 语句。
-
Detached- 分离实例是一个已持久化的对象,但其会话已关闭。当然,对该对象的引用仍然有效,并且分离的实例甚至可能在此状态下被修改。分离的实例可以在稍后的时间点重新附加到新的会话,使其(以及所有修改)再次持久化。此功能为需要用户思考时间的长时间运行的工作单元提供了编程模型。我们将它们称为应用程序事务,即从用户角度来看的工作单元。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)