sirve que para getkeychar evt consume java mysql hibernate types

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.



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>



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"