2012-04-13 15 views
2

私は(私は私ができる限りのシナリオを簡素化しようとしましたが、任意のさらなる簡素化した後、エラーが発生していない)のEclipseLinkを使用して、次のエンティティクラスを持っています:孤児除去制約違反

@Entity 
public class A { 
    @Id 
    @GeneratedValue 
    private long id; 
    @OneToOne(cascade = CascadeType.ALL, orphanRemoval=true) 
    private AbstractB b; 
} 

@Entity 
@Inheritance(strategy = InheritanceType.JOINED) 
public abstract class AbstractB { 
    @Id 
    @GeneratedValue 
    protected long id; 
} 

@Entity 
public class BImpl extends AbstractB { 
    @OneToOne(cascade = CascadeType.ALL, orphanRemoval=true) 
    private D d; 
} 

@Entity 
public class D { 
    @Id 
    @GeneratedValue 
    private long id; 
    @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true) 
    @Size(min = 1) 
    private Set<C> cs = new HashSet<C>(); 
} 

@Entity 
public class C { 
    @Id 
    @GeneratedValue 
    private long id; 
} 

AのインスタンスはBImplを参照し、これはDを参照し、Dはセット内にCのインスタンスを保持する。

コードでわかるように、すべての参照でorphanremovalがtrueに設定され、CascadeType.ALLが設定されています。私はAのインスタンスをゼロにし、バックマージするA-> AbstractBの参照を設定

、次の制約違反が発生します。

20:05:03,388 INFO [STDOUT] [EL Fine]: 2012-04-13 20:05:03.388--ClientSession(2132156535)--Connection(1281180651)--Thread(Thread[http-0.0.0.0-443-2,5,jboss])--UPDATE A SET B_ID = ? WHERE (ID = ?) 
20:05:03,388 INFO [STDOUT]  bind => [null, 1] 
20:05:03,390 INFO [STDOUT] [EL Fine]: 2012-04-13 20:05:03.39--ClientSession(2132156535)--Connection(1281180651)--Thread(Thread[http-0.0.0.0-443-2,5,jboss])--DELETE FROM BIMPL WHERE (ID = ?) 
20:05:03,390 INFO [STDOUT]  bind => [2] 
20:05:03,391 INFO [STDOUT] [EL Fine]: 2012-04-13 20:05:03.391--ClientSession(2132156535)--Connection(1281180651)--Thread(Thread[http-0.0.0.0-443-2,5,jboss])--DELETE FROM ABSTRACTB WHERE (ID = ?) 
20:05:03,391 INFO [STDOUT]  bind => [2] 
20:05:03,392 INFO [STDOUT] [EL Fine]: 2012-04-13 20:05:03.392--ClientSession(2132156535)--Connection(1281180651)--Thread(Thread[http-0.0.0.0-443-2,5,jboss])--DELETE FROM C WHERE (ID = ?) 
20:05:03,393 INFO [STDOUT]  bind => [4] 
20:05:03,393 INFO [STDOUT] [EL Fine]: 2012-04-13 20:05:03.393--ClientSession(2132156535)--Thread(Thread[http-0.0.0.0-443-2,5,jboss])--SELECT 1 
20:05:03,394 INFO [STDOUT] [EL Warning]: 2012-04-13 20:05:03.394--UnitOfWork(2142376869)--Thread(Thread[http-0.0.0.0-443-2,5,jboss])--Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.3.0.v20110604-r9504): org.eclipse.persistence.exceptions.DatabaseException 
20:05:03,394 INFO [STDOUT] Internal Exception: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Cannot delete or update a parent row: a foreign key constraint fails (`db`.`D_C`, CONSTRAINT `FK_D_C_cs_ID` FOREIGN KEY (`cs_ID`) REFERENCES `C` (`ID`)) 
20:05:03,394 INFO [STDOUT] Error Code: 1451 
20:05:03,395 INFO [STDOUT] Call: DELETE FROM C WHERE (ID = ?) 
20:05:03,395 INFO [STDOUT]  bind => [4] 

D_Cエントリは取得しない理由を誰もが、私に説明してもらえCインスタンスの前に削除されましたか? @CascadeOnDeleteを追加

+0

クラスとのマッピングを含めます。最高のログを記録すると、何が起きているかがわかります。 – James

+0

C-> Dマッピングを表示できますか?Cを直接削除すると発生しますか? – Chris

+0

クラスをpastebinから投稿に移動しました。 – Olsu

答えて

1

はあなたの問題を解決することがあり

@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true) 
@CascadeOnDelete 
@Size(min = 1) 
public Set<TestChild> childrenSet = new HashSet<TestChild>(); 

も参照してください。EclipseLink DeleteCascade

HTHダニー

+0

この問題を解決するために5つの異なる方法を試しましたが、@ CascadeOnDeleteを使用することが唯一の有用な手段です。 – DLade