2010-11-24 8 views
1

J'ai une relation plusieurs-à-plusieurs entre un objet persistant (récupéré par une requête) et un objet transitoire nouvellement créé (créé avec new, pas encore persistant). Ils sont reliés par une association @JoinTable, tels que:Mise à jour conjointe entre les objets transitoires et persistants?

@ManyToMany(cascade=CascadeType.ALL) 
@JoinTable(name = "adccollectiontype_cn_node_type", joinColumns = { 
    @JoinColumn(name = "idadccollectiontype") 
}, inverseJoinColumns = { 
    @JoinColumn(name = "idcn_node_type") 
}) 

et à l'autre extrémité:

@ManyToMany(mappedBy="cnNodeTypes", cascade=CascadeType.ALL) 

Remarque CascadeType.ALL.

Si je crée simplement une association entre ces deux objets en ajoutant chacun à la collection de l'autre, et persistant plus tard (un autre objet, et compter sur la cascade) alors la table de jointure n'est pas mise à jour.

Cependant, si je manuellement persist objet transitoire avant de faire l'association, il semble fonctionner.

Maintenant, j'ai essayé de trouver quelques informations sur ce cas, pourquoi et comment cela fonctionne, mais je n'ai trouvé aucune explication. Peut-être que quelqu'un peut m'éclairer, si ce que je suppose est juste ou non, et la raison derrière cela.

Répondre

1

Je ne suis pas sûr qu'il y ait assez d'informations pour vraiment l'expliquer. Si vous modifiez une entité gérée, les modifications doivent être récupérées lorsque la transaction est validée ou que la commande flush est appelée. Donc, l'entité existante est-elle gérée dans le contexte EntityManager actuel? Est-ce que ce qui suit fonctionne?

ManagedEntity oe = em.find(ManagedEntity.class, id); 
NodeType nt = new NodeType(id); 
oe.getCnNodeTypes().add(nt); 
nt.getOtherEntityCollection().add(oe); 
em.flush(); 

Vous pouvez également essayer d'appeler la fusion sur votre entité gérée pour qu'elle soit en cascade vers la nouvelle instance d'entité.

Questions connexes