Estoy usando un db relacional usando una sola columna pk con algunas tablas anidadas. Necesito agregar un archivo simple a mi proyecto. El archivado solo ocurre cuando la aplicación alcanza un estado particular, entonces lo que esperaba hacer era copiar mi objeto de hibernación existente en una nueva instancia donde la nueva instancia se guardará con una nueva ID, dejando intacto el objeto existente. Parece que no puedo entender cómo copiar el objeto existente en una nueva instancia sin tener que configurar manualmente cada campo de instancia nuevo. ¿Alguien sabe de una manera simple de hacer esto?hibernate los valores de los objetos de copia en un nuevo objeto con el nuevo ID generado
Respuesta
También estoy trabajando con Hibernate y obtuve el mismo requisito que obtuviste. Lo que seguí fue implementar Cloneable
. A continuación se muestra un ejemplo de código de cómo hacerlo.
class Person implements Cloneable {
private String firstName;
private String lastName;
public Object clone() {
Person obj = new Person();
obj.setFirstName(this.firstName);
obj.setLastName(this.lastName);
return obj;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
}
O podría ir a una solución basada en la reflexión, pero no lo recomendaré. Compruebe esto website para más detalles.
Puede clonar el objeto y borrar la identificación y guardarla de nuevo para que se le asigne una nueva identificación.
así
Person person = EmployeeDAO.get(empId);
Person newPersonCopy = person.createCopyWithNoId()
EmployeeDAO.add(newPersonCopy);
en este caso el createCopyWithNoId() crearía un clon del objeto y establecer el campo Id a null. cuando agregue el nuevo clon, el motor de hibernación lo verá ya que un nuevo objeto lo mantendrá y la base de datos asignará una nueva clave principal.
Observe que evité llamar al método clone porque lo que sale no es un clon exacto ya que manipulamos el Id (configurándolo nulo);
Otra forma de hacerlo sería agregar un constructor que tomara un objeto de tipo persona y creara un nuevo objeto, pero simplemente no configuró el campo Id dejándolo en su valor predeterminado de nulo. De nuevo, persiste usando el DAO.
Podría explicar un poco más sobre esto. No estoy del todo seguro de lo que es createCopyWithNoId. Creo que es donde necesito una aclaración. Además, ¿podría esto realizar un clon profundo? –
O bien puede clonar si el objeto es clonable o puede definir un método/constructor para el objeto que desea copiar tomando un parámetro de sí mismo y copiando todo lo que necesita, en una nueva instancia y devolvérselo.
Simplemente recupere el objeto, sepárelo, establezca el identificador en nulo y consérvelo.
MyEntity clone = entityManager.find(MyEntity.class, ID);
entityManager.detach(clone);
clone.setId(null);
entityManager.persist(clone);
Si el objeto tiene relaciones uno a muchos, que tendrá que repetir la operación para todos los niños, pero el establecimiento de su Identificación del objeto padre (generada después de la llamada persist
) en lugar de null.
Por supuesto, tendrá que eliminar CASCADE persist
en sus relaciones con OneToMany, de lo contrario su persistirá creará duplicados de todos los elementos secundarios en las fallas de DB o fk constraint.
funciona como esperaba –
Esperaba que este enfoque funcionara pero .... sorpresa, sorpresa I una excepción org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke() al intentar restablecer el id – Legna
en un niño? ¿Lo separó bef mineral ? (detach no es recursivo a menos que con cascadeType = DETACH) – Gab
Eche un vistazo al siguiente enlace. uno de los más poderosos mecanismo de clonación que pueden ser utilizados de manera más eficaz con Hibernate
http://thoughtfulsoftware.blogspot.in/2013/05/using-variable-depth-copy-to-prevent.html
- 1. Guardar nuevo objeto con Hibernate usando el ID suministrado
- 2. LINQ seleccionar al nuevo objeto, el establecimiento de los valores de objeto en función de
- 3. Nuevo {objeto} vs {objeto} = nuevo {objeto}
- 4. AutoMapper: Mapa de la DTO de nuevo a objeto de dominio con los objetos secundarios
- 5. jQuery .clone .insertDespués con un nuevo ID
- 6. Automapper: actualice los valores de las propiedades sin crear un nuevo objeto
- 7. El uso de 'retorno' al crear objetos con 'nuevo'
- 8. LINQ seleccionar al nuevo objeto
- 9. Devolución de un nuevo objeto junto con otro valor
- 10. ¿Se inician los BroadcastReceivers de Android en un nuevo hilo?
- 11. ¿Cómo hibernate los ID de los campos generados automáticamente?
- 12. Los objetos inmutables con inicializadores de objeto
- 13. AS3 {} vs nuevo objeto
- 14. Acerca de obtener un nuevo objeto NSManagedObject
- 15. ¿Es posible eliminar un objeto no nuevo?
- 16. Añadir nuevo objeto a la matriz
- 17. Generador de ID para los objetos creados
- 18. Copiando el padre de MySQL y todos los registros secundarios relacionados en la base de datos a un nuevo ID
- 19. Nuevo esquema XSD en Hibernate 4
- 20. ¿Cómo inicializar limpiamente los atributos en Ruby con nuevo?
- 21. objeto o sólo los ID
- 22. Cómo reemplazar un objeto en un NSMutableArray en un índice dado con un nuevo objeto
- 23. C++ Objeto sin nuevo
- 24. C# DateTime siempre crea un objeto nuevo?
- 25. obtener nuevo ID de registro SQL
- 26. Preservar los valores de mapa de bits al crear un nuevo mapa de bits desde System.Drawing.Image
- 27. (Nuevo objeto()). Método() en VB.net
- 28. Php: ¿Paréntesis al crear un objeto nuevo?
- 29. Nuevo objeto Mysqli es nulo
- 30. Crear nuevo objeto de lista en Python
¿Cómo se manejan las tablas anidadas, como oneToMany, etc.? Tenía miedo de tener que volver a establecer todas las variables del objeto.:( –
Mi caso no tenía que ver con objetos anidados, así que no me enfrenté a ese problema ... Me temo que tendrás que copiar en profundidad ... Siempre hay generación que se puede hacer ... – Chan
¿Podría señalarme? a un artículo sobre la generación? –