休眠:刷新,逐出,复制和刷新

时间:2011-11-15 13:28:15

标签: java hibernate

我希望我知道这个列表中的每个项目究竟是什么,它是如何工作的,结果是什么,以及何时是正确的使用时间。

  1. 刷新
  2. 逐出
  3. 复制
  4. 冲洗
  5. 我甚至不知道每个人做了什么,但我不是很确定,所以我要求你的帮助,因为我真的很想理解它。

    我知道这是一个非常通用的问题,但我认为了解这一切真的很有用。

    感谢。

3 个答案:

答案 0 :(得分:49)

Hibernate Documentation 就是一个很好的例子。此blog post也会为您提供一些见解。我将在下面添加一些代码。

可以使用refresh()方法随时重新加载对象及其所有集合。当数据库触发器用于初始化对象的某些属性时,这很有用。

sess.save(cat);
sess.flush(); //force the SQL INSERT
sess.refresh(cat); //re-read the state (after the trigger executes)

有关更多示例,请参阅here

每当您将对象传递给save(), update() or saveOrUpdate()时,无论何时使用load(), get(), list(), iterate() or scroll()检索对象,该对象都会添加到会话的内部缓存中。

随后调用flush()时,该对象的状态将与数据库同步。如果您不希望发生此同步,或者您正在处理大量对象并需要有效管理内存,则evict()方法可用于从第一级缓存中删除对象及其集合

ScrollableResult cats = sess.createQuery("from Cat as cat").scroll(); //a huge result set
while ( cats.next() ) {
    Cat cat = (Cat) cats.get(0);
    doSomethingWithACat(cat);
    sess.evict(cat);     //  (if gives the compile time error then use it: sess.evict(cat.getClass());  
}

阅读here中的完整示例。

了解会话API here

答案 1 :(得分:11)

当您需要使用给定标识符保存实体时,

replicate()旨在用于代替save() / persist(),尽管该实体的标识符被配置为生成。

当某些实体(可能来自外部系统)具有预先存在的标识符时,它很有用,而同类型的其他实体需要生成其标识符。

但是,由于Hibernate中长期存在的错误(HHH-1459HHH-2716replicate()与某些类型的id生成器无法正常工作。此问题限制了replicate()的有用性,并且如果您的ID生成器策略受到影响而您无法更改它,则需要您实施令人不快的变通方法来模拟其行为。

答案 2 :(得分:4)

  • session.flush()刷新会话会强制Hibernate将Session的内存中状态与数据库同步。
  • session.evict()从会话缓存中分离对象。从会话中分离对象后,对象的任何更改都不会保留。
  • session.refresh()重新加载所有数据。
  • session.replicate()数据在不同模式下以不同Datastore复制。