LINUX.ORG.RU

Hibernate каскадное удаление

 


0

1

Есть у меня класс Group, представляющий группу тэгов в базе, в нём установлена связь с классом Tag, представляющим тэг в базе. Связь класса Group:

@OneToMany(fetch = FetchType.EAGER, orphanRemoval = true)
@JoinColumn(name = "group_id")
@Cascade({CascadeType.ALL})
private List<Tag> tags = new ArrayList<>();
Связь в классе Tag с классом Group:
@ManyToOne()
@PrimaryKeyJoinColumn
private Group group;
Однако, при удалении объекта Group, все связанные с ним тэги не удаляются, а в поле group_id в базе пытается записаться null, что естественно не получается. Удаляю просто session.delete(GroupObj)

Что делаю не так?

★★

Последнее исправление: OldWiseCat (всего исправлений: 1)

Может быть, как-то объяснить Hibernate, что поле group_id не может быть null? Или как-то не так Cascade указан?

OldWiseCat ★★
() автор топика

@JoinColumn в Group какой смысл несет? Вот если бы в Tag это было написано:

@ManyToOne()
@JoinColumn(name = "group_id")
private Group group;

тогда б я понял.

asaw ★★★★★
()
Ответ на: комментарий от asaw

Если из Group убрать @JoinColumn, то гибернейт выкидывает ошибку

org.hibernate.exception.SQLGrammarException: Table 'StartBD.tag_group_tag' doesn't exist
Такой таблицы естественно нет, есть таблица «tag». В классе Tag так и указано:
@Entity
@Table(name = "tag")
public class Tag implements Serializable {

в Group получается такой код:

    @OneToMany(fetch = FetchType.EAGER, orphanRemoval = true)
    @Cascade({CascadeType.REMOVE})
    private List<Tag> tags = new ArrayList<>();

в Tag без разницы что писать, в таблице Group только один ключ - group_id, он его и цепляет аннотацией @PrimaryKeyJoinColumn

OldWiseCat ★★
() автор топика
Последнее исправление: OldWiseCat (всего исправлений: 2)
Ответ на: комментарий от OldWiseCat

Ага, это я дурак. Правильный код маппинга групп:

@OneToMany(mappedBy = "group", fetch = FetchType.EAGER, orphanRemoval = true)
@Cascade({CascadeType.ALL})
private List<Tag> tags = new ArrayList<>();

OldWiseCat ★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.