我正在阅读JPA 2规范,发现两个声明听起来很矛盾对我来说。
"如果X是预先存在的管理实体,则持久化操作会忽略它。" - 第76页
- 醇>
"当调用持久化操作且实体已存在时,持久性提供程序可能抛出EntityExistsException。" - 第129页
声明1说出与声明2不同的内容。因此,我的问题是"预先存在的管理实体和#34;之间的区别是什么?和"实体已存在"?
答案 0 :(得分: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