Hibernate使用分离的对象状态覆盖数据库修改

时间:2010-04-18 16:49:44

标签: java hibernate spring web-applications

我会选择这个设计:

在所有网络应用会话期间创建一个对象并使其保持活动状态。

我需要将其状态与数据库状态同步。

我想要达到的目标是:

在我的数据库操作之间,即我持久保存到数据库的修改

有人故意破坏表格行,然后在下次保存到数据库

所有这些变化都会被对象状态覆盖,它总是包含有效数据。

您建议我使用哪些Hibernate方法来保存数据库中的修改?

saveOrUpdate()是一种可能的解决方案,但也许有更好的方法吗?

再次,我重复它的样子。首先,我创建一个没有集合的对象。坚持下去(save())。

然后,用户向我们提供了其他数据。在serviceLayer中,我们再次修改内存中的对象(比如用集合填充它),然后再次保留它。

因此,下一步的每个serviceLayer操作都必须保证数据库包含我们在内存中的此对象的确切持久副本。如果数据库中的数据不同,则必须将对象(保持在内存中)状态重写为OVERRIDDEN。

您推荐哪些会话操作?

1 个答案:

答案 0 :(得分:2)

FWIW saveOrUpdate()看起来是最好的选择:

  

saveOrUpdate()方法实际上比update()更有用,   save()lock():在复杂的对话中,您不知道该项目是否在   分离状态或它是否是新的和瞬态的并且必须保存。自动   当你saveOrUpdate()提供的状态检测变得更有用   不仅可以处理单个实例,还可以重新连接或保留网络   连接对象并应用级联选项。

但是对于您的情况,如果您确定实体是在分离状态下修改的,并且/或者不介意偶尔使用不必要的UPDATE命中DB,那么update()可能是最安全的选择:

  

update()操作   在Session上将分离的对象重新附加到持久化上下文和   安排SQL UPDATE。 Hibernate必须假设客户端修改了   对象虽然被分离了。 [...]持久性上下文自动刷新   当会话中的第二个事务提交时,任何   对曾经分离的和现在持久的对象的修改是同步的   与数据库。

来自Java Persistence with Hibernate的引言,第11.2.2章。