2011-08-22 80 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;