【问题标题】:Hibernate: Refresh, Evict, Replicate and Flush休眠:刷新、驱逐、复制和刷新
【发布时间】:2011-12-29 12:56:39
【问题描述】:

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

  1. 刷新
  2. 驱逐
  3. 复制
  4. 冲洗

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

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

谢谢。

【问题讨论】:

    标签: java hibernate


    【解决方案1】:

    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() 检索对象时,该对象都会被添加到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());  
    }
    

    阅读here的完整示例。

    了解会话 API here

    【讨论】:

    • 我正在尝试调用 sessionFectory.evict(cat) 但它给了我编译时错误 - 参数不适用。
    • @KevalTrivedi 考虑发布一个新问题,其中包含所有相关信息,例如您的示例代码和日志。
    • 一定很喜欢代码示例如何以sess 开头,而之前没有提到它的含义。 (链接不算数。顺便说一句,其中一个是死的atm)
    【解决方案2】:

    replicate() 旨在用于代替 save()/persist(),当您需要保存具有给定标识符的实体时,尽管该实体的标识符已配置为生成。

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

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

    【讨论】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-11-13
        • 1970-01-01
        • 2014-02-03
        • 1970-01-01
        • 2012-04-14
        • 1970-01-01
        • 2011-12-07
        • 2019-03-26
        相关资源
        最近更新 更多