Unterstützte Datentypen

In den letzten drei Levels haben wir uns ein wenig mit Hibernate vertraut gemacht. Es ist Zeit für die zweite Runde. Jetzt werden wir beginnen, dasselbe zu studieren, nur tiefer. Und wir beginnen damit, die Felder der Entity-Klasse den Spalten der Tabellen in der Datenbank zuzuordnen.

Wie Sie bereits wissen, erfolgt die Zuordnung eines Felds in einer Entity-Klasse zu einer Spalte mithilfe der Annotation @Column . Und nun stellt sich die Frage: Welche Arten von Feldern können mit einer solchen Annotation abgebildet werden?

Alle Datentypen in Java lassen sich in drei Gruppen einteilen:

  • Der Typ ist recht einfach und lässt sich leicht in einer Datenbank speichern .
  • Der Typ ist komplex und Sie müssen einen speziellen Konverter dafür schreiben .
  • Der Typ ist sehr komplex und benötigt eine separate Tabelle zum Speichern seiner Werte .

Zu den einfachen Typen, die Hibernate speichern kann, gehören:

Typen in Java Paket Klassenbeispiele
Primitive Java-Typen boolean , int , double usw.
Wrapper über Primitiven java.lang Boolean , Integer , Double usw.
Saiten java.lang Zeichenfolge
„Erweiterte“ Nummern java.math BigInteger und BigDecimal
Datum (und Uhrzeit java.time LocalDate , LocalTime , LocalDateTime , OffsetTime , OffsetDateTime , Instant
Verschiedene Datums- und Uhrzeitvariationen java.util Datum und Kalender
Alte Datums- und Uhrzeitformate java.sql Datum , Uhrzeit , Zeitstempel
Array von Bytes oder Zeichen byte[] oder Byte[] , char[] oder Character[]
Aufzählungen Jede Aufzählung
Serialisierbare Objekte Jede Implementierung von java.io.Serializable

Alle diese Typen haben ihre Gegenstücke in der SQL-Sprache, sodass Hibernate weiß, wie sie gespeichert und aus der Datenbank geladen werden.

Beispiel:

@Entity
@Table(name="user")
class User
{
   @Column(name="id")
   public Integer id;

   @Column(name="name")
   public String name;

   @Column(name="level")
   public Integer level;

   @Column(name="created_date")
   public Date createdDate;
}

Manuelle Typzuweisungen – @Type-Annotation

Manchmal möchten Sie möglicherweise die Richtlinie von Hibernate manipulieren und ihr explizit mitteilen, welcher Datentyp in der Datenbank gespeichert werden soll. Beispielsweise haben Sie in Ihrer Entity-Klasse ein Feld vom Typ Integer, aber in der Basis gibt es dafür eine Spalte vom Typ VARCHAR.

Dafür gibt es eine spezielle Annotation – @Type . Es sieht ganz einfach aus:

@Type(type="type-name")

Bitten wir beispielsweise Hibernate, das Feld zu erstellenErstellungsdatumunserer User- Klasse wurde in der Datenbank als String gespeichert:

@Entity
@Table(name="user")
class User
{
   @Column(name="id")
    public Integer id;

   @Column(name="created_date")
   @Type(type="org.hibernate.type.StringType")
    public Date createdDate;
}

Wenn Hibernate herausgefunden hätte, wie man den Date-Typ in Ihren neuen Typ konvertiert, würde es das einfach tun. Wenn dies nicht der Fall ist, müssen Sie einen speziellen Typkonverter angeben. Aber dazu später mehr.

Liste der Ruhezustandstypen für Datenbanken

Ist Ihnen übrigens aufgefallen, dass wir den Typ org.hibernate.type.StringType und nicht String angegeben haben ? Dies liegt daran, dass wir einen der vom DBMS und nicht von der Java-Sprache unterstützten Typen ausgewählt haben. Sie haben jeweils ihr eigenes Typensystem. Es ist nur so, dass sich die Hibernate-Entwickler anstelle dieser VARCHARs praktische Namen im Java-Stil ausgedacht haben.

Diese Liste ist übrigens gar nicht so klein. Einen Teil davon gebe ich hier wieder:

Ruhezustandstyp (org.hibernate.type-Paket) JDBC-Typ Java-Typ BasicTypeRegistry-Schlüssel
StringType VARCHAR java.lang.string Zeichenfolge, java.lang.string
materialisierter Klumpen CLOB java.lang.string materialized_clob
Texttyp LONGVARCHAR java.lang.string Text
Zeichentyp VERKOHLEN char, java.lang.Character char, java.lang.Character
BooleanType Bit boolean, java.lang.Boolean boolean, java.lang.Boolean
NumericBooleanType INTEGER, 0 ist falsch, 1 ist wahr boolean, java.lang.Boolean numeric_boolean
JaNeinTyp CHAR, 'N'/'n' ist falsch, 'Y'/'y' ist wahr. Der Großbuchstabenwert wird in die Datenbank geschrieben. boolean, java.lang.Boolean ja Nein
TrueFalseType CHAR, 'F'/'f' ist falsch, 'T'/'t' ist wahr. Der Großbuchstabenwert wird in die Datenbank geschrieben. boolean, java.lang.Boolean wahr falsch
ByteType WINZIG Byte, java.lang.Byte Byte, java.lang.Byte
kurzer Typ KLEININT kurz, java.lang.Short kurz, java.lang.Short
Ganzzahltypen GANZE ZAHL int, java.lang.Integer int, java.lang.Integer
langer Typ BIGINT lang, java.lang.Long lang, java.lang.Long
Float-Typ SCHWEBEN float, java.lang.Float float, java.lang.Float
Doppeltyp DOPPELT double, java.lang.Double double, java.lang.Double
BigIntegerType NUMERISCH java.math.BigInteger big_integer, java.math.BigInteger
BigDecimalType NUMERISCH java.math.BigDecimal big_decimal, java.math.bigDecimal
Zeitstempeltyp ZEITSTEMPEL java.sql.timestamp Zeitstempel, java.sql.timestamp
Zeittyp ZEIT java.sql.Time Zeit, java.sql.Time
Datumstyp DATUM java.sql.date Datum, java.sql.date
CalendarType ZEITSTEMPEL java.util.Calendar Kalender, java.util.Calendar
CalendarDateType DATUM java.util.Calendar Kalenderdatum
Währungstyp java.util.Currency VARCHAR Währung, java.util.Currency
LocaleType VARCHAR java.util.locale Gebietsschema, java.utility.locale
TimeZoneType VARCHAR, unter Verwendung der TimeZone-ID java.util.TimeZone Zeitzone, java.util.TimeZone
URLType VARCHAR java.net.URL URL, java.net.URL
Klassentyp VARCHAR(Klasse FQN) java.lang.Class Klasse, java.lang.Class

Der Tisch ist natürlich groß, aber sehr nützlich. Daraus geht beispielsweise hervor, dass der Typ Boolean auf mindestens sechs verschiedene Arten in der Datenbank gespeichert werden kann. Braucht man nicht so viel? Und wer hat gesagt, dass Sie den Weg zum Sparen wählen?

In SQL gibt es keinen booleschen Typ und er wird oft wie folgt gespeichert:

  • 1 oder 0
  • „F“ oder „T“
  • „Y“ oder „N“

Daher ist es sehr gut, wenn Hibernate all diese Probleme versteht. Oder nehmen wir zum Beispiel die Speicherung von Datenarrays in der Datenbank. Es gibt eine Reihe verschiedener Optionen, und Hibernate weiß, wie man mit allen umgeht:

Ruhezustandstyp (org.hibernate.type-Paket) JDBC-Typ Java-Typ BasicTypeRegistr
Blob-Typ KLECKS java.sql.blob Blog, java.sql.blob
Clobtyp CLOB java.sql.clob clob, java.sql.clob
Binärtyp VARBINÄR Byte[] binär, Byte[]
MaterializedBlobType KLECKS Byte[] materized_blob
Bildtyp LONGVARBINARY Byte[] Bild
WrapperBinaryType VARBINÄR java.lang.Byte[] wrapper-binary, Byte[], java.lang.Byte[]
CharArrayType VARCHAR verkohlen[] Zeichen, char[]
CharacterArrayType VARCHAR java.lang.Character[] Wrapper-Zeichen, Zeichen[], java.lang.Character[]
UUIDBinaryType BINÄR java.util.UUID uuid-binary, java.util.UUID
UUIDCharType CHAR, kann auch VARCHAR lesen java.util.UUID uuid-char
PostgreSQLUUIDType PostgreSQL-UUID über Types#OTHER, die der PostgreSQL-JDBC-Treiberdefinition entspricht java.util.UUID pg-uuid
Und seit der Veröffentlichung von JDK 8 hat Hibernate einige weitere zeitbezogene Typen hinzugefügt. Alles, um Ihnen das Leben zu erleichtern. Sie müssen sich nicht mehr fragen, ob alle diese neuen Typen unterstützt werden. Die Macher von Hibernate haben bereits ihre Unterstützung für Sie hinzugefügt:
Ruhezustandstyp (org.hibernate.type-Paket) JDBC-Typ Java-Typ BasicTypeRegistr
Dauertyp BIGINT java.time.Duration Dauer, java.time.Duration
Instant-Typ ZEITSTEMPEL java.time.Instant Sofort, java.time.Instant
LocalDateTimeType ZEITSTEMPEL java.time.LocalDateTime LocalDateTime, java.time.LocalDateTime
LocalDateType DATUM java.time.LocalDate LocalDate, java.time.LocalDate
LocalTimeType ZEIT java.time.LocalTime LocalTime, java.time.LocalTime
OffsetDateTimeType ZEITSTEMPEL java.time.OffsetDateTime OffsetDateTime, java.time.OffsetDateTime
OffsetTimeType ZEIT java.time.OffsetTime OffsetTime, java.time.OffsetTime
OffsetTimeType ZEITSTEMPEL java.time.ZonedDateTime ZonedDateTime, java.time.ZonedDateTime