2010-08-01 14 views
36

Aquí está mi JPA2/Hibernate definición:Hibernate JPA, MySQL y TinyInt (1) para booleana en lugar de bits o carbón

Code: 
@Column(nullable = false) 
private boolean enabled; 

en MySQL esta columna se resuelve con un poco (1) tipo de datos - lo que hace no funciona para mi Para problemas heredados, necesito asignar el booleano a una minúscula, no un poco. Pero no veo la posibilidad de cambiar el tipo de datos predeterminado. ¿Hay alguna?

Respuesta

31

Pruebe el NumericBooleanType. Por alguna razón esto no tiene un nombre de tipo corto declarado lo que tendría que utilizar:

@Column(nullable = false) 
@Type(type = "org.hibernate.type.NumericBooleanType") 
private boolean enabled; 

Esto hace mapa para un tipo entero, pero probablemente no tendrán ningún problema con un TINYINT.

ACTUALIZACIÓN: org.hibernate.type.NumericBooleanType No no funciona con TINYINT en algunos RDBMS. Cambie el tipo de columna de la base de datos a INTEGER. O use un valor Java @Type diferente, o columnDefinition, según corresponda.

En este ejemplo, la respuesta de Dude de @Column(nullable = false, columnDefinition = "TINYINT(1)") funcionaría sin ningún cambio en la base de datos.

+0

Funciona bien, pero después de cambiar bit (1) a int – zaletniy

+0

-1, pero solo porque la respuesta @Dude es mejor. – Johan

+0

¿Funciona esto también con un objeto booleano? – Rafael

48

@La anotación de tipo es una anotación Hibernate.

En completo JPA2 (con Hibernate 3.6+), la manera de asignar un campo booleano a una TINYINT (1) Tipo de SQL en lugar de BIT (1), es utilizar el atributo ColumnDefinition.

@Column(nullable = false, columnDefinition = "TINYINT(1)") 
private boolean enabled; 

nb: el atributo de longitud parece no tener ningún efecto en este caso, entonces usamos (1) la sintaxis.


Con Hibernate 4.0 +, este tipo de sintaxis puede causar un error de ejecución así:

Wrong column type Found: bit, expected: TINYINT(1) 

Parece ser que en este caso, la única manera es utilizar tinyInt1isBit = false en la cadena de conexión de origen de datos MySQL como esto:

jdbc:mysql://server_host:3306/database?tinyInt1isBit=false 

Por cierto, ahora se puede utilizar t atributo de longitud que de esta manera:

@Column(nullable = false, columnDefinition = "TINYINT", length = 1) 
private boolean enabled; 
+0

muchas gracias hermano! –

+3

Desde los alias de MySQL 'BOOLEAN' a' TINYINT (1) 'también se puede usar' columnDefinition = "BOOLEAN" ', que podría ser un poco más legible. – eggyal

+0

tiene razón, también puede usar el alias BOOLEAN con MySQL siempre que el alias esté establecido en TINYINT, lo cual es cierto por ahora. Por cierto, BOOLEAN y TINYINT no son tipos de datos SQL estándar, por lo que corre el riesgo de fallar si cambia el dialecto de su proveedor de datos (por ejemplo, Oracle). – Donatello

1

tuve este error:

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in ServletContext resource [/WEB-INF/config/context-config.xml]: Invocation of init method failed; nested exception is org.hibernate.MappingException: Could not determine type for: org.hibernate.type.NumericBooleanType, at table: bookingItem, for columns: [org.hibernate.mapping.Column(enabled)]

Y esto funcionó para mí:

@Column(nullable = false, columnDefinition = "TINYINT(1)") 
private boolean enabled; 
1

estoy usando JPA con la primavera de datos/Hibernate 5.0 en una base de datos MySQL

En mi objeto Entity, pongo el siguiente:

@Column(name = "column_name", columnDefinition = "BOOLEAN") 
private Boolean variableName; 

Mi entorno de desarrollo tiene hibernación de auto-ddl conjunto de actualizar, por lo que cuando desplegué a dev, se crea la tabla con nombre_columna de tipo tinyint (1).

Mi código que utiliza esta columna considera nulo como falso, por lo que no me preocupan los nulos, si lo es, podría convertirlo en un booleano primitivo o agregar ", nullable = falso" a la anotación de Columna.

Esta solución es totalmente JPA (no utiliza la anotación de Tipo de hibernación) y no requiere cambios en la cadena de conexión.

Cuestiones relacionadas