Combinar la APP del gestor de entidades sin cambios en el objeto

Ville Lehtonen:

Estoy tratando de utilizar el método de combinación de la Entidad Manager para actualizar un objeto en una base de datos cuando no hay cambios en el objeto. Di la fila tiene los siguientes atributos:

id             DECIMAL(11) NOT NULL,
name           CHAR(20) NOT NULL, 
lastModified   TIMESTAMP NOT NULL FOR EACH ROW ON UPDATE AS ROW CHANGE TIMESTAMP

Y decir que tengo un objeto (Digamos que es una persona) en una base de datos con los siguientes atributos:

{id: 1, name: "example", lastModified: 2019-05-22 16:24:54.771}

Por lo que el atributo lastModified es algo que el PP se actualiza cada vez que hay un cambio en la fila.

Ahora cuando estoy en primer lugar ir a buscar el objeto y luego actualizar el nombre de la persona a "ejemplo" (el mismo valor que ya tiene en la base de datos), y luego mediante el uso de combinación de actualizarla, el atributo lastModified no parece que la actualización en el PP. es decir

Person person = em.find(Person.class, 1)
person.setName("example")
em.merge(person)

Después de las acciones anteriores, la lastModified es todavía 22/05/2019 16: 24: 54.771 (el mismo que anteriormente). Ahora bien, si yo hubiera cambiado el nombre es decir,

Person person = em.find(Person.class, 1)
person.setName("new name")
em.merge(person)

Así que ahora la lastModified habría actualizado también.

Cualquier ayuda con esto? Podría alguien por favor me explique por qué la fila no se actualiza cuando no hay cambios realizados en el objeto? :) ¡Gracias!

Marcelo Wippel:

Cuando se utiliza merge, Hibernate primero se ejecuta una instrucción Select en la tupla que está tratando de fusión. Este selecto se ejecuta para obtener el último estado de la tupla, a continuación, ejecutar la actualización de la base de datos, con los datos que han cambiado en su tupla.

Como se dice en su ejemplo, usted no ha cambiado ningún dato, ya que estamos tratando de actualizar el nombre de la misma como lo era antes, de modo de hibernación no se ejecutará cualquier actualización de la base de datos.

Puede leer más sobre esto en referencia a Hibernate sucio mecanismo de comprobación.

Si realmente desea actualizar esta columna, incluso cuando no cambiaron de datos, tiene que hacerlo en la capa de aplicación, estableciendo de forma manual al guardar el objeto Person:

person.setLastModified(LocalDateTime.now())

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=335746&siteId=1
Recomendado
Clasificación