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 |
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 |
GO TO FULL VERSION