我会选择这个设计:
在所有网络应用会话期间创建一个对象并使其保持活动状态。
我需要将其状态与数据库状态同步。
我想要达到的目标是:
在我的数据库操作之间,即我持久保存到数据库的修改
有人故意破坏表格行,然后在下次保存到数据库
所有这些变化都会被对象状态覆盖,它总是包含有效数据。
您建议我使用哪些Hibernate方法来保存数据库中的修改?
saveOrUpdate()是一种可能的解决方案,但也许有更好的方法吗?
再次,我重复它的样子。首先,我创建一个没有集合的对象。坚持下去(save())。
然后,用户向我们提供了其他数据。在serviceLayer中,我们再次修改内存中的对象(比如用集合填充它),然后再次保留它。
因此,下一步的每个serviceLayer操作都必须保证数据库包含我们在内存中的此对象的确切持久副本。如果数据库中的数据不同,则必须将对象(保持在内存中)状态重写为OVERRIDDEN。
您推荐哪些会话操作?
答案 0 :(得分:2)
FWIW saveOrUpdate()
看起来是最好的选择:
saveOrUpdate()方法实际上比
update()
更有用,save()
或lock()
:在复杂的对话中,您不知道该项目是否在 分离状态或它是否是新的和瞬态的并且必须保存。自动 当你saveOrUpdate()
提供的状态检测变得更有用 不仅可以处理单个实例,还可以重新连接或保留网络 连接对象并应用级联选项。
但是对于您的情况,如果您确定实体是在分离状态下修改的,并且/或者不介意偶尔使用不必要的UPDATE命中DB,那么update()
可能是最安全的选择:
update()
操作 在Session上将分离的对象重新附加到持久化上下文和 安排SQLUPDATE
。 Hibernate必须假设客户端修改了 对象虽然被分离了。 [...]持久性上下文自动刷新 当会话中的第二个事务提交时,任何 对曾经分离的和现在持久的对象的修改是同步的 与数据库。
来自Java Persistence with Hibernate的引言,第11.2.2章。