Я использую 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, который, в свою очередь, содержит экземпляр C в наборе.
Как вы можете видеть в коде, все ссылки имеют orphanremoval, установленные как true и CascadeType.ALL.
Когда я поставил ссылку на A-> AbstractB обнулить и слить обратно экземпляр 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]
Может кто-нибудь объяснить мне, почему запись D_C не получает удалено до экземпляра C?
Включить классы и отображения. Настройка ведение журнала на самом высоком уровне также покажет вам, что происходит. – James
Можете ли вы показать свое C-> D-отображение, и происходит ли это, если вы удаляете C напрямую? – Chris
Переместил классы из pastebin в проводку. – Olsu