有时清除删除对实体的所有引用都很困难(或性能问题)。
例如,我有一个Person对象,它与另一个Person对象有关系。
当我删除一个Person时,我不想在她可以拥有的所有关系中删除此Person,因为有时这个Person对象不知道它被引用的位置。所以,如果我想清除删除所有引用,我必须做额外的SQL工作,这可能会导致性能问题。
在理想的世界中,我想删除Person对象,当另一个Person对此Person进行引用时(因为它的关系中有id),只需返回null。
事实是JPA抱怨
javax.persistence.EntityNotFoundException: No row with the given identifier exists
在这种情况下,有没有办法强制JPA返回空引用而不是异常?
答案 0 :(得分:25)
您可以将@NotFound注释与值NotFoundAction.IGNORE
一起使用,如果关联实体不存在,则返回null。
提醒一句:如果你在集合中使用它并且hibernate没有找到其中一个条目,它会在集合中添加一个空值,这非常烦人。为避免这种情况,您可以将集合包装在跳过空值的集合中。
答案 1 :(得分:5)
不,至少没有标准(JPA)
但您可以使用cascade
属性ot @*ToMany
和@*ToOne
注释来控制这些关联所发生的情况。
答案 2 :(得分:2)
你使用@NotFound(action = NotFoundAction.IGNORE) 这将跳过空实体。 但是(正如奥古斯托所说)如果你使用Primefaces Datatable并得到10行并跳过2, 因为你的财产中有@NotFound(action = NotFoundAction.IGNORE), 你将有10行而不是8行(实际上是鬼行)。
@NotFound(action=NotFoundAction.IGNORE)
private Product p;
答案 3 :(得分:0)
ERROR 1452: Cannot add or update a child row: a foreign key constraint fails....
if this type of error occur :
then
First of all
goto this table and check in setting > if Engine is: InnoDB then change its to MyISAM
(and delete references foreign constraint)
它100%工作正常...