Datatyper som stöds

Under de tre föregående nivåerna blev vi lite bekanta med Hibernate. Det är dags för andra omgången. Nu ska vi börja studera samma sak, bara djupare. Och vi börjar med att mappa fälten i klassen Entity till kolumnerna i tabellerna i databasen.

Som du redan vet, mappning av ett fält i en Entity-klass till en kolumn görs med @Column- kommentaren . Och nu är frågan: vilka typer av fält kan kartläggas med en sådan anteckning?

Alla datatyper i Java kan delas in i tre grupper:

  • Typen är ganska enkel och lätt att lagra i en databas .
  • Typen är komplex och du måste skriva en speciell omvandlare för den .
  • Typen är mycket komplex och behöver en separat tabell för att lagra sina värden .

Enkla typer som Hibernate vet hur man lagrar inkluderar:

Typer i Java paket Klassexempel
Primitiva Java-typer boolean , int , double , etc.
Omslag över primitiver java.lang Boolean , Heltal , Double , etc.
Strängar java.lang Sträng
"Avancerade" nummer java.math BigInteger och BigDecimal
datum och tid java.tid LocalDate , LocalTime , LocalDateTime , OffsetTime , OffsetDateTime , Instant
Olika datum- och tidsvariationer java.util datum och kalender
Gamla datum- och tidsformat java.sql Datum , tid , tidsstämpel
Array av byte eller tecken byte[] eller Byte[] , char[] eller Character[]
Enums Vilken uppräkning som helst
Serialiserbara objekt Alla implementeringar av java.io.Serializable

Alla dessa typer har sina motsvarigheter i SQL-språket, så Hibernate vet hur man lagrar och laddar dem från databasen.

Exempel:

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

Manuella typtilldelningar - @Typanteckning

Ibland kanske du vill manipulera Hibernates policy och uttryckligen tala om för den vilken typ av data som ska lagras i databasen. Till exempel har du ett fält i din Entity-klass av typen Integer, men i basen finns en kolumn för det med typen VARCHAR.

Det finns en speciell kommentar för detta - @Typ . Det ser väldigt enkelt ut:

@Type(type="type-name")

Låt oss till exempel be Hibernate att göra fältetSkapat Datumav vår användarklass lagrades i databasen som en sträng :

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

Om Hibernate kom på hur man konverterar datumtypen till din nya typ, så skulle det bara göra det. Om det inte förstår, måste du ange en speciell typ av omvandlare. Men mer om det senare.

Lista över vilolägestyper för databaser

Förresten, märkte du att vi angav typen org.hibernate.type.StringType , inte String . Detta beror på att vi har valt en av de typer som stöds av DBMS och inte av Java-språket. De har var sitt typsystem. Det är bara det att Hibernate-utvecklarna kom på bekväma namn i Java-stil istället för dessa VARCHAR.

Förresten, den här listan är inte så liten. Jag ger en del av det här:

Hibernate-typ (org.hibernate.type-paket) JDBC typ Java typ BasicTypeRegistry-nyckel(ar)
StringType VARCHAR java.lang.string sträng, java.lang.sträng
materialiserad klump CLOB java.lang.string materialized_clob
texttyp LONGVARCHAR java.lang.string text
teckentyp RÖDING char, java.lang.Character char, java.lang.Character
BooleanType bit boolean, java.lang.Boolean boolean, java.lang.Boolean
NumericBooleanType HELTAL, 0 är falskt, 1 är sant boolean, java.lang.Boolean numeric_boolean
YesNoType CHAR, 'N'/'n' är falskt, 'Y'/'y' är sant. Det stora värdet skrivs till databasen. boolean, java.lang.Boolean Ja Nej
TrueFalseType CHAR, 'F'/'f' är falskt, 'T'/'t' är sant. Det stora värdet skrivs till databasen. boolean, java.lang.Boolean sant falskt
ByteType TINYINT byte, java.lang.Byte byte, java.lang.Byte
kort typ SMALLINT kort, java.lang.Short kort, java.lang.Short
IntegerTypes HELTAL int, java.lang.Integer int, java.lang.Integer
lång typ STORT lång, java.lang.Lång lång, java.lang.Lång
flyttyp FLYTA flyta, java.lang.Flyta flyta, java.lang.Flyta
dubbel typ DUBBEL dubbel, java.lang.Double dubbel, java.lang.Double
BigIntegerType NUMERISK java.math.BigInteger big_integer, java.math.BigInteger
BigDecimalType NUMERISK java.math.BigDecimal big_decimal, java.math.bigDecimal
TimestampType TIDSSTÄMPEL java.sql.timestamp tidsstämpel, java.sql.tidsstämpel
Tidstyp TID java.sql.Time tid, java.sql.Time
datumtyp DATUM java.sql.date datum, java.sql.datum
CalendarType TIDSSTÄMPEL java.util.Calendar calendar, java.util.Calendar
CalendarDateType DATUM java.util.Calendar kalender_datum
Valutatyp java.util.Currency VARCHAR valuta, java.util.valuta
LocaleType VARCHAR java.util.locale locale, java.utility.locale
TimeZoneType VARCHAR, med TimeZone ID java.util.TimeZone tidszon, java.util.TimeZone
UrlType VARCHAR java.net.URL url, java.net.URL
klasstyp VARCHAR(klass FQN) java.lang.Class klass, java.lang.Klass

Bordet är naturligtvis stort, men väldigt användbart. Till exempel framgår det tydligt av den att den booleska typen kan lagras i databasen på minst sex olika sätt. Behöver du inte så mycket? Och vem har sagt att du väljer sättet att spara på?

Det finns ingen boolesk typ i SQL och den lagras ofta så här:

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

Därför är det väldigt bra när Hibernate förstår alla dessa problem. Eller, till exempel, låt oss ta lagringen av datamatriser i databasen. Det finns ett gäng olika alternativ, och Hibernate vet hur man arbetar med dem alla:

Hibernate-typ (org.hibernate.type-paket) JDBC typ Java typ BasicTypeRegistr
blob typ KLICK java.sql.blob blogg, java.sql.blob
clobtyp CLOB java.sql.clob clob, java.sql.clob
BinaryType VARBINÄR byte[] binär, byte[]
MaterializedBlobType KLICK byte[] materized_blob
Bildtyp LÅNGVARBINÄRT byte[] bild
WrapperBinaryType VARBINÄR java.lang.Byte[] wrapper-binary, Byte[], java.lang.Byte[]
CharArrayType VARCHAR röding[] tecken, char[]
CharacterArrayType VARCHAR java.lang.Character[] wrapper-tecken, Character[], java.lang.Character[]
UUIDBinaryType BINÄR java.util.UUID uuid-binär, java.util.UUID
UUIDCarType CHAR, kan även läsa VARCHAR java.util.UUID uuid-char
PostgreSQLUUIDType PostgreSQL UUID, genom Types#OTHER, som överensstämmer med PostgreSQL JDBC-drivrutinsdefinitionen java.util.UUID pg-uuid
Och sedan lanseringen av JDK 8 har Hibernate lagt till några fler tidsrelaterade typer. Allt för att göra ditt liv enklare. Du behöver inte längre undra om alla dessa nymodiga typer stöds. Skaparna av Hibernate har redan lagt till sitt stöd för dig:
Hibernate-typ (org.hibernate.type-paket) JDBC typ Java typ BasicTypeRegistr
DurationType STORT java.time.Duration Duration, java.time.Duration
omedelbar typ TIDSSTÄMPEL java.time.Instant Instant, java.time.Instant
LocalDateTimeType TIDSSTÄMPEL java.time.LocalDateTime LocalDateTime, java.time.LocalDateTime
LocalDateType DATUM java.time.LocalDate LocalDate, java.time.LocalDate
LocalTimeType TID java.time.LocalTime LocalTime, java.time.LocalTime
OffsetDateTimeType TIDSSTÄMPEL java.time.OffsetDateTime OffsetDateTime, java.time.OffsetDateTime
OffsetTimeType TID java.time.OffsetTime OffsetTime, java.time.OffsetTime
OffsetTimeType TIDSSTÄMPEL java.time.ZonedDateTime ZonedDateTime, java.time.ZonedDateTime