Tipuri de date acceptate
În timpul celor trei niveluri anterioare, ne-am familiarizat puțin cu Hibernate. E timpul pentru turul doi. Acum vom începe să studiem același lucru, doar mai profund. Și vom începe prin maparea câmpurilor din clasa Entity la coloanele tabelelor din baza de date.
După cum știți deja, maparea unui câmp dintr-o clasă Entitate la o coloană se face folosind adnotarea @Column . Și acum întrebarea este: ce tipuri de câmpuri pot fi mapate cu o astfel de adnotare?
Toate tipurile de date din Java pot fi împărțite în trei grupuri:
- Tipul este destul de simplu și ușor de stocat într-o bază de date .
- Tipul este complex și trebuie să scrieți un convertor special pentru el .
- Tipul este foarte complex și are nevoie de un tabel separat pentru a-și stoca valorile .
Tipurile simple pe care Hibernate știe să le stocheze includ:
Tipuri în Java | pachet | Exemple de clasă |
---|---|---|
Tipuri Java primitive | boolean , int , double etc. | |
Învelișuri peste primitive | java.lang | Boolean , Integer , Double , etc. |
Siruri de caractere | java.lang | Şir |
Numerele „avansate”. | java.matematică | BigInteger și BigDecimal |
data si ora | java.time | LocalDate , LocalTime , LocalDateTime , OffsetTime , OffsetDateTime , Instant |
Diverse variații de dată și oră | java.util | data si calendarul |
Formate vechi de dată și oră | java.sql | Data , ora , marcajul de timp |
Matrice de octeți sau caractere | octet[] sau octet[] , caracter[] sau caracter[] | |
Enumări | Orice enumerare | |
Obiecte serializabile | Orice implementare a java.io.Serializable |
Toate aceste tipuri au omologul lor în limbajul SQL, așa că Hibernate știe cum să le stocheze și să le încarce din baza de date.
Exemplu:
@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;
}
Atribuții manuale de tip - adnotare @Type
Uneori poate doriți să modificați politica Hibernate și să îi spuneți în mod explicit ce tip să stocheze datele în baza de date. De exemplu, aveți un câmp în clasa de Entitate de tip Integer, dar în bază există o coloană pentru acesta cu tipul VARCHAR.
Există o adnotare specială pentru aceasta - @Type . Pare foarte simplu:
@Type(type="type-name")
Să-i cerem, de exemplu, lui Hibernate să creeze câmpuldata creatadin clasa noastră User a fost stocată în baza de date ca șir:
@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;
}
Dacă Hibernate și-ar fi dat seama cum să convertească tipul Date în noul tip, atunci ar face-o. Dacă nu înțelege, atunci va trebui să specificați un convertor de tip special. Dar mai multe despre asta mai târziu.
Lista de tipuri de Hibernate pentru baze de date
Apropo, ați observat că am specificat tipul org.hibernate.type.StringType , nu String . Acest lucru se datorează faptului că am ales unul dintre tipurile suportate de SGBD și nu de limbajul Java. Fiecare are propriul sistem de tip. Doar că dezvoltatorii Hibernate au venit cu nume convenabile în stil Java în loc de aceste VARCHAR-uri.
Apropo, această listă nu este atât de mică. Voi da o parte din el aici:
Tip hibernare (pachetul org.hibernate.type) | tip JDBC | tip Java | Cheile BasicTypeRegistry |
---|---|---|---|
StringType | VARCHAR | java.lang.string | șir, java.lang.string |
clob materializat | CLOB | java.lang.string | materialized_clob |
tip de text | LONGVARCHAR | java.lang.string | text |
tip de caracter | CHAR | char, java.lang.Character | char, java.lang.Character |
BooleanType | pic | boolean, java.lang.Boolean | boolean, java.lang.Boolean |
NumericBooleanType | INTEGER, 0 este fals, 1 este adevărat | boolean, java.lang.Boolean | numeric_boolean |
DaNuTip | CHAR, „N”/“n” este fals, „Y”/“y” este adevărat. Valoarea majusculă este scrisă în baza de date. | boolean, java.lang.Boolean | da nu |
TrueFalseType | CHAR, 'F'/'f' este fals, 'T'/'t' este adevărat. Valoarea majusculă este scrisă în baza de date. | boolean, java.lang.Boolean | adevarat fals |
ByteType | TINYINT | byte, java.lang.Byte | byte, java.lang.Byte |
tip scurt | SMALLINT | scurt, java.lang.Scurt | scurt, java.lang.Scurt |
IntegerTypes | ÎNTREG | int, java.lang.Integer | int, java.lang.Integer |
tip lung | BIGINT | lung, java.lang.Long | lung, java.lang.Long |
tip plutitor | PLUTI | float, java.lang.Float | float, java.lang.Float |
tip dublu | DUBLA | dublu, java.lang.Dublu | dublu, java.lang.Dublu |
BigIntegerType | NUMERIC | java.math.BigInteger | mare_întreg, java.math.BigInteger |
BigDecimalType | NUMERIC | java.math.BigDecimal | big_decimal, java.math.bigDecimal |
TimestampType | TIMESTAMP-UL | java.sql.timestamp | timestamp, java.sql.timestamp |
Tip de timp | TIMP | java.sql.Time | timp, java.sql.Time |
tipul de dată | DATA | java.sql.date | data, java.sql.date |
CalendarType | TIMESTAMP-UL | java.util.Calendar | calendar, java.util.Calendar |
CalendarDateType | DATA | java.util.Calendar | calendar_date |
CurrencyType | java.util.Currency | VARCHAR | valuta, java.util.Currency |
LocaleType | VARCHAR | java.util.locale | locale, java.utility.locale |
TimeZoneType | VARCHAR, folosind ID-ul fusului orar | java.util.TimeZone | fus orar, java.util.TimeZone |
UrlType | VARCHAR | java.net.URL | url, java.net.URL |
tipul clasei | VARCHAR(clasa FQN) | java.lang.Class | clasa, java.lang.Class |
Masa, desigur, este mare, dar foarte utilă. De exemplu, reiese clar din aceasta că tipul boolean poate fi stocat în baza de date în cel puțin șase moduri diferite. Nu ai nevoie de atât de mult? Și cine a spus că alegi calea de a economisi?
Nu există niciun tip boolean în SQL și este adesea stocat astfel:
- 1 sau 0
- 'Fort'
- „Y” sau „N”
Prin urmare, este foarte bine când Hibernate înțelege toate aceste necazuri. Sau, de exemplu, să luăm stocarea matricelor de date în baza de date. Există o mulțime de opțiuni diferite, iar Hibernate știe cum să lucreze cu toate:
Tip hibernare (pachetul org.hibernate.type) | tip JDBC | tip Java | BasicTypeRegistr |
---|---|---|---|
tip blob | BLOB | java.sql.blob | blog, java.sql.blob |
clobtype | CLOB | java.sql.clob | clob, java.sql.clob |
BinaryType | VARBINAR | octet[] | binar, octet[] |
MaterializedBlobType | BLOB | octet[] | materializat_blob |
Tip imagine | LONGVARBINAR | octet[] | imagine |
WrapperBinaryType | VARBINAR | java.lang.Byte[] | wrapper-binary, Byte[], java.lang.Byte[] |
CharArrayType | VARCHAR | char[] | personaje, caracter[] |
CharacterArrayType | VARCHAR | java.lang.Character[] | wrapper-characters, Character[], java.lang.Character[] |
UUIDBinaryType | BINAR | java.util.UUID | uuid-binary, java.util.UUID |
UUIDcharType | CHAR, poate citi și VARCHAR | java.util.UUID | uuid-char |
PostgreSQLUUIDType | UUID PostgreSQL, prin Types#OTHER, care respectă definiția driverului PostgreSQL JDBC | java.util.UUID | pg-uuid |
Tip hibernare (pachetul org.hibernate.type) | tip JDBC | tip Java | BasicTypeRegistr |
---|---|---|---|
DurationType | BIGINT | java.time.Durata | Durata, java.time.Duration |
tip instant | TIMESTAMP-UL | java.time.Instant | Instant, java.time.Instant |
LocalDateTimeType | TIMESTAMP-UL | java.time.LocalDateTime | LocalDateTime, java.time.LocalDateTime |
LocalDateType | DATA | java.time.LocalDate | LocalDate, java.time.LocalDate |
LocalTimeType | TIMP | java.time.LocalTime | LocalTime, java.time.LocalTime |
OffsetDateTimeType | TIMESTAMP-UL | java.time.OffsetDateTime | OffsetDateTime, java.time.OffsetDateTime |
OffsetTimeType | TIMP | java.time.OffsetTime | OffsetTime, java.time.OffsetTime |
OffsetTimeType | TIMESTAMP-UL | java.time.ZonedDateTime | ZonedDateTime, java.time.ZonedDateTime |
GO TO FULL VERSION