Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Hibernate: каскадное удаление детей без коллекции 
:(
    Опции темы
MaxPayneC
Дата 10.2.2010, 15:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 324
Регистрация: 18.2.2006

Репутация: 3
Всего: 9



Имеются две сущности:

Код

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 в базу.
PM   Вверх
afon
Дата 10.2.2010, 16:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 85
Регистрация: 5.4.2008
Где: Украина, Киев

Репутация: нет
Всего: 1



1. выделенное жирным, само по себе - нет. 
2. либо создавать одновременно в коде - друг за другом, тут же мапить и потом персистить сущность верхнего уровня с каскадом PERSIST, либо через конструкторы. Других путей не вижу.
PM MAIL WWW   Вверх
endryha
Дата 10.2.2010, 17:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 24.3.2008

Репутация: нет
Всего: нет



Либо триггерами на уровне базы данных
PM MAIL   Вверх
MaxPayneC
Дата 10.2.2010, 19:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 324
Регистрация: 18.2.2006

Репутация: 3
Всего: 9



На уровне базы данных это убивается внешними ключами. Тогда другой вопрос - если хибернейт не будет явным образом удалять детей, это не может вызвать никаких проблем?
PM   Вверх
afon
Дата 11.2.2010, 13:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 85
Регистрация: 5.4.2008
Где: Украина, Киев

Репутация: нет
Всего: 1



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

А вот скажите, чем вам обратная связь неугодила? 
PM MAIL WWW   Вверх
MaxPayneC
Дата 11.2.2010, 15:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 324
Регистрация: 18.2.2006

Репутация: 3
Всего: 9



Обратная связь не нужна в моей модели, поэтому из соображений экономии памяти решил не грузить сущности лишними коллекциями.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема »


 




[ Время генерации скрипта: 0.0551 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.