2016-04-28 8 views
1

Я пытаюсь иметь cascade delete внутри своих сущностей. Но я думаю, что его останавливает тот факт, что у меня есть ссылки на один столбец у моего ребенка entity.Hibernate: сопоставление родительского объекта с дочерним объектом с 2 ссылками на один столбец в дочернем?

В моей детской собачей сущности я первоначально имел следующее поле:

@Column(name = "KENNEL_ID", insertable = false, updatable = false) 
    private String kennelId;  

Затем я добавил это, потому что я хотел, чтобы получить список всех дочерних организаций, связанных с родителем:

@ManyToOne 
    @JoinColumn(name = "KENNEL_ID") 
    private Kennel kennel; 

В моем родительском подразделении я также добавил это, чтобы обратиться к полю у ребенка, которого я добавил:

@OneToMany(mappedBy = "kennel",cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.LAZY) 
    private List<Dog> dogList= new ArrayList<Dog>(); 

Прежде чем добавить вторую ссылку на дочерние элементы и родительские ссылки, каскадное удаление было обработано для всех моих объектов. Однако, поскольку я добавил их, это не так.

Как это исправить?

ответ

3

Это не проблема сопоставления родительского и дочернего в том же классе. Проблема в том, что вам необходимо поддерживать оба конца двунаправленных отношений вручную.

child.setParent(parent) 
parent.addChild(child) 

КСТАТИ: Установка его только на одной стороне (тот, который отвечает сохранить отношения в базе данных), магазин и перезагрузить предприятие будет работать в некоторых случаях тоже. (И вы найдете этот грязный трюк во многих старых учебниках). Но, по-моему, это плохая практика. (В вашем тестовом случае потребуется очистить кеш, прежде чем перезагружать родителя после сохранения ребенка.)

public void setDogList(List<Dog> dogList) { 
     this.dogList.clear(); 
     this.dogList.addAll(dogList); 
    } 

 Смежные вопросы

  • Нет связанных вопросов^_^