如何强制Hibernate在更改其某个实体时不将更改传播到数据库

时间:2012-12-15 15:01:54

标签: hibernate

Hibernate对于少数事情非常有用。但是一件微不足道的事情仍然不在注意力集中。我想提供一种在“管理面板”中修改数据库条目的方法。更具体地说,我希望有一个能够修改声明,产品,其属性,图像,价格等的视图。因此,我加载了要修改的产品的编辑视图,例如,会话.get(Product.class,id)。然后我使用它的属性,修改名称,设置价格,加载图像以及做我想做的任何事情。但最后用户必须决定是保存更改还是丢弃更改。保存部分很容易 - 在服务层中调用session.save和事务处理,但丢弃似乎是一个更难的问题,因为任何后续会话刷新都会将产品中已取消的更改传播到数据库。

所以,我的问题是如何设置这样的方案。这个最好的选择是什么?我个人看到以下解决方案:

  1. 使用cascade或
  2. 调用session.evict()
  3. 使用一些复制的副本/ DTO并合并保存操作或
  4. 处理客户端上的所有更改,然后在保存时重新填充hibernate实体。

1 个答案:

答案 0 :(得分:3)

实际上我搞砸了基本的hibernate功能,这种功能源于对hibernate持久性生命周期的误解。

因此,采用的一种典型方法是拆分(1)通过调用dao.load(key)方法加载实体并通过关闭关联会话将其从会话中分离,从而为用户提供处理它的时间,(2)用户修改表示层中的分离实体,以及(3)稍后将分离的对象重新附加到新会话,使其再次持久化,并且如果需要,通过合并它,调用dao.merge(object)。当然,可以使用DTO来干扰不同的程序层。

另一种合理的方法包括在一个会话或事务中处理持久对象,在这种情况下,可以通过从会话中驱逐对象session.evict()或者通过回滚来简单地取消更改完成交易transaction.rollback()

如果像我这样的人遇到这样的误解,我的参考名单将是:

  1. Hibernate documentation on object states;
  2. Hibernate documentation on persistence contexts
  3. A good hibernate review presentation on slidreshare