如何强制Hibernate在数据库某个实体发生更改时不将更改传播到数据库
Hibernate在很多方面都非常有用。但一件小事却没有引起人们的注意。我想提供一种在“管理面板”中修改数据库条目的方法。更具体地说,我希望有一个能够修改产品、其属性、图像、价格等的视图。因此,我通过session.get(product.class,id)加载要修改的产品的编辑视图。然后我处理它的属性、修改名称、设置价格、加载图像以及做任何我想做的事情。但最后,用户必须决定是保存更改还是放弃更改。保存部分是easy-call session.save,在服务层使用事务进行保存,但丢弃似乎是一个更难的问题,因为任何后续的会话刷新都会将产品中取消的更改传播到数据库 所以,我的问题是如何设立这样一个计划。这件事的最佳赌注是什么?我个人认为有以下解决办法:如何强制Hibernate在数据库某个实体发生更改时不将更改传播到数据库,hibernate,Hibernate,Hibernate在很多方面都非常有用。但一件小事却没有引起人们的注意。我想提供一种在“管理面板”中修改数据库条目的方法。更具体地说,我希望有一个能够修改产品、其属性、图像、价格等的视图。因此,我通过session.get(product.class,id)加载要修改的产品的编辑视图。然后我处理它的属性、修改名称、设置价格、加载图像以及做任何我想做的事情。但最后,用户必须决定是保存更改还是放弃更改。保存部分是easy-call session.save,在服务层使用事务进行保存,但丢弃似乎是一个
实际上,由于对hibernate持久性生命周期的误解,我把hibernate的基本功能搞砸了 因此,采用的一种典型方法是拆分(1)通过调用
dao.load(key)
方法加载实体,并通过关闭相关会话(为用户提供处理时间)将其与会话分离,(2)由用户在表示层中修改分离的实体,以及(3)稍后,将分离的对象重新附加到新会话,使其再次持久化,如有必要,可通过将其合并,调用dao.merge(object)
。当然,可以使用DTO来避免干扰不同的程序层
另一种明智的方法是在一个会话或事务中处理持久对象,在这种情况下,取消更改可以通过从会话中退出对象,session.execute()
,或者回滚整个事务,transaction.rollback()
如果像我这样的人遇到这样的误解,我的参考列表将是:
4.回滚事务。是否使用有状态或无状态服务器端技术?或者你甚至在谈论一个富有的客户?