2010-11-17 13 views

Respuesta

2

Funcionaría, pero es mejor si expresas tu intención (clonación) en tu modo de dominio. Establecer un campo como nulo es solo un detalle de implementación y no tiene ningún significado.

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

El problema que veo con esto es que si address.cloneMe() simplemente establece el identificador de nulo, el nombre del método es una mentira. Llamar por sí solo no produce un clon, sigue siendo el mismo objeto. – waxwing

+0

Es un método de clonación. El objeto original no se ve afectado. Devuelve una nueva instancia. Podrías expresarlo como un constructor de copia, pero prefiero la expresividad de un método (nombrado) para eso. – cherouvim

5

Sí, eso debería funcionar.

No estoy seguro de si hibernate no comprueba referencias de objetos, por lo que si esto no funciona puede necesitar crear una nueva instancia y copiar todas las propiedades (usando BeanUtils.copyProperties, o incluso BeanUtils.cloneBean(..)), y luego configurar la ID para null/0.

1

Sugiero que lo intentes. Si adress sigue siendo persistente (vinculado a la sesión), supongo que habrá problemas. Es posible que necesite un session.evict(address) antes de establecer el id como nulo.

0

Esto no hará una copia profunda ... por lo que su copia se referirá a objetos secundarios de objetos originales.

2

Usar en cascada Desalojar para ese objeto en hibernación.

continuación

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