Hibernate:更新对象的首选方法是什么?

时间:2015-05-07 17:39:34

标签: java spring hibernate

我们有一个装饰为@Transactional的方法,我们从数据库中获取对象,然后我们通过调用一些setter方法来改变对象的状态。这是一个附加实体,因此当执行此方法时,对实体的所有更改都将提交回数据库。

为什么我们应该显式调用update / save / merge / SaveOrUpdate?根据我的理解,如果它是一个附加实体,我们可以在不调用这些方法的情况下生活,我想知道我在这里缺少什么。

让我重新解释一下我的问题。通过不调用这些方法来更新附加实体,我是否会失去任何东西?看起来显式调用这些方法(update / save / merge / SaveOrUpdate)只是一种实用的做法。

2 个答案:

答案 0 :(得分:0)

执行此操作时,您会丢失文档。 大多数开发人员不了解这种行为,因此他们不期望它。通常,您应该在服务层中使用save / create方法来处理此实体的所有保存操作。这样可以在以后需要在保存时执行某些操作时更轻松地进行重构。 在整个操作中使用隐式保存时,请考虑执行此类操作的情况。您几乎有100%的机会忘记在至少一个位置添加其他代码。

答案 1 :(得分:0)

由于Hibernate背后的事务写入,所有脏的实体将在封闭事务结束时检测并刷新,就在提交之前。因此,在您处理托管(或附加)实体的情况下,它应该没问题。 但是,当从具有分离参数的另一个层调用该方法时(比如从Web层调用服务),Hibernate尚不知道这些实体,因此在事务结束时不会刷新,并且您肯定在此处丢失一些修改。因此,为了安全起见,在方法结束时需要调用save()/ merge(),以确保无论如何从其他层使用该方法都不会遗漏任何修改。