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

caa*_*os0 51 java hibernate

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

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

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

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

谢谢.

Man*_*uPK 50

Hibernate文档提供了很好的例证.此博客文章也将为您提供一些见解.我将从下面添加一些行.

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

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

有关更多示例,请参阅此处

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

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());  
}
Run Code Online (Sandbox Code Playgroud)

这里阅读完整的示例.

在这里阅读会话API .


axt*_*avt 11

replicate()尽管所述实体的标识符被配置为生成,但是当您需要使用给定标识符保存实体时,旨在代替save()/ persist().

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

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


Pre*_*raj 7

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