3

我是休眠的新手,当我添加一个元素并取消它时,我看到数据保存在数据库中。在我的代码中,我没有调用 save 方法来保存它。

4

3 回答 3

2

如果您正在修改已与 Hibernate 会话关联的对象,您的所有修改都将被保存。检查手册

例如,如果您执行以下操作:

  1. 从数据库加载对象
  2. 通过添加或删除值来修改对象
  3. 即使您不使用该save()方法,修改也会被保存。
于 2013-01-02T10:35:25.913 回答
0

一旦你从数据库加载数据,它就会变成持久的,并且对它所做的任何更改都将被更新,如果它在会话关闭之前被更新的话。如果您不希望数据库中的数据在加载后使用所做的更改进行更新,请仅在关闭会话后进行更改。然后,如果您想再次持久化数据,请再打开一个会话并调用 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()。如果您想了解它们的区别,请点击以下链接:Hibernate 中persist() 与 save() 的优势是什么?

祝你好运!

于 2013-01-02T19:37:49.567 回答
0

似乎您的休眠配置中有AutoFlash和/或AutoCommit参数On。尝试禁用它们。

于 2013-01-02T10:24:03.527 回答