我有三个实体 -
public class ApplicationEntity extends ModelEntity implements Application {
@ManyToOne(fetch = FetchType.LAZY, optional = false, cascade = {CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH})
private CategoryEntity category;
@ManyToMany(fetch = FetchType.LAZY, cascade = {CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH})
@JoinTable(
joinColumns = {@JoinColumn(name = "APPLICATION_ID")},
inverseJoinColumns = {@JoinColumn(name = "USER_ID")},
uniqueConstraints = {@UniqueConstraint(columnNames = {"APPLICATION_ID", "USER_ID"})
})
private List<UserEntity> buyers = new ArrayList<UserEntity>();}
public class CategoryEntity extends ModelEntity implements Category {
@Column(nullable = false)
private String name;
@OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
private List<ApplicationEntity> applications = new ArrayList<ApplicationEntity>();
}
public class UserEntity extends AbstractEntity implements User {
}
当我尝试删除AppliationEntity时,我遇到了约束违规异常。我尝试从CategoryEntity中删除应用程序条目,然后删除ApplicationEntity。但仍然失败。例外是 -
Caused by: java.sql.SQLException: DELETE on table 'APPLICATIONENTITY' caused a violation of foreign key constraint 'FK109DF15D362F642' for key (32779). The statement has been rolled back.
at org.apache.derby.impl.jdbc.SQLExceptionFactory.getSQLException(Unknown Source)
at org.apache.derby.impl.jdbc.SQLExceptionFactory40.wrapArgsForTransportAcrossDRDA(Unknown Source)
... 61 more
Caused by: ERROR 23503: DELETE on table 'APPLICATIONENTITY' caused a violation of foreign key constraint 'FK109DF15D362F642' for key (32779). The statement has been rolled back.
任何建议都非常感谢。在此先感谢。
答案 0 :(得分:3)
CategoryEntity引用了ApplicationEntity,这就是当您尝试删除引用的ApplicationEntity实例时,您遇到约束违例异常的原因。
您应该将CascadeType.REMOVE
添加到category
的{{1}}字段。
编辑:
JPA文件说:
删除 - 如果拥有实体是 删除,关联的目标 也被删除了。
这意味着当您删除ApplicationEntity时,不会删除CategoryEntity。只会删除它们之间的关联。
编辑:
您应该将ApplicationEntity
添加到CascadeType.REMOVE
的{{1}}字段。 ApplicationEntity和UserEntity之间存在关系表,当您尝试删除ApplicationEntity时,应该删除在此关系表中引用已删除的ApplicationEntity的所有元组。
答案 1 :(得分:2)
该错误表示某些其他表/对象具有对ApplicationEntity的引用。它似乎不是CategoryEntity,因为OneToMany没有定义约束。是否涉及其他对象?在删除对象之前,您需要删除对该对象的任何引用。
它可能是ManyToMany连接表到UserEntity的约束,但是删除应该首先从连接表中删除,所以这是奇数。
是否可以包含完整的异常堆栈跟踪。