Támogatott adattípusok

Az előző három szint során egy kicsit megismerkedtünk a Hibernate szolgáltatással. Eljött a második forduló ideje. Most elkezdjük tanulmányozni ugyanazt, csak mélyebben. És kezdjük azzal, hogy az Entity osztály mezőit leképezzük az adatbázis tábláinak oszlopaira.

Amint azt már tudja, az Entity osztályban lévő mezők hozzárendelése oszlophoz a @Column megjegyzés használatával történik . És most az a kérdés: milyen típusú mezőket lehet leképezni egy ilyen annotációval?

A Java összes adattípusa három csoportra osztható:

  • A típus meglehetősen egyszerű és könnyen tárolható egy adatbázisban .
  • A típus összetett és ehhez speciális konvertert kell írni .
  • A típus nagyon összetett, és külön táblára van szüksége az értékek tárolására .

A Hibernate által tárolt egyszerű típusok a következők:

Típusok Java nyelven csomag Osztálypéldák
Primitív Java típusok logikai , int , double stb.
Burkolatok a primitívek felett java.lang Boolean , Integer , Double stb.
Húrok java.lang Húr
"Speciális" számok java.math BigInteger és BigDecimal
dátum és idő java.time LocalDate , LocalTime , LocalDateTime , OffsetTime , OffsetDateTime , Instant
Különféle dátum- és időváltozatok java.util dátum és naptár
Régi dátum- és időformátumok java.sql Dátum , idő , időbélyeg
Bájtok vagy karakterek tömbje bájt[] vagy bájt[] , karakter[] vagy karakter[]
Enums Bármilyen enum
Sorozható objektumok A java.io.Serializable bármilyen megvalósítása

Mindegyik típusnak megvannak a megfelelőik az SQL nyelvben, így a Hibernate tudja, hogyan kell tárolni és betölteni őket az adatbázisból.

Példa:

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

Kézi típus-hozzárendelések - @Type megjegyzés

Előfordulhat, hogy módosítani szeretné a Hibernate házirendjét, és kifejezetten meg kell adni neki, hogy milyen típusú adatokat tároljon az adatbázisban. Például az Entity osztályban van egy Integer típusú mező, de az alapban van egy VARCHAR típusú oszlop.

Ehhez van egy speciális megjegyzés - @Type . Nagyon egyszerűnek tűnik:

@Type(type="type-name")

Kérjük meg például a Hibernate-ot, hogy tegye meg a terepetLétrehozás dátumaFelhasználói osztályunk karakterláncaként került tárolásra az adatbázisban:

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

Ha a Hibernate rájött, hogyan lehet átalakítani a dátum típust az új típusra, akkor megtenné. Ha nem érti, akkor meg kell adnia egy speciális típusú konvertert. De erről majd később.

Az adatbázisok hibernált típusainak listája

Egyébként észrevette, hogy az org.hibernate.type.StringType típust adtuk meg , nem a Stringet . Ennek az az oka, hogy a DBMS által támogatott típusok egyikét választottuk, nem pedig a Java nyelv által. Mindegyiknek megvan a saját típusrendszere. Csak arról van szó, hogy a Hibernate fejlesztői kényelmes Java-stílusú neveket találtak ki e VARCHAR-ok helyett.

Egyébként ez a lista nem is olyan kicsi. Egy részét itt adom:

Hibernált típus (org.hibernate.type csomag) JDBC típus Java típus BasicTypeRegistry kulcs(ok)
StringType VARCHAR java.lang.string string, java.lang.string
materializálódott klob CLOB java.lang.string materializált_klob
TextType LONGVARCHAR java.lang.string szöveg
karaktertípus CHAR char, java.lang.Character char, java.lang.Character
BooleanType bit logikai, java.lang.Boolean logikai, java.lang.Boolean
NumericBooleanType INTEGER, 0 hamis, 1 igaz logikai, java.lang.Boolean numeric_boolean
IgenNemTípus CHAR, 'N'/'n' hamis, 'Y'/'y' igaz. A nagybetűs érték beírásra kerül az adatbázisba. logikai, java.lang.Boolean igen nem
TrueFalseType CHAR, 'F'/'f' hamis, 'T'/'t' igaz. A nagybetűs érték beírásra kerül az adatbázisba. logikai, java.lang.Boolean igaz hamis
ByteType TINYINT bájt, java.lang.Byte bájt, java.lang.Byte
rövid típus KICSIK short, java.lang.Short short, java.lang.Short
IntegerTypes EGÉSZ SZÁM int, java.lang.Integer int, java.lang.Integer
hosszú típus BIGINT long, java.lang.Long long, java.lang.Long
úszó típusú ÚSZÓ float, java.lang.Float float, java.lang.Float
dupla típus KETTŐS double, java.lang.Double double, java.lang.Double
BigIntegerType SZÁM java.math.BigInteger big_integer, java.math.BigInteger
BigDecimalType SZÁM java.math.BigDecimal big_decimal, java.math.bigDecimal
TimestampType IDŐBÉLYEG java.sql.timestamp timestamp, java.sql.timestamp
Idő típusa IDŐ java.sql.Time time, java.sql.Time
dátum típusa DÁTUM java.sql.date dátum, java.sql.date
CalendarType IDŐBÉLYEG java.util.Calendar naptár, java.util.Calendar
CalendarDateType DÁTUM java.util.Calendar naptári_dátum
CurrencyType java.util.Currency VARCHAR valuta, java.util.Currency
LocaleType VARCHAR java.util.locale locale, java.utility.locale
TimeZoneType VARCHAR, a TimeZone ID használatával java.util.TimeZone időzóna, java.util.TimeZone
UrlType VARCHAR java.net.URL url, java.net.URL
osztálytípus VARCHAR (FQN osztály) java.lang.Class osztály, java.lang.Class

Az asztal természetesen nagy, de nagyon hasznos. Például jól látszik belőle, hogy a Boole-típus legalább hat különböző módon tárolható az adatbázisban. Nem kell annyi? És ki mondta, hogy te választod a megtakarítás módját?

Az SQL-ben nincs logikai típus, és gyakran így tárolják:

  • 1 vagy 0
  • "F" vagy "T"
  • 'Y' vagy 'N'

Ezért nagyon jó, ha a Hibernate megérti ezeket a bajokat. Vagy vegyük például az adattömbök tárolását az adatbázisban. Számos különféle lehetőség létezik, és a Hibernate tudja, hogyan kell mindegyikkel dolgozni:

Hibernált típus (org.hibernate.type csomag) JDBC típus Java típus BasicTypeRegistr
blob típusú FOLT java.sql.blob blog, java.sql.blob
klobtípus CLOB java.sql.clob clob, java.sql.clob
BinaryType VARBINÁRIS byte[] bináris, bájt[]
MaterializedBlobType FOLT byte[] materiized_blob
Képtípus HOSSZÚVARBINÁRIS byte[] kép
WrapperBinaryType VARBINÁRIS java.lang.Byte[] wrapper-binary, Byte[], java.lang.Byte[]
CharArrayType VARCHAR char[] karakterek, char[]
CharacterArrayType VARCHAR java.lang.Character[] wrapper-characters, Character[], java.lang.Character[]
UUIDBinaryType BINÁRIS java.util.UUID uuid-binary, java.util.UUID
UUIDCcharType CHAR, VARCHAR is olvasható java.util.UUID uuid-char
PostgreSQLUUIDType PostgreSQL UUID a Types#OTHER-en keresztül, amely megfelel a PostgreSQL JDBC illesztőprogram-definíciójának java.util.UUID pg-uuid
És a JDK 8 megjelenése óta a Hibernate néhány további, időhöz kapcsolódó típust is hozzáadott. Mindezt azért, hogy könnyebb legyen az életed. Többé nem kell azon töprengenie, hogy ezek az újszerű típusok mindegyike támogatott-e. A Hibernate készítői már támogatták Önt:
Hibernált típus (org.hibernate.type csomag) JDBC típus Java típus BasicTypeRegistr
DurationType BIGINT java.time.Duration Időtartam, java.time.Duration
azonnali típus IDŐBÉLYEG java.time.Instant Azonnali, java.time.Instant
LocalDateTimeType IDŐBÉLYEG java.time.LocalDateTime LocalDateTime, java.time.LocalDateTime
LocalDateType DÁTUM java.time.LocalDate LocalDate, java.time.LocalDate
LocalTimeType IDŐ java.time.LocalTime LocalTime, java.time.LocalTime
OffsetDateTimeType IDŐBÉLYEG java.time.OffsetDateTime OffsetDateTime, java.time.OffsetDateTime
OffsetTimeType IDŐ java.time.OffsetTime OffsetTime, java.time.OffsetTime
OffsetTimeType IDŐBÉLYEG java.time.ZonedDateTime ZonedDateTime, java.time.ZonedDateTime