我正在寻求帮助,因为当我尝试删除具有OneToMany关系的实体时,在使用列表加载页面时出现此错误:
MySQLIntegrityConstraintViolationException:无法删除或更新父行:外键约束失败
我当然知道这与级联删除孩子有关,但是我不知道我在哪里做得不好。
相对于与孩子的关系的父实体部分:
@Entity
@Table(name="PARENT")
public class Parent implements Serializable {
...
@OneToMany (mappedBy = "parent", orphanRemoval = true, cascade={CascadeType.ALL}, targetEntity = Children.class)
@JoinColumn(name = "parent_id")
private List <Children> children;
...
}
相对于与父级关系的子级实体部分:
@Entity
@Table(name = "CHILDREN")
public class Children implements Serializable {
...
@ManyToOne(targetEntity = Parent.class, cascade = CascadeType.ALL)
@JoinColumn
private Country country;
JSF按钮删除实体:
<p:button onmouseup="#{parentBean.remove(parent)}" value="Delete" />
豆角,扁豆:
getEntityManager().remove(getEntityManager().merge(parent));
例外:
Caused by: javax.persistence.PersistenceException: Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.5.0.v20130507-3faac2b): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Cannot delete or update a parent row: a foreign key constraint fails (`control`.`children`, CONSTRAINT `FK_CHILDREN_COUNTRY_ID` FOREIGN KEY (`COUNTRY_ID`) REFERENCES `countries` (`ID`))
Error Code: 1451
Call: DELETE FROM PARENT WHERE (ID = ?)
bind => [1 parameter bound]
Query: DeleteObjectQuery(com.frys.model.Country[ id=2 ])
at org.eclipse.persistence.internal.jpa.EntityManagerSetupImpl$1.handleException(EntityManagerSetupImpl.java:692)
at org.eclipse.persistence.transaction.AbstractSynchronizationListener.handleException(AbstractSynchronizationListener.java:275)
at org.eclipse.persistence.transaction.AbstractSynchronizationListener.beforeCompletion(AbstractSynchronizationListener.java:170)
at org.eclipse.persistence.transaction.JTASynchronizationListener.beforeCompletion(JTASynchronizationListener.java:68)
at com.sun.enterprise.transaction.JavaEETransactionImpl.commit(JavaEETransactionImpl.java:452)
... 86 more
先感谢您!
问题是上面的代码中CascadeType.DELETE
隐含的内容CascadeType.ALL
适用于EntityManager中的对象,但不一定适用于数据库。配置JPA以生成ddl文件。看一下ddl
文件,您会发现该文件ON DELETE CASCADE
没有添加到约束中。添加ON DELETE CASCADE
到ddl
文件中的实际SQL ,然后从ddl更新数据库架构。这将解决您的问题。
该链接显示了如何在MySQL中使用ON DELETE CASCADE
for CONSTRAINT
。您在约束上执行此操作。您也可以在CREATE TABLE
orALTER TABLE
语句中执行此操作。JPA可能会在ALTER TABLE
语句中创建约束。只需添加ON DELETE CASCADE
到该语句。
请注意,某些JPA实现者确实提供了用于此功能的方法,因此使用后果自负。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句