Hibernate: каскадное удаление дочерней коллекции

Предположим, у меня есть 2 объекта Java: Parent и Child. Связь между ними следующая: Дочерний -> Родительский = многие-к-одному, т. е. несколько дочерних объектов могут быть связаны с одним и тем же родителем.

Дочерний объект содержит ссылку на своего родителя, в то время как родительский объект не имеет поля для обращения к своим дочерним элементам.

В Hibernate это приводит к появлению элемента many-to-one в дочернем отображении; Сопоставление родителя не содержит записи один-ко-многим, поскольку родительскому объекту не нужно иметь поле коллекции для ссылки на все его дочерние объекты.

Теперь, когда Parent удален, Oracle выдает исключение, что сущность не может быть удалена, пока на нее ссылаются дочерние сущности.

Есть ли в этой объектной модели способ каскадного удаления всех дочерних объектов, принадлежащих родительскому объекту, когда последний удаляется?


person preeze    schedule 24.05.2013    source источник


Ответы (2)


1> сделать двунаправленное сопоставление с дочерним ‹--> родителем. упомянуть каскадное удаление.

2> вы знаете, кто является дочерним объектом этого родителя, сначала удалите все дочерние элементы этого родителя, а затем попробуйте удалить родителя.

РЕДАКТИРОВАТЬ:

проверьте ссылку на этот пример

Пример двунаправленного режима гибернации

person NPKR    schedule 24.05.2013
comment
Дело в том, что я не хочу вводить новое дочернее поле в родительский объект просто ради каскадного удаления. - person preeze; 24.05.2013
comment
чтобы сделать двунаправленную связь, родитель не требует дочерней ссылки. - person NPKR; 24.05.2013
comment
Я проверил этот пример перед публикацией этого вопроса. Насколько я вижу в этом примере, команда определяет поле игроков. - person preeze; 24.05.2013

Родительский класс

import java.util.Set;  

    import javax.persistence.*;  

    @Entity  
    @Table(name = "Parent")  
    public class Parent{  

        @Id  
        @GeneratedValue  
        private Integer id;  

        private String name;  

        @OneToMany(mappedBy="Child", cascade=CascadeType.ALL)  
        private Set<Child> child;  
}

рассмотрим второй класс, называемый дочерним

импортировать javax.persistence.*;

@Entity  
@Table(name = "Child")  
public class Child{  

    @Id  
    @GeneratedValue  
    private Integer id;  

    private String lastname;  

    @ManyToOne  
    @JoinColumn(name = "id")  
    private Parent parent;  
}

просто внесите изменения в свой POJO, соответственно, он не будет генерировать исключение

person shreyansh jogi    schedule 24.05.2013
comment
Возможно, я не совсем ясно выразился, что Parent не должен содержать поле Set‹Child› дочерних элементов. Но в вашем примере он действительно есть, поэтому это решение не на 100% то, что я искал. - person preeze; 24.05.2013