onetomany one many ejemplo datatype hibernate null hibernate-mapping hibernate-annotations

datatype - one-to-many hibernate ejemplo



¿Cómo puedo evitar que Hibernate actualice los valores NULL? (2)

¿Hay una configuración en hibernación para ignorar valores nulos de propiedades al guardar un objeto de hibernación?

NOTA
En mi caso, estoy despializando JSON a un Hibernate Pojo a través de Jackson.

El JSON solo contiene algunos de los campos del Pojo. Si guardo el Pojo, los campos que no estaban en el JSON son nulos en el Pojo e hibernan los ACTUALIZAN.

Me encontré con la configuración updateable=false , pero esto no es una solución al 100%. http://docs.jboss.org/hibernate/stable/annotations/reference/en/html_single/#entity-mapping-property

Tal vez alguien tenga otra idea ...

NOTA 2:

De acuerdo con los documentos de Hibernate, la anotación de dynamicUpdate hace exactamente eso

dynamicInsert / dynamicUpdate (por defecto es falso):
especifica que INSERT / UPDATE SQL debe generarse en tiempo de ejecución y que contiene solo las columnas cuyos valores no son nulos .

http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html_single/#mapping-declaration-class

Es bastante divertido si lo define en XML a través de dynamic-update del documento, no mencione el manejo de valores NULL.

Actualización dinámica (opcional - por defecto es falso):
especifica que UPDATE SQL debe> generarse en tiempo de ejecución y puede contener solo aquellas columnas cuyos valores han cambiado.

Debido al hecho de que estoy usando las anotaciones Y la configuración xml, hibernate parece ignorar mi anotación dynamicUpdate=true .


He buscado mucho en Google sobre esto, pero no hay una solución para mí. Entonces, utilicé una solución no elegante para cubrirla.

public void setAccount(Account a) throws HibernateException { try { Account tmp = (Account) session. get(Account.class, a.getAccountId()); tmp.setEmail(getNotNull(a.getEmail(), tmp.getEmail())); ... tmp.setVersion(getNotNull(a.getVersion(), tmp.getVersion())); session.beginTransaction(); session.update(tmp); session.getTransaction().commit(); } catch (HibernateException e) { logger.error(e.toString()); throw e; } } public static <T> T getNotNull(T a, T b) { return b != null && a != null && !a.equals(b) ? a : b; }

Recibo un Object a que contiene muchos campos. Es posible que el campo sea null , pero no deseo actualizarlos en mysql. Obtengo un tmp Obejct de db, y cambio el campo con el método getNotNull , luego actualizo el objeto.

una edición china de la descripción


Primero debe cargar el objeto utilizando la clave principal de la base de datos y luego copiar o deserializar el JSON que se encuentra sobre él.

No hay forma de que la hibernación determine si una propiedad con valor nulo se ha establecido explícitamente en ese valor o si se excluyó.

Si es una inserción, entonces dynamic-insert = true debería funcionar.