使用JPA绕过“未找到实体”错误

时间:2011-08-22 10:24:43

标签: hibernate jpa

有时清除删除对实体的所有引用都很困难(或性能问题)。

例如,我有一个Person对象,它与另一个Person对象有关系。

当我删除一个Person时,我不想在她可以拥有的所有关系中删除此Person,因为有时这个Person对象不知道它被引用的位置。所以,如果我想清除删除所有引用,我必须做额外的SQL工作,这可能会导致性能问题。

在理想的世界中,我想删除Person对象,当另一个Person对此Person进行引用时(因为它的关系中有id),只需返回null。

事实是JPA抱怨

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

在这种情况下,有没有办法强制JPA返回空引用而不是异常?

4 个答案:

答案 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%工作正常...