【问题标题】:data getting saved in db without save(Hibernate)数据在没有保存的情况下保存在数据库中(休眠)
【发布时间】:2012-12-16 16:47:39
【问题描述】:

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

【问题讨论】:

  • 我在字段中存在多对多关系。 我正在加载来自 db 的对象使用负载并尝试修改对象

标签: spring hibernate


【解决方案1】:

一旦您从数据库加载数据,它就会变成持久的,并且对它所做的任何更改都会被更新,如果在会话关闭之前更新的话。如果您不希望数据库中的数据在加载后使用所做的更改进行更新,请仅在关闭会话后进行更改。然后,如果您想再次持久化数据,请再打开一个会话并调用 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?

祝你好运!

【讨论】:

  • 我要做的是从两个表中获取数据并将其放入第三个表中,该表引用了这两个表。不调用 save 数据将保存在第三个表中。
  • 感谢您的回复。但我无法禁用缓存。
    请建议我另一种解决方案
  • 你的意思是缓存开启了吗?
【解决方案2】:

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

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

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

【讨论】:

  • 是的,你是对的,我正在从数据库加载对象并通过添加或删除值来修改对象。
  • 是的,我知道持久对象将被自动保存。但是如何在调用 save() 时保存它。表格之间也存在多对多关系。
【解决方案3】:

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

【讨论】:

  • 如果你使用 spring 创建你的休眠会话,你应该在你的休眠配置中添加如下属性:&lt;property name="hibernate.connection.autocommit"&gt;false&lt;/property&gt; 。您也可以打开一个事务(这是最好的方法)然后调用rollback 以避免将数据保存到数据库中
猜你喜欢
  • 2013-05-22
  • 2017-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-20
  • 2011-08-31
  • 1970-01-01
相关资源
最近更新 更多