JPA:删除约束违规

时间:2011-05-09 11:31:30

标签: java jpa

我有三个实体 -

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.

任何建议都非常感谢。在此先感谢。

2 个答案:

答案 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的约束,但是删除应该首先从连接表中删除,所以这是奇数。

是否可以包含完整的异常堆栈跟踪。