Støttede datatyper

I løpet av de tre foregående nivåene ble vi litt kjent med Hibernate. Det er tid for andre runde. Nå skal vi begynne å studere det samme, bare dypere. Og vi starter med å kartlegge feltene i Entity-klassen til kolonnene i tabellene i databasen.

Som du allerede vet, tilordnes et felt i en Entity-klasse til en kolonne ved å bruke @Column- kommentaren . Og nå er spørsmålet: hvilke typer felt kan kartlegges med en slik merknad?

Alle datatyper i Java kan deles inn i tre grupper:

  • Typen er ganske enkel og lett å lagre i en database .
  • Typen er kompleks og du må skrive en spesiell omformer for den .
  • Typen er veldig kompleks og trenger en egen tabell for å lagre verdiene .

Enkle typer som Hibernate vet hvordan de skal lagre inkluderer:

Skriver i Java pakke Klasseeksempler
Primitive Java-typer boolsk , int , dobbel , etc.
Omslag over primitiver java.lang Boolsk , heltall , dobbel , etc.
Strenger java.lang String
"Avanserte" tall java.math BigInteger og BigDecimal
dato og tid java.tid LocalDate , LocalTime , LocalDateTime , OffsetTime , OffsetDateTime , Instant
Ulike dato- og klokkeslettvariasjoner java.util dato og kalender
Gamle dato- og klokkeslettformater java.sql Dato , klokkeslett , tidsstempel
En rekke byte eller tegn byte[] eller Byte[] , char[] eller Character[]
Enums Enhver oppregning
Serialiserbare objekter Enhver implementering av java.io.Serializable

Alle disse typene har sine motstykker i SQL-språket, så Hibernate vet hvordan de skal lagres og lastes 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 typetilordninger - @Typekommentar

Noen ganger vil du kanskje tukle med Hibernates policy og eksplisitt fortelle den hvilken type data skal lagres i databasen. For eksempel har du et felt i Entity-klassen din av typen Integer, men i basen er det en kolonne for det med typen VARCHAR.

Det er en spesiell merknad for dette - @Type . Det ser veldig enkelt ut:

@Type(type="type-name")

La oss for eksempel be Hibernate om å lage feltetopprettet datoav brukerklassen vår ble lagret 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 fant ut hvordan du konverterer datotypen til den nye typen, ville det bare gjøre det. Hvis den ikke forstår, må du spesifisere en spesiell type omformer. Men mer om det senere.

Liste over dvalemodus-typer for databaser

La du forresten merke til at vi spesifiserte typen org.hibernate.type.StringType , ikke String . Dette er fordi vi har valgt en av typene som støttes av DBMS og ikke av Java-språket. De har hvert sitt typesystem. Det er bare at Hibernate-utviklerne kom opp med praktiske navn i Java-stil i stedet for disse VARCHAR-ene.

Denne listen er forresten ikke så liten. Jeg vil gi en del av det her:

Hibernate type (org.hibernate.type-pakke) JDBC type Java-type BasicTypeRegistry-nøkkel(er)
StringType VARCHAR java.lang.string streng, java.lang.streng
materialisert klob CLOB java.lang.string materialized_clob
teksttype LONGVARCHAR java.lang.string tekst
tegntype CHAR char, java.lang.Character char, java.lang.Character
BooleanType bit boolsk, java.lang.boolsk boolsk, java.lang.boolsk
NumericBooleanType HELTAL, 0 er usant, 1 er sant boolsk, java.lang.boolsk numeric_boolean
YesNoType CHAR, 'N'/'n' er usant, 'Y'/'y' er sant. Den store verdien skrives til databasen. boolsk, java.lang.boolsk Ja Nei
TrueFalseType CHAR, 'F'/'f' er usant, 'T'/'t' er sant. Den store verdien skrives til databasen. boolsk, java.lang.boolsk true_false
ByteType TINYINT byte, java.lang.Byte byte, java.lang.Byte
kort type SMALLINT kort, java.lang.Short kort, java.lang.Short
IntegerTypes HELTAL int, java.lang.Integer int, java.lang.Integer
lang type STORT lang, java.lang.Lang lang, java.lang.Lang
flytetype FLYTE flyte, java.lang.Flyte flyte, java.lang.Flyte
dobbel type DOBBELT dobbel, java.lang.Dobbel dobbel, java.lang.Dobbel
BigIntegerType NUMERISK java.math.BigInteger big_integer, java.math.BigInteger
BigDecimalType NUMERISK java.math.BigDecimal big_decimal, java.math.bigDecimal
TimestampType TIDSSTIMPEL 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 TIDSSTIMPEL 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 å bruke TimeZone ID java.util.TimeZone tidssone, 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 veldig nyttig. For eksempel er det klart av den at den boolske typen kan lagres i databasen på minst seks forskjellige måter. Trenger du ikke så mye? Og hvem sa at du velger måten å spare på?

Det er ingen boolsk type i SQL, og den lagres ofte slik:

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

Derfor er det veldig bra når Hibernate forstår alle disse problemene. Eller, for eksempel, la oss ta lagringen av datamatriser i databasen. Det er en haug med forskjellige alternativer, og Hibernate vet hvordan man jobber med dem alle:

Hibernate type (org.hibernate.type-pakke) JDBC type Java-type BasicTypeRegistr
blob type BLOB java.sql.blob blogg, java.sql.blob
clobtype CLOB java.sql.clob clob, java.sql.clob
BinaryType VARBINARY byte[] binær, byte[]
Materialisert BlobType BLOB byte[] materisert_blob
Bildetype LANGVARBINÆR byte[] bilde
WrapperBinaryType VARBINARY java.lang.Byte[] wrapper-binary, Byte[], java.lang.Byte[]
CharArrayType VARCHAR røye[] 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å lese VARCHAR java.util.UUID uuid-char
PostgreSQLUUIDType PostgreSQL UUID, gjennom Types#OTHER, som samsvarer med PostgreSQL JDBC-driverdefinisjonen java.util.UUID pg-uuid
Og siden utgivelsen av JDK 8 har Hibernate lagt til noen flere tidsrelaterte typer. Alt for å gjøre livet ditt enklere. Du trenger ikke lenger å lure på om alle disse nymotens typer støttes. Skaperne av Hibernate har allerede lagt til støtte for deg:
Hibernate type (org.hibernate.type-pakke) JDBC type Java-type BasicTypeRegistr
DurationType STORT java.time.Varighet Varighet, java.time.Duration
øyeblikkelig type TIDSSTIMPEL java.time.Instant Instant, java.time.Instant
LocalDateTimeType TIDSSTIMPEL 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 TIDSSTIMPEL java.time.OffsetDateTime OffsetDateTime, java.time.OffsetDateTime
OffsetTimeType TID java.time.OffsetTime OffsetTime, java.time.OffsetTime
OffsetTimeType TIDSSTIMPEL java.time.ZonedDateTime ZonedDateTime, java.time.ZonedDateTime