2011-05-09 100 views
3

我有三个实体 -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. 

任何建议,非常感谢。提前致谢。

回答

3

CategoryEntity具有参考ApplicationEntity,这就是为什么你有约束违反异常,当您试图删除引用ApplicationEntity实例..

你应该包括CascadeType.REMOVEcategoryApplicationEntity

编辑:

JPA单证说:

REMOVE - 如果拥有实体 删除,协会 的目标也将被删除。

这意味着当你删除ApplicationEntity时,CategoryEntity不会被删除。只有它们之间的关联才会被删除。

编辑:

您应该添加CascadeType.REMOVEbuyersApplicationEntity。 ApplicationEntity和UserEntity之间存在关系表,当您尝试删除ApplicationEntity时,在此关系表中引用已删除ApplicationEntity的所有元素都应该先删除。

+0

感谢您的回复。好的,那我该如何删除一个ApplicationEntity,但不是Cateogry或UserEntity? 另外,是不是如果我将CascadeType.REMOVE添加到ApplicationEntity的类别字段,那么删除应用程序实体时类别实体将被删除? 商业案例就像一个类别可以有0 .. *个应用程序。删除应用程序时,不应删除类别。 – Jahid 2011-05-09 12:23:19

+0

你好Gursel,谢谢你的回复。我已将CascadeType.REMOVE添加到ApplicationEntity的类别字段,但我仍然收到异常 – Jahid 2011-05-11 04:41:02

+0

@Jahid,应该有另一个与ApplicationEntity表的外键关系。您应该检查数据库中的FK109DF15D362F642外键约束。 – 2011-05-11 06:48:30

2

该错误指示某个其他表/对象具有对ApplicationEntity。它似乎不是CategoryEntity,因为OneToMany没有定义约束。是否还有其他物体参与?在删除对象之前,您需要删除对象的任何引用。

它可能是从ManyToMany连接表到UserEntity的约束,但删除应该首先从连接表中删除,这很奇怪。

您能否包含完整的异常堆栈跟踪?

+0

你好詹姆斯,谢谢你的回复。我确定没有其他人提及该ApplicationEntity。这里是例外 - – Jahid 2011-05-09 13:35:00

+0

因为大小的限制,我不能在这里粘贴整个异常,但这里是pastebin http://pastebin.com/Nzgj1U11 – Jahid 2011-05-09 13:36:57

+0

另外James,如何可以有多个引用,因为一个application实体可以属于一个类别..。 – Jahid 2011-05-09 13:38:38