【发布时间】:2012-12-16 16:47:39
【问题描述】:
我是 hibernate 的新手,当我添加一个元素并取消它时,我看到数据保存在 db 中。在我的代码中,我没有调用 save 方法来保存它。
【问题讨论】:
-
我在字段中存在多对多关系。
我正在加载来自 db 的对象使用负载并尝试修改对象
我是 hibernate 的新手,当我添加一个元素并取消它时,我看到数据保存在 db 中。在我的代码中,我没有调用 save 方法来保存它。
【问题讨论】:
一旦您从数据库加载数据,它就会变成持久的,并且对它所做的任何更改都会被更新,如果在会话关闭之前更新的话。如果您不希望数据库中的数据在加载后使用所做的更改进行更新,请仅在关闭会话后进行更改。然后,如果您想再次持久化数据,请再打开一个会话并调用 save() 或 persist()。
编辑: 1) 确保缓存被禁用,以确保不同会话之间没有缓存。
<property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>
2) 遵循以下步骤:
i) 开始会话 --> 开始事务 --> 从两个表中获取数据 --> 关闭事务 --> 关闭会话。
ii) 创建第三个表的对象--> 用它做任何你想做的事情,比如从前两个表中添加数据。
iii) 开始新会话 --> 开始新事务 --> 使用 session.save() 保存第三个表的对象 --> 关闭事务 --> 关闭会话。
步骤 (i) 完成后,table1 和 table2 中的对象不再“持久”,而是“分离”。如果在步骤 (iii) 中不执行 session.save(),table3 的对象将不会被保存,因为它不再处理持久对象。
这是我对持久化和分离对象的理解。如果不起作用,请回复。我会编写代码并找到解决方案。
还有一个建议,请考虑使用 session.persist() 而不是 session.save()。 如果你想了解它们的区别,这是链接:What's the advantage of persist() vs save() in Hibernate?
祝你好运!
【讨论】:
如果您正在修改已与 Hibernate 会话关联的对象,您的所有修改都将被保存。检查manual。
例如,如果您执行以下操作:
save() 方法,修改也会被保存。【讨论】:
您的休眠配置中似乎有AutoFlash 和/或AutoCommit 参数On。尝试禁用它们。
【讨论】:
<property name="hibernate.connection.autocommit">false</property> 。您也可以打开一个事务(这是最好的方法)然后调用rollback 以避免将数据保存到数据库中