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