有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

使用JPA的java删除实体

我无法从数据库中删除实体。我有两个班,一个是收据,另一个是服务。收据上有

    @ElementCollection
@OneToMany(cascade={CascadeType.ALL}, orphanRemoval=true)
public List<Serving> servings;

我试图从控制器中删除一个服务

Serving serving = Serving.findById(servID);
serving.delete();

结果是

执行异常 发生PersistenceException:组织。冬眠例外ConstraintViolationException:无法执行JDBC批处理更新


共 (2) 个答案

  1. # 1 楼答案

    阅读堆栈跟踪的其余部分,应该可以找到已违反的约束的名称。您可能有其他实体引用了您试图删除的服务(即,其他一些行具有您试图删除的服务行的外键)

    所以,为了能够删除这个实体,必须确保通过外键引用它的所有实体不再引用它。如何做到这一点取决于这些实体是什么,它们与服务的关系是如何实现的,以及您想要做什么:只需删除关联,或者同时删除引用实体

  2. # 2 楼答案

    比如:

    Receipt receipt = serving.getReceipt();
    receipet.setServings(receipt.getServings().remove(serving));
    

    由于收据是其服务的OO所有者,因此从OO的角度来看,收据必须知道服务何时被删除

    可能会在收据上写一封关于服务或服务ID的查询函

    (你确定服务不应该知道它属于哪一张收据吗?——这似乎表明一份服务确实属于一张而且只有一张收据)