2010-11-17 6 views

Antwort

2

Es würde funktionieren, aber es ist am besten, wenn Sie Ihre Absicht (Klonen) in Ihrem Domain-Modus ausdrücken. Das Setzen eines Feldes auf null ist nur ein Implementierungsdetail und hat keine Bedeutung.

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

Das Problem ich damit sehen, dass, wenn address.cloneMe() nur die ID auf NULL setzt, der Methodenname ist ein liegen. Der Aufruf selbst erzeugt keinen Klon, es ist immer noch das gleiche Objekt. – waxwing

+0

Es ist eine Klon-Methode. Das ursprüngliche Objekt ist nicht betroffen. Es gibt eine neue Instanz zurück. Sie könnten es als Kopierkonstruktor ausdrücken, aber ich bevorzuge die Ausdruckskraft einer (benannten) Methode dafür. – cherouvim

5

Ja, das sollte funktionieren.

Ich bin nicht sicher, ob Hibernate nicht Objektreferenzen nicht überprüft, so dass, wenn dies nicht funktioniert, könnte eine neue Instanz erstellen müssen, und kopieren Sie alle Eigenschaften (mit BeanUtils.copyProperties oder sogar BeanUtils.cloneBean(..)), und legen Sie die ID auf null/0.

1

Ich schlage vor, dass Sie es versuchen. Wenn adress immer noch persistent (Session-gebunden) ist, würde ich davon ausgehen, dass es Probleme geben wird. Möglicherweise benötigen Sie eine session.evict(address), bevor Sie die ID auf null setzen.

0

Dadurch wird keine tiefe Kopie erstellt ... also bezieht sich Ihre Kopie auf Kinderobjekte von Originalobjekten.

2

Verwenden Sie Kaskade Evict für das Objekt im Ruhezustand.

dann

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