¿Cuál es la mejor manera de copiar el registro en la misma tabla?Cómo copiar registros utilizando Hibernate (en Java)?
Algo así:
Address address = AddressDAO.get(id);
address.setId(null);
AddressDAO.add(address);
¿Cuál es la mejor manera de copiar el registro en la misma tabla?Cómo copiar registros utilizando Hibernate (en Java)?
Algo así:
Address address = AddressDAO.get(id);
address.setId(null);
AddressDAO.add(address);
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);
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.
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.
Esto no hará una copia profunda ... por lo que su copia se referirá a objetos secundarios de objetos originales.
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);
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
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