2010-06-01 9 views
5

Tengo una clase con un atributo booleano. Cuando instancia y persisto esta clase, el atributo booleano se almacena con el valor "falso" en lugar del "nulo" esperado. ¿Cómo puedo establecer un atributo booleano en "Nulo"?¿Cómo inserto el valor nulo en un atributo booleano cuando uso Hibernate?

+2

Morte Rolo ¿Puedes mostrar tu clase y su mapeo? –

+0

@Arthur Ronald F D Garcia: Es solo una clase @Entity regular con un atributo @Column Boolean. –

+0

Su base de datos debe estar haciendo esto. ¿Qué base de datos y qué tipo de columna estás usando? –

Respuesta

3

Este es un problema raro. Se supone que un atributo Boolean con un valor null se almacena como NULL y el tipo de columna tinyint lo permite. No puedo investigar el problema yo mismo, pero esto es lo que haría:

Primero, activaría el registro de las declaraciones DML de Hibernate y de los parámetros de JBDC para confirmar que Hibernate realmente está pasando NULL (y debería). Las categorías relevantes (capítulo 3.5. Logging) son org.hibernate.SQL y org.hibernate.type.

Si la primera prueba no revela el problema, trataría de aislarlo aún más con una clase de prueba simple utilizando JDBC sin procesar para insertar un valor Boolean con null (y también lo leí). Si esta prueba no es positiva, entonces comenzaría a sospechar del controlador JDBC.

¿Qué controlador JDBC (y versión) está utilizando por cierto? Si está utilizando el controlador de Microsoft, intente con la última versión de jTDS (e inversamente).

4

Primero, asegúrese de definir un objeto Boolean y no un tipo boolean.

Luego, si está utilizando Hibernate con atributos JPA, puede agregar @Column(nullable=true) para decirle explícitamente a Hibernate que la columna debe tener NULL como valor predeterminado.

+3

atributo nullable es, de manera predeterminada, verdadero –

+0

Esto no funciona ... –

+1

¿Cuál es el esquema de su tabla? ¿Permite valores NULL en esa columna? Además, puede intentar depurar el código donde crea una nueva instancia. Tal vez el valor se inicializa a falso en tu código. – Marc

2

Primero se asegura de que el objeto que intenta persistir sea Booleano no primitivo booleano. En segundo lugar, puede definir la columna correspondiente como char (1) que puede contener 'Y', 'N' o valor nulo. y por último, y lo más importante añadir la siguiente línea al que hibernate.cfg.xml: -

<property name="query.substitutions">'Y'=true,'N'=false</property> 

si u está utilizando hibernate.properties archivo a continuación, utilizar lo siguiente: -

hibernate.query.substitutions true 'Y', false 'N' 

esto ayudaría Saliste para almacenar valores nulos en la columna de tipo booleano. y no olvide mapear la propiedad como type = "boolean" en el archivo de mapeo.

Cuestiones relacionadas