1

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

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

我正在尝试从控制器中删除服务。

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

结果是;

发生执行异常 PersistenceException:org.hibernate.exception.ConstraintViolationException:无法执行 JDBC 批量更新

4

2 回答 2

4

就像是:

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

由于 Receipt 是其 Serving 的 OO 所有者,因此从 OO 的角度来看,Receipt 必须知道何时删除 Serving。

也许在 Receipt 上为 Serving 或 servingId 写一个查找器。

(您确定 Servings 不应该知道它属于哪个收据吗?- orphanRemoval 似乎表明 Serving 确实属于一个且仅一个收据)

于 2012-06-05T14:33:57.553 回答
2

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

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

于 2012-06-05T14:30:32.607 回答