Обычная версия
Java форум JavaTalks
форум программистов

Поиск   Пользователи   Группы   Регистрация 
 Профиль   Личные сообщения 

 Вход 

Hibernate JPA: простейший случай с cascade.
Список форумов
 ->  Персистентность в Java (JPA, ORM, ODB)


 
Начать новую тему 
Предыдущая тема :: Следующая тема  
Автор Сообщение
Dymytry : 223
Новичок

СообщениеЯнв 22, 2012 11:22 
Ответить с цитатой
День добрый!

Использую JPA и Hibernate аннотации.

Есть Parent который содержит коллекцию Child. Надо удалить Parent, но не удалять его Childs.

Вот что я знаю об этом:
- cascade определяет вызов какой функции будет повторен для потомка. например persist, delete итд.
- по умолчанию ничего не вызывается.

Однако с реальностью это расходится. Если я не пишу cascade, или если я перечисляю операции без удаления - все равно удаляется все. Не помогает и использование хибернейтовского каскада.

Код:
   
@OneToMany()
//    @org.hibernate.annotations.Cascade(
//            org.hibernate.annotations.CascadeType.PERSIST
//    )
    @Fetch(FetchMode.JOIN)
    private Set<Child> childs;
, unidirectional.

Как быть?
К началу Посмотреть профиль Отправить личное сообщение
WebPrj : 72
Новичок

СообщениеЯнв 22, 2012 19:39 
Ответить с цитатой
Цитата:
Есть Parent который содержит коллекцию Child. Надо удалить Parent, но не удалять его Childs.

разобраться в этой фразе.
Она НЕлогична
К началу Посмотреть профиль Отправить личное сообщение Посетить сайт автора
Dymytry : 223
Новичок

СообщениеЯнв 23, 2012 0:00 
Ответить с цитатой
Почему нелогична?
Есть объект Менеджер, в нем коллекция объектов Проект. При увольнении Менеджера проекты остаются в организации. Если над проектом работал только один уволенный менеджер то возможно некоторое время над проектом никто не работает и он не лежит ни в чьей коллекции.

Все вполне логично и просто. Как замэпить - неясно.
К началу Посмотреть профиль Отправить личное сообщение
WebPrj : 72
Новичок

СообщениеЯнв 23, 2012 8:36 
Ответить с цитатой
Dymytry писал(а):
Почему нелогична?
Есть объект Менеджер, в нем коллекция объектов Проект. При увольнении Менеджера проекты остаются в организации. Если над проектом работал только один уволенный менеджер то возможно некоторое время над проектом никто не работает и он не лежит ни в чьей коллекции.
Все вполне логично и просто. Как замэпить - неясно.

Тогда это не каскад, а фореген-кей (FK) в терминах СУБД.
Или Проекты - самостоятельная сущность.
Это бизнесу решать, может ли быть проект самостоятельным.
Связи будут другие. Список проектов у Менеджера - просто справочник.
К началу Посмотреть профиль Отправить личное сообщение Посетить сайт автора
Dymytry : 223
Новичок

СообщениеЯнв 23, 2012 9:36 
Ответить с цитатой
Да, Проект - самостоятельная сущность. А Менеджер должен иметь набор проектов. Видимо мне надо полностью отключить каскадные операции. Как это сделать?
К началу Посмотреть профиль Отправить личное сообщение
WebPrj : 72
Новичок

СообщениеЯнв 23, 2012 10:19 
Ответить с цитатой
Dymytry писал(а):
Да, Проект - самостоятельная сущность. А Менеджер должен иметь набор проектов. Видимо мне надо полностью отключить каскадные операции. Как это сделать?

где не надо, не писать аннотацию Один ко многим?
Код:
private Set<Проект> Проекты = new HashSet<Проект> ();

?
К началу Посмотреть профиль Отправить личное сообщение Посетить сайт автора
Skipy : 4801
Я тут живу!
Откуда: Москва, Россия

СообщениеЯнв 23, 2012 12:21 
Ответить с цитатой
Dymytry писал(а):
Да, Проект - самостоятельная сущность. А Менеджер должен иметь набор проектов. Видимо мне надо полностью отключить каскадные операции. Как это сделать?


Начать с БД - на внешнем ключе поставить on delete set null.
_________________
С уважением,
Евгений aka Skipy
www.skipy.ru
P.S. Я НЕ решаю задачи ЗА других!
К началу Посмотреть профиль Отправить личное сообщение Посетить сайт автора
Dymytry : 223
Новичок

СообщениеЯнв 23, 2012 23:08 
Ответить с цитатой
В итоге у меня был какой-то глюк, видимо действительно старый cascade в базе. Вот такая простая конструкция решает поставленную задачу:

Код:
   
@OneToMany()
// or @OneToMany(cascade={CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH})
private Set<Project> projects;


При удалении владельца такой коллекции ее объекты не удалятся, как и должно быть.

Хочу уточнить 2 вопроса:

1) правильно ли я понял, что аннотации cascade никакого отношения к каскадам БД не имеют и действуют только при вызове соотв. им функций?

2) если да, то можно ли как-то через аннотации воздействовать на каскады в constraints БД?
К началу Посмотреть профиль Отправить личное сообщение
WebPrj : 72
Новичок

СообщениеЯнв 24, 2012 8:38 
Ответить с цитатой
не зависят.
- В БД это декларативный способ (без триггеров) удалить дочек.
- в JPA это БЕЗ БД в коде ОРМ делать то же самое.
Говорят, что моделируют от БД.
Т.е. строят схему, учитывая что будет ОРМ.
Поэтому инкремент в триггере не делают, и каскад БД можно не делать.
К началу Посмотреть профиль Отправить личное сообщение Посетить сайт автора
 
Начать новую тему  Ответить на тему
Страница 1 из 1
Список форумов
 -> Персистентность в Java (JPA, ORM, ODB)


 
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах


Java and all Java-related trademarks and logos are trademarks or registered trademarks of Oracle Corporation in the United States and other countries.
Это сайт не относится к фирме Oracle Corporation и не поддерживается ею.

© 2006-2010 www.javatalks.ru: форум java программистов
Используется скрипт phpBB © 2001, 2010 phpBB Group

Хостинг от bizname.ru