【问题标题】:Hibernate: evict() a persistent object while storing its changesHibernate:evict() 一个持久对象,同时存储其更改
【发布时间】:2011-10-13 18:14:30
【问题描述】:

我有一个使用 session.save(object) 获得的持久休眠对象

从那以后我改变了它。

我想执行session.evict(object) 来节省内存,因为我已经完成了对象。

evict()here 的文档指出,对对象的更改将不会被保留。换句话说 - evict 会导致我丢失我对对象所做的更改。

我可以致电session.flush(),但这会刷新所有更改。

如何在驱逐之前持久化对单个持久对象所做的更改?

【问题讨论】:

  • Hibernate 不是可以随时保存对持久对象的更改吗?我的意思是,关于你反对使用 flush() 的论点,也许你不想保存的更改已经保存了......
  • @SJuan76 我可以在这个假设上押注我的生产代码吗? “随时”让我担心——它们可以随时保存,或者至少在session.flush()。但是如果我在两者之间驱逐......驱逐者会在对象被驱逐之前刷新它吗?
  • 为什么不使用无状态会话开始

标签: java hibernate session memory-management


【解决方案1】:

致电session.save(object)session.saveOrUpdate(object),如果需要,可以调用 evict。但是,您必须在执行此操作之前刷新会话。会话被设计为基于工作单元的接口,这是有充分理由的——如果没有这个特性,事务语义将是一场灾难。如果您需要刷新单个实体而不刷新属于同一会话的其他实体,则需要重新考虑您的工作单元。

【讨论】:

  • 我认为save() 方法仅用于将瞬态对象(不由 Hibernate 管理)转换为持久对象。而saveOrUpdate() 将适用于瞬态或分离的对象。然而,我的对象是持久的,它已经被 Hibernate 创建并保存了,但后来发生了变化。
  • 这是批量操作吗? IE。您要插入大量行吗?如果是这样,请参阅docs.jboss.org/hibernate/core/3.6/reference/en-US/html_single/…。如果不是,你为什么要这样做?
  • 是的,是批量操作。我正在将表更新到较新的版本,更改已修改的行,删除未使用的行,添加新行。我想您的建议仍然适用于此操作,谢谢!
  • 我接受这个答案作为澄清评论,尽管答案本身不适用于这种情况。
【解决方案2】:

执行session.evict(obj) 将从会话缓存中删除对象实例。因此,如果您是第一次保存对象,则必须通过 session.save(obj) 显式提交,然后才能将对象从缓存中逐出。在调用 evict 以从缓存中删除加载的对象之前,后续更新调用应遵循 session.saveOrUpdate(obj)session.update(obj)

这样做意味着当您需要缓存中的对象实例时,您必须显式调用session.load(obj)session.get(obj)

【讨论】:

  • 文档为什么这么说? save(Object):保持给定的 transient 实例,首先分配一个生成的标识符。 (或者如果使用分配的生成器,则使用标识符属性的当前值。)如果关联映射为 cascade="save-update",则此操作级联到关联实例。 --- 我已经有一个关联的标识符,因为对象之前已经是saved??
  • 对象在序列化之前是瞬态的。
  • 我的意思是——我很久以前就已经序列化了这个对象。从那以后,它已经改变了好几次。现在我想驱逐它。因此,由于它不再是瞬态的,save 应该不适用。
  • 你不需要 save(..) 在你的情况下,给出的例子是提供一个关于如何驱逐的公开清晰,在你的情况下你应该 update(..) 并调用 evict 删除根据需要从缓存中加载的对象。
  • Hibernate 文档非常混乱。它指出update 将重新附加以前分离的对象。但我的对象不是分离的,它是持久的。我是否应该提交一张票,要求更改 javadoc 以反映该功能的实际作用?
【解决方案3】:

你不能先通过类似的方式手动保存对象

session.saveOrUpdate(theObject);
session.evict(theObject);

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-15
  • 1970-01-01
  • 2014-08-06
  • 2010-11-20
  • 1970-01-01
相关资源
最近更新 更多