【问题标题】:hibernate does not add entity to persistencecontext after persist持久化后休眠不会将实体添加到持久化上下文
【发布时间】:2012-11-02 00:14:29
【问题描述】:

我有一个托管bean,其中包含当前页面的实体对象列表。在我创建一个新对象并在事务中使用 persist() 将其持久化到数据库之后;在我调用合并时的另一个事务中(因为实体由于先前的事务提交而处于分离状态); entitymanager 在持久化上下文中找不到对象并向数据库抛出选择查询。我错过了什么还是这是正常行为?

更新:当我使用 mysql 数据库和自动生成的 Id 列时存在上述问题。当我使用 Oracle 时,它​​不存在,我使用序列作为 Ids;但仍然;持久化上下文应该知道生成的 id;还有什么方法可以查看持久性上下文以查看哪些实体存在;我正在使用休眠顺便说一句

【问题讨论】:

    标签: hibernate jpa entitymanager persist


    【解决方案1】:

    这是正常的行为。默认情况下,持久性上下文具有与事务相同的生命周期。这是完全正常的:一旦事务被提交,其他事务可能会修改实体,Hibernate 必须从数据库中重新加载实体以确保它不会返回过时的值。

    【讨论】:

    • 但我称之为合并;为什么不查询数据库就不能合并?
    • 因为合并意味着:将传递的分离实体的状态复制到从数据库中检索的附加实体。由于你在另一个事务中,缓存是空的,它需要从数据库中加载实体。
    • 我很抱歉我是这个环境的新手-Hibernate JPA-所以我没有你所看到的扎实的知识;但是,相同的架构可以在没有额外选择语句的情况下运行一个 Oracle。我认为这与自动生成的 id 有关;但我不知道为什么。我在上面。
    • 在您的 Oracle 环境中,实体在合并时已经加载到会话中,或者您有一个包含实体的二级缓存。它与自动生成的 ID 无关(如果您描述的场景是现实:您应该向您的问题添加代码,以及您看到的额外查询)。
    • 我忘记设置二级缓存了;我使用 ehcache - 我解决了我的一个问题 - 当我从数据库中读取实体时,合并时不需要额外的选择(因为它在缓存中);但是当我尝试合并新插入的实体时;这个需要。但;我还有一个问题;我对 Oracle 和 MySql 使用相同的代码库,Oracle 不需要额外的选择;你有什么线索吗?
    【解决方案2】:

    这是正常行为。如果实例不在持久化上下文中,它需要知道它是否存在(应该被覆盖或稍后新创建)。

    ID生成:生成的ID通常在调用persist(..)时返回,非常方便,因此您的应用程序可以立即使用新创建的ID,无需等待事务结束。

    您可以通过调用以下方法检查给定对象是否在持久化上下文中: https://docs.jboss.org/hibernate/orm/3.5/api/org/hibernate/Session.html#contains%28java.lang.Object%29

    【讨论】:

    • 我不明白这有什么关系;当我坚持;它应该添加到 persistenceContext 并且我应该在没有选择查询的情况下合并;我错了吗?
    猜你喜欢
    • 1970-01-01
    • 2012-01-09
    • 1970-01-01
    • 2020-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-09
    相关资源
    最近更新 更多