Understøttede datatyper

I løbet af de foregående tre niveauer blev vi lidt fortrolige med Hibernate. Det er tid til anden runde. Nu vil vi begynde at studere det samme, kun dybere. Og vi starter med at kortlægge felterne i Entity-klassen til kolonnerne i tabellerne i databasen.

Som du allerede ved, tilknyttes et felt i en Entity-klasse til en kolonne ved hjælp af @Column- annotationen . Og nu er spørgsmålet: hvilke typer felter kan kortlægges med sådan en annotering?

Alle datatyper i Java kan opdeles i tre grupper:

  • Typen er ret enkel og nem at gemme i en database .
  • Typen er kompleks, og du skal skrive en speciel konverter til den .
  • Typen er meget kompleks og har brug for en separat tabel for at gemme dens værdier .

Simple typer, som Hibernate ved, hvordan man opbevarer, omfatter:

Typer i Java pakke Klasseeksempler
Primitive Java-typer boolean , int , double osv.
Indpakning over primitiver java.lang Boolean , heltal , dobbelt osv.
Strenge java.lang Snor
"Avancerede" numre java.math BigInteger og BigDecimal
dato og tid java.tid LocalDate , LocalTime , LocalDateTime , OffsetTime , OffsetDateTime , Instant
Forskellige dato og klokkeslæt variationer java.util dato og kalender
Gamle dato- og tidsformater java.sql Dato , Tid , Tidsstempel
Array af bytes eller tegn byte[] eller Byte[] , char[] eller Character[]
Enums Enhver opregning
Serialiserbare objekter Enhver implementering af java.io.Serializable

Alle disse typer har deres modstykker i SQL-sproget, så Hibernate ved, hvordan man gemmer og indlæser dem fra databasen.

Eksempel:

@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 typetildelinger - @Typeanmærkning

Nogle gange vil du måske manipulere med Hibernates politik og udtrykkeligt fortælle den, hvilken type data skal lagres i databasen. For eksempel har du et felt i din Entity-klasse af typen Integer, men i basen er der en kolonne for det med typen VARCHAR.

Der er en særlig anmærkning til dette - @Type . Det ser meget simpelt ud:

@Type(type="type-name")

Lad os for eksempel bede Hibernate om at lave feltetoprettet datoaf vores brugerklasse blev gemt i databasen som en streng :

@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;
}

Hvis Hibernate fandt ud af, hvordan man konverterer datotypen til din nye type, så ville den bare gøre det. Hvis det ikke forstår det, bliver du nødt til at angive en speciel type konverter. Men mere om det senere.

Liste over dvaletyper til databaser

Forresten, lagde du mærke til, at vi specificerede typen org.hibernate.type.StringType , ikke String . Dette skyldes, at vi har valgt en af ​​de typer, der understøttes af DBMS og ikke af Java-sproget. De har hver deres typesystem. Det er bare, at Hibernate-udviklerne fandt på praktiske navne i Java-stil i stedet for disse VARCHAR'er.

Denne liste er i øvrigt ikke så lille. Jeg giver en del af det her:

Hibernate-type (org.hibernate.type-pakke) JDBC type Java type BasicTypeRegistry nøgle(r)
StringType VARCHAR java.lang.string streng, java.lang.streng
materialiseret klump KLUB java.lang.string materialized_clob
teksttype LONGVARCHAR java.lang.string tekst
tegntype CHAR char, java.lang.Karakter char, java.lang.Karakter
BooleanType lidt boolesk, java.lang.Boolean boolesk, java.lang.Boolean
NumericBooleanType HELTAL, 0 er falsk, 1 er sand boolesk, java.lang.Boolean numerisk_boolesk
YesNoType CHAR, 'N'/'n' er falsk, 'Y'/'y' er sand. Den store værdi skrives til databasen. boolesk, java.lang.Boolean Ja Nej
TrueFalseType CHAR, 'F'/'f' er falsk, 'T'/'t' er sandt. Den store værdi skrives til databasen. boolesk, java.lang.Boolean sandt falsk
ByteType TINYINT byte, java.lang.Byte byte, java.lang.Byte
kort type SMALLINT kort, java.lang.Short kort, java.lang.Short
Heltalstyper HELTAL int, java.lang.Integer int, java.lang.Integer
lang type STORT lang, java.lang.Lang lang, java.lang.Lang
flydetype FLYDE flyde, java.lang.Float flyde, java.lang.Float
dobbelt type DOBBELT dobbelt, java.lang.Dobbelt dobbelt, java.lang.Dobbelt
BigIntegerType NUMERISK java.math.BigInteger big_integer, java.math.BigInteger
BigDecimalType NUMERISK java.math.BigDecimal big_decimal, java.math.bigDecimal
TidsstempelType TIDSSTEMPEL java.sql.tidsstempel tidsstempel, java.sql.tidsstempel
Tidstype TID java.sql.Time tid, java.sql.Time
datotype DATO java.sql.date dato, java.sql.dato
Kalendertype TIDSSTEMPEL java.util.Calendar kalender, java.util.Calendar
CalendarDateType DATO java.util.Calendar kalender_dato
CurrencyType java.util.Currency VARCHAR valuta, java.util.Valuta
LocaleType VARCHAR java.util.locale locale, java.utility.locale
TimeZoneType VARCHAR ved hjælp af TimeZone ID java.util.TimeZone tidszone, java.util.TimeZone
UrlType VARCHAR java.net.URL url, java.net.URL
klassetype VARCHAR(klasse FQN) java.lang.Klasse klasse, java.lang.Klasse

Bordet er selvfølgelig stort, men meget anvendeligt. For eksempel fremgår det tydeligt af den, at den boolske type kan lagres i databasen på mindst seks forskellige måder. Har du ikke brug for så meget? Og hvem sagde, at du vælger måden at spare på?

Der er ingen boolsk type i SQL, og den er ofte gemt sådan:

  • 1 eller 0
  • 'F' eller 'T'
  • 'Y' eller 'N'

Derfor er det meget godt, når Hibernate forstår alle disse problemer. Eller lad os for eksempel tage lagringen af ​​dataarrays i databasen. Der er en masse forskellige muligheder, og Hibernate ved, hvordan man arbejder med dem alle:

Hibernate-type (org.hibernate.type-pakke) JDBC type Java type BasicTypeRegistr
klat type BLOB java.sql.blob blog, java.sql.blob
clobtype KLUB java.sql.clob clob, java.sql.clob
BinærType VARBINARY byte[] binær, byte[]
Materialiseret BlobType BLOB byte[] materized_blob
Billedtype LANGVARBINÆR byte[] billede
WrapperBinaryType VARBINARY java.lang.Byte[] wrapper-binær, Byte[], java.lang.Byte[]
CharArrayType VARCHAR char[] tegn, tegn[]
CharacterArrayType VARCHAR java.lang.Character[] wrapper-characters, Character[], java.lang.Character[]
UUIDBinaryType BINÆR java.util.UUID uuid-binær, java.util.UUID
UUIDCarType CHAR, kan også læse VARCHAR java.util.UUID uuid-char
PostgreSQLUUIDType PostgreSQL UUID, gennem Types#OTHER, som overholder PostgreSQL JDBC-driverdefinitionen java.util.UUID pg-uuid
Og siden udgivelsen af ​​JDK 8 har Hibernate tilføjet et par flere tidsrelaterede typer. Alt sammen for at gøre dit liv lettere. Du behøver ikke længere spekulere på, om alle disse nymodens typer understøttes. Skaberne af Hibernate har allerede tilføjet deres støtte til dig:
Hibernate-type (org.hibernate.type-pakke) JDBC type Java type BasicTypeRegistr
DurationType STORT java.time.Varighed Varighed, java.time.Duration
øjeblikkelig type TIDSSTEMPEL java.time.Instant Øjeblikkelig, java.time.Instant
LocalDateTimeType TIDSSTEMPEL java.time.LocalDateTime LocalDateTime, java.time.LocalDateTime
LocalDateType DATO java.time.LocalDate LocalDate, java.time.LocalDate
LocalTimeType TID java.time.LocalTime LocalTime, java.time.LocalTime
OffsetDateTimeType TIDSSTEMPEL java.time.OffsetDateTime OffsetDateTime, java.time.OffsetDateTime
OffsetTimeType TID java.time.OffsetTime OffsetTime, java.time.OffsetTime
OffsetTimeType TIDSSTEMPEL java.time.ZonedDateTime ZonedDateTime, java.time.ZonedDateTime