Ten kod ma dwie rzeczy, które uniemożliwiają mu działanie:
- Twoje jednostki nie mają
@Id
. Prawdopodobnie właśnie to opuściłeś, ponieważ jest to przykład, ale warto to podkreślić. - Podwójnie zmapowałeś kolumnę
parent_id
. Element podrzędny ma zarówno pole Long, jak i pole Parent mapowane do tej samej kolumny. Pozbądź się Długiego. Chodzi o relacje z rodzicami.
Po tym masz całkowicie tradycyjny dwukierunkowy jeden-do-wielu z kolumną sprzężenia. Jeśli to nie działa, robisz coś złego w kodzie, w którym je tworzysz i zapisujesz. Bardzo prawdopodobne, że nie tworzysz obiektów poprawnie. Prawidłowy kod używający tych encji wyglądałby mniej więcej tak:
Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
Parent p = new Parent();
Child child = new Child();
child.parent = p;
Child child1 = new Child();
child1.parent = p;
p.children = Arrays.asList(child, child1);
session.save(p);
session.save(p.children.get(0));
session.save(p.children.get(1));
tx.commit();
Zwróć szczególną uwagę, że dziecko powinno być ustawione w rodzicu, tak samo jak rodzic w dziecku. Nie buduj na wpół zepsutego modelu obiektów i oczekuj, że Hibernate posprząta twój bałagan. Wiele osób ignoruje to pozornie oczywiste wymaganie i zastanawia się, dlaczego Hibernate wydaje się niestabilny i/lub zawodny.