2011-08-22 45 views
6

有時,清理刪除對實體的所有引用是非常困難的(或性能問題)。繞過「找不到實體」錯誤JPA

例如,我有一個與另一個Person對象有關係的Person對象。

當我刪除一個人時,我不想在所有她可以擁有的關係中刪除這個人,因爲有時這個Person對象不知道它在哪裏被引用。所以,如果我想清除刪除所有引用,我必須做額外的SQL工作,可能會導致性能問題。

在一個理想的世界中,我想刪除Person對象,並且當另一個Person對此Person執行引用(因爲它在關係中有它的id)時,只需返回null。

事實是JPA抱怨

javax.persistence.EntityNotFoundException: No row with the given identifier exists 

有沒有辦法迫使JPA返回在這種情況下,空引用,而不是一個例外?

回答

16

您可以使用@NotFound註釋的值爲NotFoundAction.IGNORE,如果關聯的實體不存在,則返回null。

請注意:如果你在一個集合中使用它,並且hibernate沒有找到其中一個條目,它會在集合中添加一個空值,這非常煩人。爲避免這種情況,您可以將集合包裝在跳過空值的集合中。

+0

這正是我正在尋找的!非常感謝。這是冬眠特定的,不是嗎? –

+1

我很高興它的幫助,是的,註釋特定於冬眠 – Augusto

+0

@Augusto爲什麼Spring Data在第一個地方拋出這個異常? – svlada

5

沒有,至少沒有什麼標準(JPA)

但你可以控制這些協會使用cascade屬性OT @*ToMany@*ToOne說明會發生什麼。

0

你會使用@NotFound(action = NotFoundAction.IGNORE) 這將跳過空實體。 但是(如奧古斯托說)如果你正在使用例如Primefaces Datatable並獲得10行並跳過2, 由於@NotFound(action = NotFoundAction.IGNORE)在你的屬性中, 你將有10行而不是8鬼行實際上)。

@NotFound(action=NotFoundAction.IGNORE) 
private Product p;