Ich habe einen BOOLEAN-Typ in einer MySQL-Tabelle (TINYINT (1)) und ich versuche, das boolesche Feld in einer Entität abzubilden. Dies generiert jedoch eine Ausnahme:
org.hibernate.HibernateException: Wrong column type in maegul.users for column admin. Found: bit, expected: boolean
Ich habe das Feld in meiner Entität in Byte geändert und die entsprechenden Änderungen vorgenommen, damit es boolesch wirkt und ich erhalte:
org.hibernate.HibernateException: Wrong column type in maegul.users for column admin. Found: bit, expected: tinyint
Ich habe versucht, die Annotation @Type
für das Feld zu verwenden:
@Type(type = "org.hibernate.type.NumericBooleanType")
aber ich bekomme:
org.hibernate.HibernateException: Wrong column type in maegul.users for column admin. Found: bit, expected: integer
Von dem, was ich hier lese:
org.hibernate.HibernateException: Falscher Spaltentyp in maegul.users für die Spalte admin. Gefunden: bit, erwartet: integer
Es scheint, als würde Hibernate eine ganze Zahl erwarten und etwas bekommen.
Was bedeutet Ihre Anmerkung jetzt richtig ist:
@Type(type = "org.hibernate.type.NumericBooleanType")
Aber vielleicht hat es Ihre Datenbank aktualisiert, um als Bit anstelle von Integer gesetzt zu werden, also den Fehler.
Wenn Sie wirklich ein TinyInt benötigen, können Sie @Type
AND @Column
verwenden, um als Integer den Typ TinyInt festzulegen:
@Column(columnDefinition = "TINYINT")
@Type(type = "org.hibernate.type.NumericBooleanType")
public boolean admin = true;
Verwenden Sie BIT(1)
besser als TINYINT(1)
@Column(nullable = false, columnDefinition = "BIT", length = 1)
private boolean flag = false;
Versuche dies:
<property name="isPaymentReceived" type="Java.lang.Boolean">
<column name="IS_PAYMENT_RECEIVED" sql-type="tinyint"/>
</property>
Ich konnte dieses Problem lösen, indem ich meiner MySQL-Verbindungszeichenfolge "transformBitIsBoolean = true" hinzufügte.
Diese Frage sehen: "Gefunden: bit, erwartet: boolean" nach Hibernate 4-Upgrade
Und dieser Forumsbeitrag: https://hibernate.atlassian.net/browse/HHH-6935
Sie können dies von Dialect aus tun, was nicht an allen Stellen eine langwierige Col-Level-Annotation erfordert:
import org.hibernate.Hibernate;
import org.hibernate.dialect.PostgreSQLDialect;
java.sql.Types importieren;
public class PostgresCustomConversionDialect erweitert 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";
}
}
Verwenden Sie diesen benutzerdefinierten Dialekt dann als Postgres-Dialekt in "hibernate.dialect".
Was ist falsch daran, es als int zuzuordnen und einen Accessor (isAdmin) zu verwenden, um den booleschen Wert zu erhalten. Ich hoffe, dass Sie den tatsächlichen Typ trotzdem verdecken.
Das Zuordnen als org.hibernate.type.BooleanType kann funktionieren.
Siehe http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html/types.html#types-es-value-basic .
Ich bin heute mit Hibernate in eine ähnliche Situation geraten und hatte am Ende den mysql-Datentyp als tinyint (1) und den Hibernate-Typ als boolean deklariert
@Type Annotation ist Hibernate Annotation Zur Verwendung mit JPA kann das ColumnDefiniton-Attribut verwendet werden.
@Column(nullable = false, columnDefinition = "TINYINT(1)")
private boolean isTrue;