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

Jer*_*nce 13 hibernate jpa

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

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

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

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

事实是JPA抱怨说

javax.persistence.EntityNotFoundException: No row with the given identifier exists
Run Code Online (Sandbox Code Playgroud)

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

Aug*_*sto 27

您可以将@NotFound注释与值一起使用NotFoundAction.IGNORE,如果关联实体不存在,则返回null.

需要注意的是:如果你在集合中使用它并且hibernate没有找到其中一个条目,它会在集合中添加一个空值,这非常烦人.为避免这种情况,您可以将集合包装在跳过空值的Collection中.

  • @斯维拉达。这是因为有一个 *soft* 外键,它没有被强制执行。因此,表 A 有一列存储表 B 的 id,但表 B 上没有具有该主键的行。这通常是不强制执行外键时的情况。所以如果有人得到这个,就意味着关系数据库没有正确使用。 (2认同)

Boz*_*zho 5

不,至少没什么标准(JPA)

但您可以使用cascade属性ot @*ToMany@*ToOne注释来控制这些关联所发生的情况.