【问题标题】:JPA EclipseLink: Persisting detached entity does not throw any errorJPA EclipseLink:持久化分离实体不会引发任何错误
【发布时间】:2023-04-01 14:45:01
【问题描述】:

我正在学习 JPA 实体生命周期,我想了解“分离”实体。下面是我的代码,

//Creating a new employee with id and name field
Employee e = new Employee("1001","Sasi");
   em.getTransaction().begin();
       em.persist(e);
   em.getTransaction().commit();
//Detaching Employee from Persistence context
em.detach(e);
//Persisting detached entity
   em.getTransaction().begin();
       e.setEmployeeId("1002");
       em.persist(e);
   em.getTransaction().commit();

我看到的是,有两行插入到 mysql 数据库中,而不是出现错误。你能告诉我为什么没有抛出错误吗?我确信我误解了分离实体的概念,请帮助我正确理解它。

【问题讨论】:

    标签: jpa eclipselink jpa-2.0 jpa-2.1


    【解决方案1】:

    我有一个不清楚的观察,(在网络应用程序中,分离的实体很难调试),也许 Eslipelink 2.6 在新的 Id 处静默保存现有的分离对象两次(通过 em.persist() )。没有例外,什么都没有,沉默。给我惊喜。

    当我更改为 update() +persist() 一切正常。

    【讨论】:

      【解决方案2】:

      实体由它们的 ID 标识,而不是由对象实例标识。因此,如果您给实体一个新的 id(在本例中为“1002”),它是一个可以无错误持久存在的新实体。您分离了一个 ID 为“1001”的实体。但这不会影响 ID 为“1002”的实体。

      顺便说一句,分离意味着您从上下文中删除了实体,这意味着实体管理器失去了对相应对象实例的控制。所以,例如它不能重新加载延迟声明的 OneToMany 引用/列表,a.s.o. 如果您有一个具有新 ID 的实体,则可以将其持久化。如果您的实体具有已持久化的 ID,则必须合并/附加它,然后您可以持久化附加的对象,这意味着您更新了持久化实体。

      【讨论】:

      • 你能告诉我什么时候会出现“无法持久分离的对象”错误吗?
      • 在持久化之前不要为示例的分离实体设置新 ID。并像你做的那样使用持久化并 not 合并。我不确定您是否会收到此错误消息,但这是我所期望的唯一方式。
      • 如果我这样做,我将得到“重复键错误”而不是实体分离错误。
      • 我已经很长时间没有与 JPA 合作了。我用谷歌搜索并找到了一个有趣的链接objectdb.com/java/jpa/persistence/detach。例如。如果实体被分离,em.lock(entity) 可能会抛出错误。
      猜你喜欢
      • 2020-12-27
      • 2018-05-20
      • 2013-06-26
      • 2014-02-13
      • 2017-10-21
      • 1970-01-01
      • 2023-03-29
      • 2015-12-26
      • 2017-09-27
      相关资源
      最近更新 更多