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
At mula nang ilabas ang JDK 8, ang Hibernate ay nagdagdag ng ilan pang mga uri na nauugnay sa oras. Lahat para gawing mas madali ang iyong buhay. Hindi mo na kailangang magtaka kung sinusuportahan ang lahat ng mga bagong uri na ito. Idinagdag na ng mga tagalikha ng Hibernate ang kanilang suporta para sa iyo:
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