【问题标题】:How can I create a hibernate collection that will be re-read every time I request it?如何创建一个休眠集合,每次我请求它时都会重新读取它?
【发布时间】:2010-10-22 08:39:28
【问题描述】:

我有一个实体,它有一个与之关联的状态表。状态表由另一个进程管理,并包含我的业务逻辑必须处理的对象列表。每次重新加载实体时,我都想获得状态表的新快照。如何确保 Hibernate 或其支持库的任何部分曾经 不会缓存此表的任何值?基本上,我想在每次调用 getMyStateValues () 时获得集合的新视图

【问题讨论】:

    标签: java hibernate configuration caching


    【解决方案1】:

    Hibernate 的主要目的是防止这种情况发生并返回给定事务范围内实体状态的一致视图。因此,要么每次在不同的事务中重新加载整个实体。或者,如果您需要在业务事务期间重新加载状态表,则在单独的 Hibernate 会话中仅按父实体的 id 加载状态表。

    【讨论】:

    • 我可以认为如果我提交正在进行的事务,我下一次读取集合将包含新值吗?
    • 我使用 Spring 的事务管理,所以我不确定提交事务是否有效,或者您是否应该在我的脑海中创建一个新的 Session。但是,它应该清除一级缓存。如果您使用二级缓存,则可能仍会启动。默认应该是不使用一个。这应该很容易通过在同一个数据库上打开的测试应用和 SQL 控制台进行验证。
    【解决方案2】:

    您可以在您的实体中创建一个查询数据库并返回集合的方法。获取XYXReload()。这不是一个很好的设计决定,我想。

    【讨论】:

      【解决方案3】:

      您可以使用 Hibernate 的CacheMode。它允许您指示休眠会话如何与缓存交互。您可以通过以下方式访问底层会话:

      @PersistenceContext EntityManager manager;
      ...
      org.hibernate.Session session = (Session)manager.getDelegate();
      

      不幸的是,这种技术适用于整个会话,而不是专门适用于实体。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-16
        • 2018-04-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多