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;
}

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

コードからわかるように、すべての参照で orphanremoval が true に設定され、CascadeType.ALL が設定されています。

A->AbstractB の参照を null に設定し、A のインスタンスをマージバックすると、次の制約違反が発生します。

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]

Cインスタンスの前にD_Cエントリが削除されない理由を誰かに説明してもらえますか?

4

1 に答える 1

1

@CascadeOnDelete を追加すると、問題が解決する場合があります

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

参照: EclipseLink DeleteCascade

HTH ダニー

于 2012-08-14T16:14:17.177 に答える