gpt4 book ai didi

java - 在第一个中进行更新时的两个实体管理器实例,第二个实例选择旧值

转载 作者:行者123 更新时间:2023-11-29 03:46:50 25 4
gpt4 key购买 nike

我正在使用 hibernate entity manager 3.4.0.GA 并且遇到了流动问题:我有两个实体管理器实例 em1em2 并且我有一个实体。我更新了 em1 中的实体,然后在 em2 中选择它,但是 em2 对数据库进行了选择,但实体中有旧值(更新前)。我做错了什么:(

具体步骤在 em1 (T1) 我获取实体并更新它然后提交 T1 并且更改在数据库中,然后在 em2 (T2)我使 jpa 查询获取所有实体,但实体(我在 T1 中成功更新)保留旧值,因为它是从一级缓存中读取的:(。

最佳答案

Level - 1 : 这个缓存的范围是 EntityManagerPersistenceContext (Hibernate 不习惯,但可能是 session ).

Level - 2 : 它的范围是 EntityManagerFactory & 缓存的对象可以被应用程序中的任何实体管理器检索。

当您使用两个不同的实体管理器时,对象不是从一级缓存加载的,而是从二级缓存加载的。因此从中检索陈旧的对象。

  • 您可以尝试session.setCacheMode(CacheMode.REFRESH)

    否则,您可以在查询本身中设置提示。

    @NamedQuery(name="queryWithNoCache",
    query="SELECT e FROM Entity e",
    hints={@QueryHint(name="org.hibernate.cacheMode", value="REFRESH")})

    相应地,您也可以尝试其他模式。

  • Ehcache 文档:

    Session.find does not use the cache for the primary object. Hibernate will try to use the cache for any associated objects. Session.find does however cause the cache to be populated. Query.find works in exactly the same way. Use these where the chance of getting a cache hit is low.

关于java - 在第一个中进行更新时的两个实体管理器实例,第二个实例选择旧值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10496129/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com