2012-04-13 4 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, который, в свою очередь, содержит экземпляр 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?

+0

Включить классы и отображения. Настройка ведение журнала на самом высоком уровне также покажет вам, что происходит. – James

+0

Можете ли вы показать свое C-> D-отображение, и происходит ли это, если вы удаляете C напрямую? – Chris

+0

Переместил классы из pastebin в проводку. – Olsu

ответ

1

добавление @CascadeOnDelete может решить вашу проблему

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

Смотри также: EclipseLink DeleteCascade

НТН Дэнни

+0

Я попробовал около 5 различных способов решить эту проблему, но я обнаружил, что использование @CascadeOnDelete является единственным полезным приложением. – DLade

 Смежные вопросы

  • Нет связанных вопросов^_^