Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > Hibernate: каскадное удаление детей без коллекции


Автор: MaxPayneC 10.2.2010, 15:54
Имеются две сущности:

Код

package com.vc.vacancies.model.entities.directories.directoryEntries;

import com.vc.vacancies.model.entities.directories.AbstractDirectoryEntry;
import com.vc.vacancies.model.entities.directories.ComplexDirectoryEntry;
import org.hibernate.annotations.Cascade;

import javax.persistence.*;

/**
 * Класс, описывающий сущность, выбранную из справочника "Города".
 * <p/>
 * Date: 08.02.2010<br />
 * Time: 12:44:24<br />
 *
 * @author maxpayne
 * @version 1.0
 */
@Entity
@Table(name = "list_cities")
@AttributeOverrides({
        @AttributeOverride(name = "id", column = @Column(name = "city_id", nullable = false)),
        @AttributeOverride(name = "name", column = @Column(name = "city", length = 255, nullable = false))})
public class City extends AbstractDirectoryEntry implements ComplexDirectoryEntry<Area>
{
    /**
     * Район, в котором находится данный город.
     */
    private Area parentEntry;

    @ManyToOne
    @Cascade({org.hibernate.annotations.CascadeType.SAVE_UPDATE})
    @JoinColumn(name = "area_id")
    @Override
    public Area getParentEntry()
    {
        return this.parentEntry;
    }

    @Override
    public void setParentEntry(Area entry)
    {
        this.parentEntry = entry;
    }
}


Код

package com.vc.vacancies.model.entities.directories.directoryEntries;

import com.vc.vacancies.model.entities.directories.AbstractDirectoryEntry;
import com.vc.vacancies.model.entities.directories.ComplexDirectoryEntry;
import org.hibernate.annotations.Cascade;

import javax.persistence.*;

/**
 * Класс, описывающий сущность, выбранную из справочника "Районы".
 * <p/>
 * Date: 08.02.2010<br />
 * Time: 14:03:19<br />
 *
 * @author maxpayne
 * @version 1.0
 */
@Entity
@Table(name = "list_areas")
@AttributeOverrides({
        @AttributeOverride(name = "id", column = @Column(name = "area_id", nullable = false)),
        @AttributeOverride(name = "name", column = @Column(name = "area", length = 255, nullable = false))})
public class Area extends AbstractDirectoryEntry implements ComplexDirectoryEntry<Region>
{
    /**
     * Регион, в котором находится данный район.
     */
    private Region parentEntry;

    @ManyToOne
    @Cascade({org.hibernate.annotations.CascadeType.SAVE_UPDATE})
    @JoinColumn(name = "region_id")
    @Override
    public Region getParentEntry()
    {
        return this.parentEntry;
    }

    @Override
    public void setParentEntry(Region entry)
    {
        this.parentEntry = entry;
    }
}


В базе в таблице с городами есть ссылка на район, в котором находится город. Возникает вопрос: можно ли, вызывая session.delete(area), сделать так, чтобы были удалены все города, находящиеся в этом районе, не создавая в классе Area коллекцию городов и не мапя ее @OneToMany? Также нужно, чтобы создание города вызывало создание района, а оно - создание региона (код класса региона опущен), если район и регион еще не были persist в базу.

Автор: afon 10.2.2010, 16:56
1. выделенное жирным, само по себе - нет. 
2. либо создавать одновременно в коде - друг за другом, тут же мапить и потом персистить сущность верхнего уровня с каскадом PERSIST, либо через конструкторы. Других путей не вижу.

Автор: endryha 10.2.2010, 17:01
Либо триггерами на уровне базы данных

Автор: MaxPayneC 10.2.2010, 19:54
На уровне базы данных это убивается внешними ключами. Тогда другой вопрос - если хибернейт не будет явным образом удалять детей, это не может вызвать никаких проблем?

Автор: afon 11.2.2010, 13:44
Если сами не будете удалять деток перед удалением родителя, то, конечно, вызовет. Если на детях сидит внешний ключ, то просто обязательно вызовет. В смысле - не даст удалить родителя и стрельнет DataIntegrityException, foreign key violation и все такое. 

А вот скажите, чем вам обратная связь неугодила? 

Автор: MaxPayneC 11.2.2010, 15:51
Обратная связь не нужна в моей модели, поэтому из соображений экономии памяти решил не грузить сущности лишними коллекциями.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)