J'ai cette entité:Hibernate: fusionner deux entités liées
@Entity
public class Node
{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column
protected Long id;
@Column
private String name;
@ManyToOne
@JoinColumn(name = "NODE_ID")
private Node parent;
@OneToMany(mappedBy = "parent")
private List<Node> children = new ArrayList();
}
Supposons qu'il y ait une source externe qui génère un arbre, et que je veux importer (lire faire persistant) cet arbre tout:
public void importTree()
{
Node root = someExternalSource.receiveTree();
// service.preOrderSave(root); ERROR - Not-null property references a transient value
// service.postOrderSave(root); ERROR - Not-null property references a transient value
// no way out :(
}
Notez que je absolument veux éviter cascade parce que c'est un cas exceptionnel, et il interférerait avec Applicat normale la logique des ions.
Ce que je ne comprends pas pourquoi TransientPropertyValueException est jeté lors de l'appel em.persist
/em.merge
au lieu de validation de la transaction.
Cependant, y a-t-il un moyen de s'en sortir?
Merci
c'est le reste du code:
public Node receiveTree()
{
// dummy code
Node root = new Node();
root.setName("root");
Node child = new Node()
child.setName("child");
root.getChildren().add(child);
child.setParent(root);
return root;
}
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public void preOrderSave(Node node)
{
em.persist(node);
for(Node child : node.getChildren())
{
preOrderSave(child);
}
}
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public void postOrderSave(Node node)
{
for(Node child : node.getChildren())
{
postOrderSave(child);
}
em.persist(node);
}