|
Java форум JavaTalks форум программистов
|
|
|
|
| Предыдущая тема :: Следующая тема |
| Автор |
Сообщение |
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 это БЕЗ БД в коде ОРМ делать то же самое.
Говорят, что моделируют от БД.
Т.е. строят схему, учитывая что будет ОРМ.
Поэтому инкремент в триггере не делают, и каскад БД можно не делать. |
|
|
|
 |
|
|
|