数据在没有保存的情况下保存在db中(Hibernate)

时间:2013-01-02 10:00:24

标签: spring hibernate

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

3 个答案:

答案 0 :(得分:2)

如果您正在修改已与Hibernate会话关联的对象,则将保存所有修改。查看manual

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

  1. 从数据库加载对象
  2. 通过添加或删除值修改对象
  3. 即使您不使用save()方法,也会保存修改。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

一旦从数据库加载数据,它就会变得持久,如果在关闭会话之前更新了数据,则会对其进行任何更改。如果您不希望使用加载后所做的更改更新数据库中的数据,请仅在关闭会话后进行更改。然后,如果要再次保留数据,请再打开一个会话并调用save()或persist()。

编辑: 1)确保禁用缓存以确保不同会话之间没有缓存。

<property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>

2)按照以下步骤操作:

i)开始会话 - &gt;开始交易 - &gt;从两个表中获取数据 - &gt;关闭交易 - &gt;关闭会议。

ii)创建第3个表的对象 - &gt;做任何你想要的事情,比如从前两个表中添加数据。

iii)开始新会话 - &gt;开始新的交易 - &gt;使用session.save() - &gt;保存第3个表的对象关闭交易 - &gt;关闭会议。

在完成步骤(i)之后,table1和table2中的对象不再是“持久的”,并且是“分离的”。如果你不在步骤(iii)中执行session.save(),那么table3的对象将不会被保存,因为它不再处理持久对象。

这是我对持久性和分离对象的理解。如果它不起作用,请回复。我会将其编码并找到解决方案。

还有一个建议,请考虑使用session.persist()而不是session.save()。 如果您想了解它们之间的区别,可以使用以下链接:What's the advantage of persist() vs save() in Hibernate?

祝你好运!