Този код има две неща, които му пречат да работи:
- Вашите субекти нямат
@Id
. Вероятно просто сте го оставили, защото това е пример, но си струва да го посочите. - Двойно съпоставихте колоната
parent_id
. Дъщето има както дълго поле, така и поле родител, съпоставени в една и съща колона. Отърви се от Дългия. Търсите връзка с родител.
След това това, което имате, е напълно традиционна двупосочна едно към много с колона за присъединяване. Ако не работи за вас, значи правите нещо нередно в кода, където ги създавате и запазвате. Много вероятно не създавате обектите правилно. Правилният код, използващ тези обекти, би изглеждал така:
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();
Обърнете внимание специално, че детето трябва да бъде зададено в родителя, както и родителят в детето. Не изграждайте полусчупен обектен модел и очаквайте Hibernate да почисти бъркотията ви. Много хора пренебрегват това на пръв поглед очевидно изискване и се чудят защо Hibernate изглежда нестабилен и/или ненадежден.