2012-04-13 6 views
2

ich Eclipse bin mit und haben folgende Entitätsklassen (Ich habe versucht, das Szenario so viel wie ich konnte, aber nach einer weiteren Vereinfachung zu vereinfachen, wird der Fehler nicht auftritt):Waise Entfernung Einschränkungsverletzung

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

mit einer Instanz von A, die auf ein BImpl verweist, das auf ein D verweist, das wiederum eine Instanz von C in einer Menge enthält.

Wie Sie im Code sehen können, wurde für alle Referenzen der Wert "orphanremoval" auf "true" und "CascadeType.ALL" gesetzt.

Wenn ich den Bezug von A-> AbstractB stellen Sie die Instanz von A auf null und wieder zusammenführen, die folgende Beschränkung verletzt wird:

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] 

Könnte jemand mir erklären, warum der D_C Eintrag nicht bekommen vor der C-Instanz gelöscht?

+0

Fügen Sie die Klassen und Zuordnungen. Wenn Sie die Anmeldung am Feinsten einstellen, wird auch angezeigt, was passiert. – James

+0

Können Sie Ihr C-> D-Mapping anzeigen, und tritt es auf, wenn Sie C direkt entfernen? – Chris

+0

Die Klassen von pastebin in den Beitrag verschoben. – Olsu

Antwort

1

Zugabe @CascadeOnDelete kann Ihr Problem

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

auch lösen: EclipseLink DeleteCascade

HTH Danny

+0

Ich habe ungefähr 5 verschiedene Wege versucht, um dieses Problem zu lösen, aber ich fand, dass die Verwendung von @CascadeOnDelete die einzige nützliche Lösung ist. – DLade

Verwandte Themen