绕过“找不到实体”错误JPA
问题描述:
有时,清理删除对实体的所有引用是非常困难的(或性能问题)。绕过“找不到实体”错误JPA
例如,我有一个与另一个Person对象有关系的Person对象。
当我删除一个人时,我不想在所有她可以拥有的关系中删除这个人,因为有时这个Person对象不知道它在哪里被引用。所以,如果我想清除删除所有引用,我必须做额外的SQL工作,可能会导致性能问题。
在一个理想的世界中,我想删除Person对象,并且当另一个Person对此Person执行引用(因为它在关系中有它的id)时,只需返回null。
事实是JPA抱怨
javax.persistence.EntityNotFoundException: No row with the given identifier exists
有没有办法迫使JPA返回在这种情况下,空引用,而不是一个例外?
答
您可以使用@NotFound注释的值为NotFoundAction.IGNORE
,如果关联的实体不存在,则返回null。
请注意:如果你在一个集合中使用它,并且hibernate没有找到其中一个条目,它会在集合中添加一个空值,这非常烦人。为避免这种情况,您可以将集合包装在跳过空值的集合中。
答
没有,至少没有什么标准(JPA)
但你可以控制这些协会使用cascade
属性OT @*ToMany
和@*ToOne
说明会发生什么。
答
你会使用@NotFound(action = NotFoundAction.IGNORE) 这将跳过空实体。 但是(如奥古斯托说)如果你正在使用例如Primefaces Datatable并获得10行并跳过2, 由于@NotFound(action = NotFoundAction.IGNORE)在你的属性中, 你将有10行而不是8鬼行实际上)。
@NotFound(action=NotFoundAction.IGNORE)
private Product p;
这正是我正在寻找的!非常感谢。这是冬眠特定的,不是吗? –
我很高兴它的帮助,是的,注释特定于冬眠 – Augusto
@Augusto为什么Spring Data在第一个地方抛出这个异常? – svlada