java mysql hibernate jpa jpa-2.0

java - Hibernate JPA, MySQL y TinyInt(1) para Boolean en lugar de bit o char



jpa-2.0 (4)

Aquí está mi definición de JPA2 / Hibernate:

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

En MySql, esta columna se resuelve en un bit (1) tipo de datos, que no funciona para mí. 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?


@Type annotation es una anotación Hibernate.

En JPA2 completo (con Hibernate 3.6+ ), la forma de asignar un campo booleano a un tipo TINYINT (1) SQL en lugar de BIT (1), es usar 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, luego usamos (1) sintaxis.

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

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

Parece que en este caso, tu única forma es usar tinyInt1isBit = false en la cadena de conexión de fuente de datos MySQL como esta:

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

Por cierto, ahora puedes usar el atributo de longitud de esta manera:

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


Estoy usando JPA con Spring Data / Hibernate 5.0 en una base de datos MySQL.

En mi objeto Entity, pongo lo siguiente:

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

Mi entorno de desarrollo tiene hibernate auto-ddl configurado para actualizar, por lo que cuando implementé en dev, creó la tabla con column_name de tipo tinyint (1).

Mi código que usa esta columna considera nulo como falso, por lo que no estoy preocupado por 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 completamente JPA (no utiliza la anotación de Tipo de Hibernación) y no requiere cambios en la cadena de conexión.


Pruebe el NumericBooleanType . Por alguna razón, esto no tiene un nombre de tipo corto declarado, así que tendrías que usar:

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

Esto se asigna a un tipo INTEGER pero probablemente funcionará bien con un TINYINT.

ACTUALIZACIÓN: org.hibernate.type.NumericBooleanType 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.


Tuve este error:

Causado por: org.springframework.beans.factory.BeanCreationException: Error al crear bean con el nombre ''sessionFactory'' definido en el recurso ServletContext [/WEB-INF/config/context-config.xml]: Falló la invocación del método init; la excepción anidada es org.hibernate.MappingException: no se pudo determinar el tipo para: org.hibernate.type.NumericBooleanType, en la tabla: bookingItem, para las columnas: [org.hibernate.mapping.Column (enabled)]

Y esto funcionó para mí:

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