Wpis z mikrobloga

#programowanie #java #spring #jpa #hibernate #mysql

Mirki mam problem. Jest klasa:

class Parent {
@OneToMany(mappedBy = "parentId", fetch = FetchType.EAGER)
Set children;
}

i

class Child {
int parentId;
}

Chcę usunąć sobie Parent z bazy, ale bez usuwania Child. Jednak dostaję exception:
com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Cannot delete or update a parent row: a foreign key constraint fails

Jak zrobić by hibernate nie tworzył constraint przy @OneToMany?
  • 16
  • Odpowiedz
@siemanko: @mediateh7: Tak, to by usunęło wszystkie dzieci.

Po pierwsze zamiast inta zmień na Integer bo typ prosty nie może być nullem. I nie wiem czy w takim wypadku przed usunięciem rodzica nie musiałbyś ustawić parentId wszystkich dzieci na null.
  • Odpowiedz
@nuker92: Akurat nie ma tam inta tylko ValueObject, ale dzięki za uwagę.
Jeżeli jest tak jak mówisz to o kant rozbić ten cały ORM.

Mam małe doświadczenie więc się nie znam, ale dlaczego w klasie Child odwołanie do rodzica masz 'int parentId' a nie 'Parent parent;' ??


Bo tworząc obiekt Child nie mam pojęcia o Parent. Znaj jedynie jego id.

Mam jeszcze jedno pytanie. Czy jest możliwość stworzenia obiektów tylko do
  • Odpowiedz
@slucham-psa-jak-gra: @Porana123: No bo po pierwsze wydaje mi się, że jest to mało optymalne.
Po drugie, chcę mieć możliwość użycia Set children w innych obiektach, nie tylko Parent
Po trzecie, chcę aby Child miał parentId mimo usunięcia parenta, a nie żeby ta wartość się zerowała.
  • Odpowiedz
@siemanko: No to ustaw żeby olewał foreign keye i Hibernate tego sam nie będzie chciał usuwać, tylko że to jest bezsensu. Mówisz mało optymalne, jak ty byś to chciał inaczej, żeby użytkownik podawał jakiś parentId do konsoli i liczyć, że to jest prawdziwe bez patrzenia do bazy? (pomijając, że trzeba to podpiąć do obiektu, bo jak już pisali wcześniej, powinno być Parent parent zamiast int parentId). A tego o używaniu Set
  • Odpowiedz