2015-05-09 83 views
2

我正在審閱JPA 2規範,並發現兩條聲明相互矛盾的語句對我來說堅持預先存在的實體實例被持久化操作忽略

  1. 「如果X是一個已經存在的管理實體,它是由持續經營忽略不計。」 - Pg 76

  2. 「EntityExistsException可能會在persist提供程序調用persist操作並且該實體已存在時拋出。」 - 第129

聲明1說一些聽起來從聲明2.如此不同,我的問題是什麼是「預先存在的管理實體」和「實體已經存在」之間的區別?

回答

2

在規範的2.1版本,3.2.2章,你可以找到這個有關persist()操作:

  • 如果X是一個已經存在的管理實體,它是由持續經營忽略。但是,如果從X到這些其他實體的關係使用cascade = PERSIST或cascade = ALL註釋元素值進行註釋,或者使用等效的XML描述符元素進行了指定,則持久操作將級聯到由X引用的實體。
  • 如果X是一個被刪除的實體,它將被管理。
  • 如果X被分離對象,所述EntityExistsException可以當persist操作被調用時,或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 
+0

@ JB Nizet請閱讀實體操作第四章 「異常的總結」 一節或檢查EntityExistsException下面的鏈接;它說:「當EntityManager.persist(Object)被調用並且實體已經存在時,由持久性提供者拋出。」 http://docs.oracle.com/javaee/6/api/javax/persistence/EntityExistsException.html – Aceghn

+0

@Aghghn這是對拋出異常的不完整描述。規範是參考,它顯然是一個分離的實體和受管理的實體之間的區別。 –