2010-09-29 12 views
1

Ce que j'ai est un bean entité, par ex. Entity (EJB 3) qui conserve les enfants de même type dans un ArrayList<Entity>, son parent <Entity> et une relation avec une autre entité <Users>. Les utilisateurs peuvent posséder de nombreuses entités, et vice-versa (plusieurs à plusieurs).Copie en profondeur des beans EJB Entity avec les relations

Ce que je voudrais faire est de passer outre Entity.clone() (ou une nouvelle méthode) à copie en profondeur Entity ainsi que des clones de children, appartenant au même parent et d'être affecté aux utilisateurs déjà existants.

J'ai mis en place la méthode clone pour créer un clone du Entity (une nouvelle entité qui l'est), puis le remplir avec des clones des entités children dans une boucle foreach.

Mais cela me donne une exception de modification simultanée et je me retrouve avec juste un clone du bean initial Entity sans son children.

Ma question est:

Est-ce que je veux faire du tout faisable ou devrais-je gérer une copie en profondeur de par exemple une façade? Si c'est faisable, pourriez-vous me diriger vers quelque chose à lire ou me donner quelques indications, parce que jusqu'à présent je fais le clonage via une façade et c'est devenu un fardeau majeur dans ma demande.

Merci d'avance !!

pataroulis

Répondre

2

Essayez d'utiliser (de commons-lang)

YourEntity clone = SerializationUtils.clone(entity); 

Vous devez faire vos entités Serializable (que vous voudrez peut-être pas nécessairement, cependant). Aussi cela devrait être fait pendant que le EntityManager est toujours ouvert, sinon vous auriez une exception d'initialisation paresseuse.

1

Vous devez créer une nouvelle liste, sinon vous ajoutez à la même liste que vous êtes en train d'itérer, d'où l'exception de modification simultanée.

à savoir

Entity clone = super.clone(); 
clone.setChildren(new ArrayList()); 
for (Child child : this.getChildren()) { 
    clone.addChild(child.clone()); 
} 
return clone; 

Si vous utilisez votre EclipseLink pourrait aussi utiliser l'API copie() sur le EclipseLink JpaEntityManager. Vous pouvez passer un CopyGroup qui spécifie la profondeur de la copie et si l'ID doit être réinitialisé.

0

Vous devez résoudre plusieurs problèmes si les entités oyur ne sont pas détachées. Aussi vous devez cloner ou sériliser vos entités en dehors de la transaction, sinon vous obtiendrez DetachedEntityPassedToPersistException(). Here is réponse plus élaborée:.