java - que - Mapear un tinyint como hibernación booleana
keylistener para que sirve (9)
Tengo un tipo BOOLEAN en una tabla MySQL (TINYINT (1)) y estoy tratando de asignar el campo booleano en una entidad, pero esto genera una excepción:
org.hibernate.HibernateException: Wrong column type in maegul.users for column admin. Found: bit, expected: boolean
Cambié el campo en mi entidad a byte y realizo los cambios respectivos para que actúe como booleano, y obtengo:
org.hibernate.HibernateException: Wrong column type in maegul.users for column admin. Found: bit, expected: tinyint
Intenté usar la anotación @Type
en el campo:
@Type(type = "org.hibernate.type.NumericBooleanType")
pero me sale
org.hibernate.HibernateException: Wrong column type in maegul.users for column admin. Found: bit, expected: integer
¿Qué tiene de malo mapearlo como un int y usar un descriptor de acceso (isAdmin) para obtener el valor booleano? Espero que estés ocultando el tipo real de todos modos.
Asignarlo como org.hibernate.type.BooleanType podría funcionar.
Consulte http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html/types.html#types-value-basic .
De lo que leí aquí:
org.hibernate.HibernateException: Tipo de columna incorrecto en maegul.users para la columna admin. Encontrado: bit, esperado: entero
Parece que Hibernate está esperando un entero y tiene un poco.
Lo que significa que tu anotación ahora es correcta:
@Type(type = "org.hibernate.type.NumericBooleanType")
Pero tal vez haya actualizado su base de datos para establecer como Bit en lugar de entero, por lo tanto, el error.
Si realmente necesita un TinyInt, puede usar @Type
AND @Column
, para establecer como Integer, de tipo TinyInt:
@Column(columnDefinition = "TINYINT")
@Type(type = "org.hibernate.type.NumericBooleanType")
public boolean admin = true;
La anotación @Type es una anotación de hibernación para usar con JPA, se puede usar el atributo ColumnDefiniton.
@Column(nullable = false, columnDefinition = "TINYINT(1)")
private boolean isTrue;
Me encontré con una situación similar con hibernación hoy y terminé teniendo el tipo de datos mysql como tinyint (1) y declaré el tipo de hibernación como booleano e hizo el truco
Mejor uso BIT(1)
lugar de TINYINT(1)
@Column(nullable = false, columnDefinition = "BIT", length = 1)
private boolean flag = false;
Prueba esto:
<property name="isPaymentReceived" type="java.lang.Boolean">
<column name="IS_PAYMENT_RECEIVED" sql-type="tinyint"/>
</property>
Pude resolver este problema agregando "TransformBitIsBoolean = true" a mi cadena de conexión MySQL.
Vea esta pregunta: "Encontrado: bit, esperado: booleano" después de la actualización de Hibernate 4
Y esta publicación del foro: https://hibernate.atlassian.net/browse/HHH-6935
Puede hacerlo desde Dialect, que no requerirá una tediosa anotación de nivel de col en todos los lugares:
import org.hibernate.Hibernate;
importar org.hibernate.dialect.PostgreSQLDialect;
import java.sql.Types;
La clase pública PostgresCustomConversionDialect extiende PostgreSQLDialect {
public PostgresCustomConversionDialect() {
super();
this.registerColumnType( Types.BIT, "numeric(1, 0)" );
this.registerColumnType( Types.BOOLEAN, "numeric(1, 0)" );
}
public String toBooleanValueString(boolean bool) {
return bool ? "1" : "0";
}
}
Luego use este dialecto personalizado como dialecto postgres en "hibernate.dialect"