持久化操作会忽略保留预先存在的实体实例

时间:2015-05-09 15:54:21

标签: java hibernate jpa

我正在阅读JPA 2规范,发现两个声明听起来很矛盾对我来说

  
      
  1. "如果X是预先存在的管理实体,则持久化操作会忽略它。" - 第76页

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

  4.   

声明1说出与声明2不同的内容。因此,我的问题是"预先存在的管理实体和#34;之间的区别是什么?和"实体已存在"?

1 个答案:

答案 0 :(得分:2)

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

  • 如果X是预先存在的托管实体,则persist操作会忽略它。但是,如果从X到这些其他实体的关系使用cascade = PERSIST或cascade = ALL注释元素值注释或使用等效的XML描述符元素指定,则持久化操作会级联到X引用的实体。
  • 如果X是已删除的实体,则会被管理。
  • 如果X是分离的对象,则在调用persist操作时可能抛出EntityExistsException,或者可能在flush或commit时抛出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