【问题标题】:Persisting a preexisting Entity Instance is ignored by the persist operation [duplicate]持久化操作忽略持久化预先存在的实体实例[重复]
【发布时间】:2015-07-20 10:40:12
【问题描述】:

我在浏览 JPA 2 规范时发现了两个听起来矛盾的陈述对我来说

  1. “如果 X 是一个预先存在的托管实体,它会被持久化操作忽略。” - 第 76 页

  2. “当调用持久化操作并且实体已经存在时,持久性提供程序可能会抛出 EntityExistsException。” - 第 129 页

语句 1 所说的内容听起来与语句 2 不同。所以,我的问题是“预先存在的托管实体”和“实体已经存在”之间的区别是什么?

【问题讨论】:

    标签: java hibernate jpa


    【解决方案1】:

    在规范的 2.1 版第 3.2.2 章中,您可以找到有关 persist() 操作的信息:

    • 如果 X 是预先存在的托管实体,则持久操作将忽略它。但是,如果从 X 到这些其他实体的关系使用 cascade=PERSIST 或 cascade=ALL 注释元素值进行注释或使用等效的 XML 描述符元素指定,则持久操作将级联到 X 引用的实体。
    • 如果 X 是一个已移除的实体,它将变为托管的。
    • 如果 X 是一个分离的对象,在调用持久化操作时可能会抛出 EntityExistsException,或者在刷新或提交时可能会抛出 EntityExistsException 或另一个 PersistenceException

    因此,persist() 将忽略该实体,如果它是一个 托管 对象。如果实体是一个分离的对象,它可以抛出一个异常(或抛出它,或另一个,稍后)。

    第一种情况:

    Foo foo = em.find(Foo.class, 1L);
    em.persist(foo); // ignored
    

    第二种情况:

    Foo foo = new Foo();
    foo.setId(1L);
    em.persist(foo); // may throw an exception
    

    【讨论】:

    • @JB Nizet 请阅读实体操作一章中的“异常摘要”部分或查看以下有关 EntityExistsException 的链接;它说“当调用 EntityManager.persist(Object) 并且实体已经存在时,由持久性提供程序抛出。” docs.oracle.com/javaee/6/api/javax/persistence/…
    • @Aceghn 这是对何时引发异常的不完整描述。规范是参考,它清楚地区分了分离实体和托管实体。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多