hibernate:刷新,执行,复制和刷新

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

  1. 刷新
  2. 赶出
  3. 复制
  4. 红晕

我甚至想知道每个人都做了什么,但我不是很确定,所以我要求你的帮助,因为我真的很想理解它。

我知道这是一个非常普遍的问题,但我认为真正有用的知道这一切。

谢谢。

Hibernate文档提供了很好的例子。 另外这个博客文章会给你一些见解。 我将从下面添加一些行。

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

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

在这里看到更多的例子。

每当你传递一个对象到save(), update() or saveOrUpdate() ,并且每当你用load(), get(), list(), iterate() or scroll()检索一个对象时,会话的内部caching。

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

 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()); } 

从这里阅读完整的例子。

在这里阅读有关会话API。

当您需要保存具有给定标识符的实体时,将使用replicate()而不是save() / persist() ,尽pipe所述实体的标识符被configuration为生成。

当一些实体(可能来自外部系统)具有预先存在的标识符时,这是有用的,而其他相同types的实体需要它们的标识符被生成。

但是,由于Hibernate( HHH-1459 , HHH-2716 )中的一个长期存在的问题,对于某些种类的id生成器, replicate()无法正常工作。 这个问题限制了replicate()有用性,并且如果你的id生成器策略受到影响并且你不能改变它,你需要实现令人不愉快的解决方法来模拟它的行为。

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