2011-09-22 25 views
16

¿Hay una configuración en Hibernar a ignorar los valores nulos de las propiedades al guardar un objeto de hibernación?¿Cómo puedo evitar que Hibernate actualice los valores NULL?

NOTA
En mi caso estoy de-serializar 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 hibernate los ACTUALIZA.

Encontré 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 tiene otra idea ...

NOTA 2:

De acuerdo con la hibernación Docs la dynamicUpdateanotación hace exactamente eso

dynamicInsert/dynamicUpdate (el valor predeterminado es falso):
especifica que INSERT/UPDAT E SQL debe generarse en tiempo de ejecución y contener solo las columnas cuyos valores no son nulos.

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

divertido suficiente si lo definen en XML a través de dynamic-update el docu no mencionar el hanlding de valores NULL.

dinámica de actualización (opcional - por defecto es false):
especifica que SQL UPDATE debe ser> generada en tiempo de ejecución y puede contener sólo las columnas cuyos valores han cambiado.

Debido al hecho de que estoy usando dos anotaciones y configuración XML, hibernación parece que ignora mi dynamicUpdate=true anotación.

+0

dinámica se puede utilizar actualización para evitar propiedades que vienen en SQL que no han sido actualizados pero en general se aconseja el uso de esta opción sólo cuando la entidad tiene también propiedades (columnas> 50) [referencia: Java Persistence con la edición de Hibernate 2006]. @hvgotcodes tiene razón al señalar que no es necesario mapear los campos si nunca van a persistir. – frictionlesspulley

Respuesta

9

Primero debe cargar el objeto usando la clave primaria de DB y luego copiar o deserializar el JSON en la parte superior.

No es posible que hibernate averigüe si una propiedad con valor nulo se ha establecido explícitamente en ese valor o si se ha excluido.

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

+0

guíame en la dirección correcta. Lo mejor es cargar el objeto existente y actualizar este objeto en consecuencia. Jackson incluso tiene un comportamiento predeterminado para ese http://wiki.fasterxml.com/JacksonFeatureUpdateValue –

+0

No tengo ningún valor nulo en mi db. Entonces, nadie nunca va a anular nada explícitamente. ¿Hay alguna otra solución para mí? @gkamal –

0

He buscado mucho en Google sobre esto, pero no hay la solución para mí. Así que, utilicé una solución no elegante para cubrirlo.

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 una gran cantidad de terreno fields.Those quizá null, pero no quieren actualizarlos en MySQL. Obtengo tmp Obejct desde db, y modifico el campo por el método getNotNull, luego actualizo el objeto.

a Chinese description edition

Cuestiones relacionadas