【问题标题】:Bypass "Entity not found" error with JPA使用 JPA 绕过“找不到实体”错误
【发布时间】:2011-08-22 10:24:42
【问题描述】:

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

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

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

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

事实是 JPA 抱怨说

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

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

【问题讨论】:

    标签: hibernate jpa


    【解决方案1】:

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

    提醒一句:如果你在集合中使用这个并且hibernate没有找到其中一个条目,它会在集合中添加一个空值,这很烦人。为避免这种情况,您可以将集合包装在跳过空值的集合中。

    【讨论】:

    • 这正是我正在寻找的!太感谢了。这是特定于休眠的,不是吗?
    • 很高兴它有帮助,是的,注释是特定于休眠的
    • @Augusto 为什么 Spring Data 一开始就抛出这个异常?
    • @svlada。这是因为有一个未强制执行的 soft 外键。因此,表 A 有一列存储了表 B 的 id,但表 B 上没有具有该主键的行。这通常是未强制执行外键时的情况。所以如果有人得到这个,说明关系数据库没有正确使用。
    【解决方案2】:

    不,至少没有标准(JPA)

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

    【讨论】:

      【解决方案3】:

      你会使用 @NotFound(action=NotFoundAction.IGNORE) 这将跳过空实体。 但是(如 Augusto 所说)如果您使用例如 Primefaces Datatable 并获得 10 行并跳过 2, 由于您的财产中的 @NotFound(action=NotFoundAction.IGNORE), 您将有 10 行而不是 8 行(实际上是鬼行)。

      @NotFound(action=NotFoundAction.IGNORE)
      private Product p;
      

      【讨论】:

        【解决方案4】:
        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% 工作......

        【讨论】:

        • 这如何回答 OP 的问题?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-07-10
        • 1970-01-01
        • 1970-01-01
        • 2011-10-05
        • 2019-09-10
        • 2011-08-10
        • 2016-05-13
        相关资源
        最近更新 更多