2014-05-07 60 views
0

我有两个持久化实体OBJ1和OBJ2。 Obj2包含如下的Obj引用。在Obj1中没有对Obj2的引用(在代码级别 - Java)。休眠:无法删除对象 - 外键约束 - CascadeType.REMOVE

public class Obj2{ 
.... 
@ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH, CascadeType.REMOVE}, optional = true) 
private Obj1 obj1; 

我更新Ojbj 1 @OneToMany的建议:

public class Obj1{ 

.... 

    @OneToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH, CascadeType.REMOVE,CascadeType.ALL},orphanRemoval = true) 
    private List<Obj2> obj2; 

当我尝试删除OBJ1:

em.remove(obj1Instance) 

它失败,因为FOREIGH重点constaint

00:35:23,109 WARN [com.arjuna.ats.arjuna] (http--127.0.0.1-8080-1) ARJUNA012125: TwoPhaseCoordinator.beforeCompletion - failed for SynchronizationImple< 0:ffff7f000101:-7f20c644:5369716f:26, org.hibernate.engine[email protected]dcedf7 >: javax.persistence.PersistenceException: org.hibernate.exception.ConstraintViolationException: Cannot delete or update a parent row: a foreign key constraint fails (`my_db`.`obj2`, CONSTRAINT `FKC4783505BB5D6339` FOREIGN KEY (`obj1_pk`) REFERENCES `obj1` (`pk`)) 
... 
... 94 more 
Caused by: org.hibernate.exception.ConstraintViolationException: Cannot delete or update a parent row: a foreign key constraint fails (`my_db`.`obj2`, CONSTRAINT `FKC4783505BB5D6339` FOREIGN KEY (`obj1_pk`) REFERENCES `obj1` (`pk`)) 

Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Cannot delete or update a parent row: a foreign key constraint fails (`my_db`.`obj2`, CONSTRAINT `FKC4783505BB5D6339` FOREIGN KEY (`obj1_pk`) REFERENCES `obj1` (`pk`)) 

我曾经(错误地看来!)asume那CascadeType.REMOVE会照顾这个吗?我应该如何处理这个删除?

/T

回答

1

感谢您的帮助家伙...我设法(那种)做咨询相结合的两件,我改变了外键,以便它在DELETE级联。

1

要么手动处理,或在添加OBJ1的反向关系@OneToMany(orphanRemoval=true)

+0

我加入了@OneToMany的建议(见上面更新的代码),但它仍然失败出于同样的原因“无法删除或更新父行,外键约束失败... ...约束” – user1843591

+0

你确定数据库表之间没有其他关系,除此之外呢? –

+0

我会稍后再确认。也许问题是在我引入@ONeToMany之前存在的FK约束仍然导致该问题? – user1843591

0

你什么时候添加optional = true?部署应用程序之前还是之后?如果是,MySQL不会更新my_db上的NotNull约束。 obj2,检查列obj1_pk是否可以为空。如果不是,则删除并添加约束FKC4783505BB5D6339,以便它可以为空。 或者你可以简单地删除这两个表并重新创建它们。

+0

我不能删除任何表,因为我必须将此功能添加到现有的DB – user1843591

+0

你可以调整FK关系不放弃分贝,是列my_db.obj2.obj1_pk NULLABLE? –

+0

不,它不能为空。 – user1843591