Hibernate对于少数事情非常有用。但是一件微不足道的事情仍然不在注意力集中。我想提供一种在“管理面板”中修改数据库条目的方法。更具体地说,我希望有一个能够修改声明,产品,其属性,图像,价格等的视图。因此,我加载了要修改的产品的编辑视图,例如,会话.get(Product.class,id)。然后我使用它的属性,修改名称,设置价格,加载图像以及做我想做的任何事情。但最后用户必须决定是保存更改还是丢弃更改。保存部分很容易 - 在服务层中调用session.save和事务处理,但丢弃似乎是一个更难的问题,因为任何后续会话刷新都会将产品中已取消的更改传播到数据库。
所以,我的问题是如何设置这样的方案。这个最好的选择是什么?我个人看到以下解决方案:
答案 0 :(得分:3)
实际上我搞砸了基本的hibernate功能,这种功能源于对hibernate持久性生命周期的误解。
因此,采用的一种典型方法是拆分(1)通过调用dao.load(key)
方法加载实体并通过关闭关联会话将其从会话中分离,从而为用户提供处理它的时间,(2)用户修改表示层中的分离实体,以及(3)稍后将分离的对象重新附加到新会话,使其再次持久化,并且如果需要,通过合并它,调用dao.merge(object)
。当然,可以使用DTO来干扰不同的程序层。
另一种合理的方法包括在一个会话或事务中处理持久对象,在这种情况下,可以通过从会话中驱逐对象session.evict()
或者通过回滚来简单地取消更改完成交易transaction.rollback()
。
如果像我这样的人遇到这样的误解,我的参考名单将是: