2

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

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

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

1 回答 1

3

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

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

另一种也是明智的方法包括在一个会话或事务中处理持久对象,在这种情况下,可以通过从会话中逐出对象session.evict()或回滚整个事务来简单地取消更改transaction.rollback()

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

  1. 对象状态的休眠文档
  2. 关于持久性上下文的 Hibernate 文档
  3. 关于 slidreshare 的一个很好的休眠评论演示文稿
于 2012-12-16T11:43:54.973 回答