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

如何强制Hibernate在数据库某个实体发生更改时不将更改传播到数据库,hibernate,Hibernate,Hibernate在很多方面都非常有用。但一件小事却没有引起人们的注意。我想提供一种在“管理面板”中修改数据库条目的方法。更具体地说,我希望有一个能够修改产品、其属性、图像、价格等的视图。因此,我通过session.get(product.class,id)加载要修改的产品的编辑视图。然后我处理它的属性、修改名称、设置价格、加载图像以及做任何我想做的事情。但最后,用户必须决定是保存更改还是放弃更改。保存部分是easy-call session.save,在服务层使用事务进行保存,但丢弃似乎是一个

Hibernate在很多方面都非常有用。但一件小事却没有引起人们的注意。我想提供一种在“管理面板”中修改数据库条目的方法。更具体地说,我希望有一个能够修改产品、其属性、图像、价格等的视图。因此,我通过session.get(product.class,id)加载要修改的产品的编辑视图。然后我处理它的属性、修改名称、设置价格、加载图像以及做任何我想做的事情。但最后,用户必须决定是保存更改还是放弃更改。保存部分是easy-call session.save,在服务层使用事务进行保存,但丢弃似乎是一个更难的问题,因为任何后续的会话刷新都会将产品中取消的更改传播到数据库

所以,我的问题是如何设立这样一个计划。这件事的最佳赌注是什么?我个人认为有以下解决办法:

  • 使用级联或
  • 使用一些复制副本/DTO并在保存操作或
  • 处理客户端上的所有更改,然后在保存时重新填充hibernate实体

  • 实际上,由于对hibernate持久性生命周期的误解,我把hibernate的基本功能搞砸了

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

    另一种明智的方法是在一个会话或事务中处理持久对象,在这种情况下,取消更改可以通过从会话中退出对象,
    session.execute()
    ,或者回滚整个事务,
    transaction.rollback()

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

  • )

  • 4.回滚事务。是否使用有状态或无状态服务器端技术?或者你甚至在谈论一个富有的客户?