wake-up-neo.com

Planen Sie eine kleine Münze als booleschen Winterschlaf

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
28
Alvin Baena

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;
34
Cyril N.

Verwenden Sie BIT(1) besser als TINYINT(1)

@Column(nullable = false, columnDefinition = "BIT", length = 1)
private boolean flag = false;
7
Andrew

Versuche dies: 

  <property name="isPaymentReceived" type="Java.lang.Boolean">
  <column name="IS_PAYMENT_RECEIVED" sql-type="tinyint"/>
</property>
2
Piraba

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

1
Matthias Wuttke

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".

0
Mudit Verma

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.

0
Thom

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 .

0
Daan

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

0
JavaMan

@Type Annotation ist Hibernate Annotation Zur Verwendung mit JPA kann das ColumnDefiniton-Attribut verwendet werden.

@Column(nullable = false, columnDefinition = "TINYINT(1)")
private boolean isTrue;
0
Ali Arda Orhan