hibernate:刷新,执行,复制和刷新
我希望我知道这个列表中的每个项目到底是什么,它是如何工作的,后果是什么以及什么时候使用正确的时间。
- 刷新
- 赶出
- 复制
- 红晕
我甚至想知道每个人都做了什么,但我不是很确定,所以我要求你的帮助,因为我真的很想理解它。
我知道这是一个非常普遍的问题,但我认为真正有用的知道这一切。
谢谢。
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()
数据以不同模式在不同的数据存储中复制。