2010-04-18 55 views
1

我要去这个设计:休眠覆盖数据库修改与脱离对象状态

创建一个对象,并保持它在所有的Web应用程序会话期间活着。

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

我想实现的是:

如果我的数据库操作,那就是修改,我坚持到一个数据库

有人故意败坏表行,然后在接下来的储蓄到数据库之间

所有这些更改都将与对象状态一起被覆盖,它总是包含有效数据。

什么Hibernate方法,你推荐我用来坚持在数据库中的修改?

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

再次重申它的外观。首先我创建一个没有集合的对象。坚持下去(save())。

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

因此,下一步的每个serviceLayer操作都必须简单地保证数据库包含我们在内存中拥有的该对象的确切持久副本。如果数据库中的数据不同,它必须与对象(保存在内存中)的状态一起被超过。

你推荐什么会话操作?

回答

2

FWIW saveOrUpdate()貌似整体的最佳选择:

的saveOrUpdate()方法的方法是在实践中比update()更加有用, save(),或lock():在复杂的对话,你不知道,如果该项目在 处于分离状态,或者它是新的并且是瞬态的并且必须保存。当您的 不仅适用于单个实例,还希望重新挂接或保留已连接对象的网络 并应用级联选项时,saveOrUpdate()提供的自动 状态检测功能变得更加有用。

然而,对于你的情况,如果你是保证实体在游离状态修改,和/或不介意偶尔击中不必要的更新DB,也许update()是最安全的选择:

会话中的update()操作 将分离的对象重新连接到持久性上下文,并且计划SQL UPDATE。休眠必须假定客户端在分离时修改了 对象。 [...]当对话中的第二个事务提交时,将自动刷新持久性上下文 ,并且对曾经分离并且现在持久化的对象的任何修改都会与数据库同步 。

来自Java Persistence with Hibernate的引述,章节11.2.2。