hibernate - example - ¿Diferencias entre save, update, saveOrUpdate, fusionar métodos en Session?
sessionfactory save or update (7)
Soy nuevo en Hibernate y asistí al tutorial de Hibernate la semana pasada. Tengo algunas dudas sobre los métodos guardar, actualizar, guardarOrUpdate y fusionar en la clase Session. Estos son:
método save: se usa para insertar el objeto recién creado en el almacén de datos. (El valor del identificador básico será 0 para esto). Al igual que crear una nueva operación de salvar llamada y cliente, la mantendrá en el almacén de datos y generará el identificador.
¿Es esto correcto? Y si llamamos guardar en objeto persistente, ¿no está seguro de lo que sucederá?
método de actualización: se usa para actualizar el objeto ya persistente en el almacén de datos. (El valor del identificador básico será algún valor distinto de cero para esto). Al igual que cargo un nuevo cliente y llamo a la operación de actualización después de la actualización de algún valor de campo, lo actualizará en el almacén de datos.
Según mi entendimiento, debería fallar con alguna excepción porque según la actualización de la API es para el objeto separado. ¿Es esto correcto? En caso afirmativo, ¿a qué deberíamos llamar para actualizar el objeto en la misma sesión (quiero decir si el objeto no está separado)? Otro punto es: ¿qué pasará si llamamos a la actualización sobre un objeto recién creado?
Método saveOrUpdate: llamará a cualquiera de los anteriores basándose en comprobaciones de valores no guardados (que deben estar basados en cero identificador o valor distinto de cero, ¿no?) así que si tenemos un objeto cliente persistente y actualizamos su apellido y creamos un nueva cuenta también, luego saveOrUpdate se encargará de eso.
¿Entendí eso correctamente?
Método de combinación: actuará como una actualización, pero aquí, si un objeto persistente con el mismo identificador ya está en la sesión, actualizará los valores del objeto separado en el objeto persistente y lo guardará.
Pero si no hay ninguna instancia persistente actualmente asociada con la sesión, esto cargará el objeto persistente del almacén de datos y luego actualizará el valor del objeto separado en el objeto persistente cargado y luego lo actualizará.
¿También lo entendí?
@Naliba ha dado una respuesta excelente sobre el método Update ().
El ciclo de vida de Hibernate en la siguiente imagen ayuda a tener una idea por encima de los métodos.
Ejemplo: Veamos la situación del método merge()
.
SessionFactory factory = cfg.buildSessionFactory();
Session session1 = factory.openSession();
Student student1 = null;
Object object1 = session1.get(Student.class, new Integer(101));
student1 = (Student)object1;
session1.close();
student1.setMarks(97);// -->object will be in some RAM location, not in the session1 cache
Session session2 = factory.openSession();
Student student2 = null;
Object object2 = session2.get(Student.class, new Integer(101));
student2 = (Student)object2;
Transaction tx=session2.beginTransaction();
session2.merge(student1);
Por encima de student1
está en estado separado, modificado ese objeto separado student1
, ahora si llamamos al método update()
entonces hibernate arrojará un error.
En esta session2
, llamamos session2.merge(s1);
ahora en student2
object student2
cambios se fusionarán y se guardarán en la base de datos.
Debe aplicar la diferencia entre los métodos save () y saveOrUpdate en su código para obtener el mejor rendimiento:
El método save () devuelve el identificador generado por la base de datos. Por otro lado, saveOrUpdate () puede hacer INSERT o UPDATE dependiendo de si el objeto existe en la base de datos o no. Y saveOrUpdate hace una selección primero para determinar si necesita hacer una inserción o una actualización. Por lo tanto, debe usar saveOrUpdate en caso de consulta de actualización.
Otra diferencia clave entre los métodos save () y saveOrUpdate () es que el método save () se usa para hacer que un objeto transitorio sea persistente pero saveOurUpdate () puede convertir el objeto transitorio (objeto nuevo) y el objeto separado (objeto existente) en persistente . De modo que saveOrUpdate () se usa a menudo para volver a adjuntar un objeto separado en Session.
Desde la publicación Diferencia entre guardar y guardarOrUpdate en Hibernate
Fusionar sigue
Merge tiene inteligencia. Tiene muchas verificaciones previas antes de ir a la fusión real (si es necesario)
- si Object es transitorio, simplemente activa INSERT la consulta hace que el objeto sea persistente (se adjunta a la sesión)
- si Object está separado, se activa la consulta de selección para verificar si los datos se han modificado o no si se han modificado, se activa la consulta de ACTUALIZACIÓN o se ignora la tarea de fusión.
donde como session.update
- arroja una excepción si el objeto es transitorio.
- si Object está separado, simplemente activa la consulta de ACTUALIZACIÓN independientemente de los cambios de datos en el objeto.
session.merge es costoso que la actualización
Tiene la mayoría de las cosas correctas, pero la actualización funciona de forma un poco diferente de cómo la describió. Si un objeto está en la sesión (es decir, persistente), la actualización es completamente innecesaria. Hibernate maneja la persistencia de cualquier cambio en los objetos en la sesión cuando se vacía la sesión. Llamar a la actualización sobre ellos no hará nada (y puede incurrir en una penalización de rendimiento, no estoy seguro).
La actualización está diseñada para ser invocada en objetos separados, es decir, aquellos que están ahora fuera de la sesión en la que se cargaron. La explicación de @hvgotcodes parece ser incorrecta, porque la actualización solo debe invocarse si el objeto no está en la sesión. la actualización puede fallar si ya hay una instancia del objeto en la sesión. Merge debería usarse en ese caso. Combina los cambios del objeto separado con un objeto en la sesión, si existe. Si no hay ningún objeto en la sesión, creará uno nuevo.
Muy a menudo puede evitar llamar a la actualización / fusión en absoluto, pero si termina teniendo que llamar a uno, la combinación maneja un rango más amplio de situaciones. Según tengo entendido, la única razón para usar la actualización es para obtener un mejor rendimiento, suponiendo que sepa que no habrá error.
Este hilo tiene un muy buen resumen de algunos otros métodos de hibernación, también.
Editar: Solo pensé que debería decir que hay más diferencias entre fusión y actualización de lo que dije originalmente. La actualización modifica la entidad dada para que sea persistente, mientras que la fusión devuelve una nueva entidad persistente. Para fusionarse, se supone que debes tirar el viejo objeto. Otra diferencia es fusionar hace un cheque sucio seleccionando desde el DB antes de decidir si escribe sus datos, mientras que la actualización siempre conserva sus datos en el DB si está sucio o no.
Probablemente haya otras pequeñas diferencias. Siempre es bueno probar el comportamiento de Hibernate registrando el SQL generado, porque el comportamiento no siempre coincide con los documentos, al menos en mi experiencia.
Usted tiene exactamente razón en todas sus evaluaciones. Usted lo consigue.
Para su primera pregunta, si no recuerdo mal, save
específicamente un inserto. Entonces, al volver a llamar, se generará otra fila en el archivo db.
Para su segunda pregunta, la update
actualiza un objeto en la sesión. Entonces, si el objeto está en la sesión, se actualizará. Si el objeto no está en la sesión, debe llamar a merge. Creo que llamar a la update
de una instancia separada dará como resultado una excepción.
session.update () - Se usa para un escenario cuando tiene que cargar un objeto Person1 desde la sesión de hibernación. Ahora se está utilizando en la aplicación; también puede estar en el lado del cliente, se ha actualizado. Queremos guardarlo de nuevo Sabemos que no se ha realizado ningún cambio en el objeto Persona en la base de datos. Entonces podemos simplemente usar la actualización.
session.merge () - En el escenario anterior, si los cambios se han realizado en datos personales antes de guardar el objeto Person1 cambiado, entonces debemos usar merge. Combinará los cambios.
session.save () - Se puede usar para guardar un nuevo objeto. Devuelve la identidad serializable.
session.persist () - Es lo mismo que save (), pero es un método nulo y no devuelve nada.
session.saveOrUpdate () - Este método funcionará tanto para objetos nuevos como viejos. Si object es nuevo, funcionará como simple save o si el objeto ya es persistente, funcionará como update.
session.lock () - Se usa solo para tomar el objeto de bloqueo o puede decir para verificar la versión del objeto. No es para actualizar el objeto. Se debe usar para volver a conectar el objeto, solo si está seguro de que el estado del objeto ya no está cambiado en la base de datos. De lo contrario, puede anular los cambios. <Invitando más puntos sobre esto.
update()
es para los objetos separados y para objetos transitorios. si se invoca en objetos persistentes arrojará una NonUniqueObjectException
, y esto será abordado por merge()
.