そのコードには、機能を妨げる2つのことがあります。
- エンティティには
@Id
がありません 。これは一例であるため、おそらく省略しただけですが、指摘する価値があります。 - 列
parent_id
をダブルマップしました 。子には、同じ列にマップされたLongフィールドとParentフィールドの両方があります。ロングを取り除きます。それはあなたが求めている親の関係です。
その後、あなたが持っているのは、結合列を備えた完全に伝統的な双方向の1対多です。それがうまくいかない場合は、それらを作成して保存するコードで何か問題が発生しています。おそらく、オブジェクトを適切に作成していません。これらのエンティティを使用した正しいコードは、次のようになります。
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が不安定または信頼できないように見える理由を疑問に思います。