hibernate DAO usuwanie obiektów i inne

0

powiedzmy, że jest taka sytuacja:

@Entity
@Table(name = "students")
public class Student implements Serializable {

    @ManyToOne(optional = true)
    @JoinColumn(name = "group_id")
    private Group group;
@Entity
@Table(name = "groups")
public class Group implements Serializable {

    @OneToMany(mappedBy = "group", orphanRemoval = true)
    private Set<Student> students = new HashSet<>();
  • standardowe DAO. teraz dodaję sobie studentów to grupy.

Dlaczego mimo tych adnotacji, gdy próbuję usunąć grupę hibernate nie daje rady ogarnąć tych referencji?
`ERROR: ERROR: update or delete on table "groups" violates foreign key constraint "fk_hj765tom58v2gqsgaoswtl30e" on table "students"
Szczegóły: Key (group_id)=(1) is still referenced from table "

0

nie rozumiesz tego atrybutu orphanRemoval. Uzyj cascade

0

z tego co czytam: Nie ma możliwości adnotacjami w JPA ustawić czegoś na zasadzie on update cascade on delete set null . zostają mi pętle albo przerzucić się na hibernate i spróbować może da radę

1

@karolinaa ty chcesz móc usunąć grupę bez ruszania studentów czy odwrotnie? Bo teraz masz misz-masz jakis. Bo ustawiłaś ophan removal na true czyli niby chcesz usuwać studentów którzy wypadli z grupy, ale jednocześnie nie masz ustawionej kaskady na usuwanie, więc jak to jest?
Orphan removal oznacza że jak wywalisz studenta z grupy to ten student zostanie skasowany.
Kaskada na delete oznacza że jak usuniesz grupę to studenci z tej grupy też zostaną usunięci.
A co ty chcesz zrobić?

0

Chcę tak, że gdy usunę grupę to studenci, którzy byli do niej zapisani nie zostaną usunięci a będą mieli referencje na grupę null. Na razie rozwiązałam to w encji Group:

    @PreRemove
    private void preRemove() {
        for(Student s : students) {
            s.setGroup(null);
        }
    }
1

@karolinaa i to jest raczej poprawne rozwiązanie, bo specyfikacja JPA chyba nie przewiduje takiej opcji jaka cię interesuje. Ale że zrobiłaś to forem a nie strumieniem i foreach? :P

0

to ze zmęczenia. szkoda, że JPA nie wspiera on update cascade on delete set null. zastanawia mnie zatem jakie ma znaczenie przy relacjach JPA optional.

0

Ma takie znaczenie że możesz stworzyc encje z nullem ;)

0

a stworzyć tylko ehh. niby zamiast tej nullowej referencji mogłabym dodać grupe o nazwie "nogroup" czy coś w tym stylu, ale sama nie wiem co lepsze jest (null vs grupa nogroup). wtedy w biznesie grupy przy usuwaniu grupy dla każdego studenta grupy przeznaczonej do usunięcia po prostu ustawiam nogroup.

1 użytkowników online, w tym zalogowanych: 0, gości: 1