Esse código tem duas coisas que o impedem de funcionar:
- Suas entidades não têm
@Id
. Você provavelmente deixou de lado porque este é um exemplo, mas vale a pena ressaltar. - Você mapeou duas vezes a coluna
parent_id
. Filho tem um campo Longo e um campo Pai mapeados para a mesma coluna. Livre-se do Longo. É o relacionamento pai que você procura.
Depois disso, o que você tem é um um-para-muitos bidirecional completamente tradicional com uma coluna de junção. Se não estiver funcionando para você, você está fazendo algo errado no código em que você os cria e salva. Muito provavelmente, você não está criando os objetos corretamente. O código correto usando essas entidades seria algo assim:
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();
Observe especialmente que o filho deve ser definido no pai, assim como o pai no filho. Não construa um modelo de objeto meio quebrado e espere que o Hibernate limpe sua bagunça. Muitas pessoas ignoram este requisito aparentemente óbvio e se perguntam por que o Hibernate parece instável e/ou não confiável.