我希望我知道这个列表中的每个项目究竟是什么,它是如何工作的,结果是什么,以及何时是正确的使用时间。
我甚至不知道每个人做了什么,但我不是很确定,所以我要求你的帮助,因为我真的很想理解它。
我知道这是一个非常通用的问题,但我认为了解这一切真的很有用。
感谢。
答案 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-1459,HHH-2716)replicate()
与某些类型的id生成器无法正常工作。此问题限制了replicate()
的有用性,并且如果您的ID生成器策略受到影响而您无法更改它,则需要您实施令人不快的变通方法来模拟其行为。
答案 2 :(得分:4)
session.flush()
刷新会话会强制Hibernate将Session的内存中状态与数据库同步。 session.evict()
从会话缓存中分离对象。从会话中分离对象后,对象的任何更改都不会保留。 session.refresh()
重新加载所有数据。 session.replicate()
数据在不同模式下以不同Datastore复制。