【发布时间】:2015-07-20 10:40:12
【问题描述】:
我在浏览 JPA 2 规范时发现了两个听起来矛盾的陈述对我来说。
“如果 X 是一个预先存在的托管实体,它会被持久化操作忽略。” - 第 76 页
“当调用持久化操作并且实体已经存在时,持久性提供程序可能会抛出 EntityExistsException。” - 第 129 页
语句 1 所说的内容听起来与语句 2 不同。所以,我的问题是“预先存在的托管实体”和“实体已经存在”之间的区别是什么?
【问题讨论】:
我在浏览 JPA 2 规范时发现了两个听起来矛盾的陈述对我来说。
“如果 X 是一个预先存在的托管实体,它会被持久化操作忽略。” - 第 76 页
“当调用持久化操作并且实体已经存在时,持久性提供程序可能会抛出 EntityExistsException。” - 第 129 页
语句 1 所说的内容听起来与语句 2 不同。所以,我的问题是“预先存在的托管实体”和“实体已经存在”之间的区别是什么?
【问题讨论】:
在规范的 2.1 版第 3.2.2 章中,您可以找到有关 persist() 操作的信息:
因此,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
【讨论】: