2010-11-17 3 views

Répondre

2

Cela fonctionnerait mais il est préférable que vous exprimiez votre intention (clonage) dans votre mode de domaine. Définir un champ sur null est juste un détail d'implémentation et n'a aucune signification.

Address address = AddressDAO.get(id); 
Address clone = address.cloneMe(); 
AddressDAO.add(clone); 
+1

Le problème que je vois avec cela est que si address.cloneMe() définit simplement l'identifiant à null, le nom de la méthode est un mensonge. L'appeler par lui-même ne produit pas de clone, c'est toujours le même objet. – waxwing

+0

C'est une méthode de clonage. L'objet original n'est pas affecté. Il retourne une nouvelle instance. Vous pouvez l'exprimer en tant que constructeur de copie, mais je préfère l'expressivité d'une méthode (nommée) pour cela. – cherouvim

5

Oui, cela devrait fonctionner. Je ne suis pas sûr qu'hibernate ne vérifie pas les références d'objet, donc si cela ne fonctionne pas, vous devrez peut-être créer une nouvelle instance et copier toutes les propriétés (en utilisant BeanUtils.copyProperties, ou même BeanUtils.cloneBean(..)), puis définir l'ID à null/0.

1

Je vous suggère de l'essayer. Si adress est toujours persistant (lié à une session), je suppose qu'il y aura des problèmes. Il se peut que vous ayez besoin d'un session.evict(address) avant de définir l'ID sur null.

0

Cela ne fera pas une copie profonde ... donc votre copie se référera à des objets enfants d'objets originaux.

2

Utilisation sur cascade Eviter pour cet objet en veille prolongée.

puis

Address address = AddressDAO.get(id); 
AddressDAO.evict(address); //Internally session.evict(address); 
address.setId(null); // If id is autogenerated 
AddressDAO.add(address); 
Questions connexes