Mga sinusuportahang uri ng data
Sa nakaraang tatlong antas, medyo naging pamilyar kami sa Hibernate. Oras na para sa ikalawang round. Ngayon ay magsisimula tayong pag-aralan ang parehong bagay, mas malalim lamang. At magsisimula tayo sa pamamagitan ng pagmamapa ng mga field ng klase ng Entity sa mga column ng mga talahanayan sa database.
Tulad ng alam mo na, ang pagmamapa ng field sa isang Entity class sa isang column ay ginagawa gamit ang @Column annotation . At ngayon ang tanong ay: anong mga uri ng mga patlang ang maaaring ma-map na may ganoong anotasyon?
Ang lahat ng mga uri ng data sa Java ay maaaring nahahati sa tatlong pangkat:
- Ang uri ay medyo simple at madaling iimbak sa isang database .
- Ang uri ay kumplikado at kailangan mong magsulat ng isang espesyal na converter para dito .
- Napakasalimuot ng uri at nangangailangan ng hiwalay na talahanayan upang maimbak ang mga halaga nito .
Ang mga simpleng uri na alam ng Hibernate kung paano mag-imbak ay kinabibilangan ng:
Mga uri sa Java | pakete | Mga halimbawa ng klase |
---|---|---|
Mga Primitive na Uri ng Java | boolean , int , double , atbp. | |
Mga balot sa mga primitive | java.lang | Boolean , Integer , Double , atbp. |
Mga string | java.lang | String |
"Advanced" na mga numero | java.math | BigInteger at BigDecimal |
petsa at oras | java.time | LocalDate , LocalTime , LocalDateTime , OffsetTime , OffsetDateTime , Instant |
Iba't ibang mga pagkakaiba-iba ng petsa at oras | java.util | petsa at kalendaryo |
Mga lumang format ng petsa at oras | java.sql | Petsa , Oras , Timestamp |
Array ng mga byte o character | byte[] o Byte[] , char[] o Character[] | |
Enums | Anumang enum | |
Serializable na mga bagay | Anumang pagpapatupad ng java.io.Serializable |
Ang lahat ng mga uri na ito ay may kanilang mga katapat sa wikang SQL, kaya alam ng Hibernate kung paano iimbak at i-load ang mga ito mula sa database.
Halimbawa:
@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;
}
Mga pagtatalaga ng manu-manong uri - @Type annotation
Minsan maaaring gusto mong pakialaman ang patakaran ng Hibernate at tahasang sabihin dito kung anong uri ang mag-iimbak ng data sa database. Halimbawa, mayroon kang field sa iyong Entity class na may uri ng Integer, ngunit sa base ay mayroong column para dito na may uri ng VARCHAR.
Mayroong espesyal na anotasyon para dito - @Type . Mukhang napakasimple:
@Type(type="type-name")
Halimbawa, hilingin natin sa Hibernate na gawin ang fieldginawaDateng aming klase ng User ay naka-imbak sa database bilang isang string:
@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;
}
Kung naisip ng Hibernate kung paano i-convert ang uri ng Petsa sa iyong bagong uri, gagawin lang ito. Kung hindi nito naiintindihan, kakailanganin mong tukuyin ang isang espesyal na uri ng converter. Ngunit higit pa sa na mamaya.
Listahan ng mga uri ng Hibernate para sa mga database
Nga pala, napansin mo ba na tinukoy namin ang uri org.hibernate.type.StringType , hindi String . Ito ay dahil pinili namin ang isa sa mga uri na sinusuportahan ng DBMS at hindi ng wikang Java. Ang bawat isa sa kanila ay may sariling sistema ng uri. Kaya lang, ang mga developer ng Hibernate ay nakabuo ng mga maginhawang Java-style na pangalan sa halip na mga VARCHAR na ito.
Sa pamamagitan ng paraan, ang listahang ito ay hindi masyadong maliit. Ibibigay ko ang bahagi nito dito:
Uri ng hibernate (org.hibernate.type package) | Uri ng JDBC | Uri ng Java | BasicTypeRegistry key(s) |
---|---|---|---|
StringType | VARCHAR | java.lang.string | string, java.lang.string |
materialized clob | CLOB | java.lang.string | materialized_clob |
Uri ng Teksto | LONGVARCHAR | java.lang.string | text |
uri ng karakter | CHAR | char, java.lang.Character | char, java.lang.Character |
BooleanType | bit | boolean, java.lang.Boolean | boolean, java.lang.Boolean |
NumericBooleanType | INTEGER, 0 ay mali, 1 ay totoo | boolean, java.lang.Boolean | numeric_boolean |
YesNoType | CHAR, 'N'/'n' ay mali, 'Y'/'y' ay totoo. Ang uppercase na halaga ay nakasulat sa database. | boolean, java.lang.Boolean | Oo hindi |
TrueFalseType | CHAR, 'F'/'f' ay mali, 'T'/'t' ay totoo. Ang uppercase na halaga ay nakasulat sa database. | boolean, java.lang.Boolean | totoo_mali |
ByteType | TINYINT | byte, java.lang.Byte | byte, java.lang.Byte |
maikling uri | MALIIT | maikli, java.lang.Short | maikli, java.lang.Short |
IntegerTypes | INTEGER | int, java.lang.Integer | int, java.lang.Integer |
mahabang uri | BIGINT | long, java.lang.Long | long, java.lang.Long |
uri ng float | LUMUTANG | float, java.lang.Float | float, java.lang.Float |
dobleng uri | DOBLE | double, java.lang.Double | double, java.lang.Double |
BigIntegerType | NUMERIC | java.math.BigInteger | big_integer, java.math.BigInteger |
BigDecimalType | NUMERIC | java.math.BigDecimal | big_decimal, java.math.bigDecimal |
TimestampType | TIMESTAMP | java.sql.timestamp | timestamp, java.sql.timestamp |
Uri ng Oras | ORAS | java.sql.Oras | oras, java.sql.Oras |
uri ng petsa | DATE | java.sql.date | petsa, java.sql.date |
Uri ng Kalendaryo | TIMESTAMP | java.util.Calendar | kalendaryo, java.util.Calendar |
CalendarDateType | DATE | java.util.Calendar | kalendaryo_petsa |
CurrencyType | java.util.Currency | VARCHAR | pera, java.util.Currency |
LocaleType | VARCHAR | java.util.locale | locale, java.utility.locale |
TimeZoneType | VARCHAR, gamit ang TimeZone ID | java.util.TimeZone | timezone, java.util.TimeZone |
UrlType | VARCHAR | java.net.URL | url, java.net.URL |
uri ng klase | VARCHAR(klase FQN) | java.lang.Class | class, java.lang.Class |
Ang talahanayan, siyempre, ay malaki, ngunit lubhang kapaki-pakinabang. Halimbawa, malinaw mula rito na ang uri ng Boolean ay maaaring maimbak sa database sa hindi bababa sa anim na magkakaibang paraan. Hindi mo ba kailangan ng ganyan? At sinong nagsabi na pipiliin mo ang paraan para makatipid?
Walang uri ng Boolean sa SQL at madalas itong nakaimbak tulad nito:
- 1 o 0
- 'Depensa'
- 'Y' o 'N'
Samakatuwid, napakahusay kapag naiintindihan ng Hibernate ang lahat ng mga kaguluhang ito. O, halimbawa, kunin natin ang imbakan ng mga array ng data sa database. Mayroong maraming iba't ibang mga opsyon, at alam ng Hibernate kung paano magtrabaho sa kanilang lahat:
Uri ng hibernate (org.hibernate.type package) | Uri ng JDBC | Uri ng Java | BasicTypeRegistr |
---|---|---|---|
uri ng patak | BLOB | java.sql.blob | blog, java.sql.blob |
clobtype | CLOB | java.sql.clob | clob, java.sql.clob |
BinaryType | VARBINARY | byte[] | binary, byte[] |
MaterializedBlobType | BLOB | byte[] | materized_blob |
Uri ng Larawan | LONGVARBINARY | byte[] | larawan |
WrapperBinaryType | VARBINARY | java.lang.Byte[] | wrapper-binary, Byte[], java.lang.Byte[] |
CharArrayType | VARCHAR | char[] | mga character, char[] |
CharacterArrayType | VARCHAR | java.lang.Character[] | wrapper-character, Character[], java.lang.Character[] |
UUIDBinaryType | BINARY | java.util.UUID | uuid-binary, java.util.UUID |
UUIDcharType | CHAR, pwede ring magbasa ng VARCHAR | java.util.UUID | uuid-char |
PostgreSQLUUIDType | PostgreSQL UUID, sa pamamagitan ng Types#OTHER, na sumusunod sa kahulugan ng driver ng PostgreSQL JDBC | java.util.UUID | pg-uuid |
Uri ng hibernate (org.hibernate.type package) | Uri ng JDBC | Uri ng Java | BasicTypeRegistr |
---|---|---|---|
Uri ng Tagal | BIGINT | java.time.Duration | Tagal, java.time.Duration |
instant na uri | TIMESTAMP | java.time.Instant | Instant, java.time.Instant |
LocalDateTimeType | TIMESTAMP | java.time.LocalDateTime | LocalDateTime, java.time.LocalDateTime |
LocalDateType | DATE | java.time.LocalDate | LocalDate, java.time.LocalDate |
LocalTimeType | ORAS | java.time.LocalTime | LocalTime, java.time.LocalTime |
OffsetDateTimeType | TIMESTAMP | java.time.OffsetDateTime | OffsetDateTime, java.time.OffsetDateTime |
OffsetTimeType | ORAS | java.time.OffsetTime | OffsetTime, java.time.OffsetTime |
OffsetTimeType | TIMESTAMP | java.time.ZonedDateTime | ZonedDateTime, java.time.ZonedDateTime |
GO TO FULL VERSION