Jenis data yang disokong

Semasa tiga peringkat sebelumnya, kami membiasakan diri dengan Hibernate. Tiba masa untuk pusingan kedua. Sekarang kita akan mula mengkaji perkara yang sama, hanya lebih mendalam. Dan kita akan mulakan dengan memetakan medan kelas Entiti ke lajur jadual dalam pangkalan data.

Seperti yang anda sedia maklum, memetakan medan dalam kelas Entiti kepada lajur dilakukan menggunakan anotasi @Column . Dan kini persoalannya ialah: apakah jenis medan yang boleh dipetakan dengan anotasi sedemikian?

Semua jenis data dalam Java boleh dibahagikan kepada tiga kumpulan:

  • Jenisnya agak ringkas dan mudah disimpan dalam pangkalan data .
  • Jenisnya rumit dan anda perlu menulis penukar khas untuknya .
  • Jenisnya sangat kompleks dan memerlukan jadual berasingan untuk menyimpan nilainya .

Jenis mudah yang Hibernate tahu cara menyimpan termasuk:

Jenis dalam Java pakej Contoh kelas
Jenis Java Primitif boolean , int , double , dsb.
Pembungkus atas primitif java.lang Boolean , Integer , Double , dsb.
rentetan java.lang Tali
Nombor "Lanjutan". java.math BigInteger dan BigDecimal
tarikh dan masa java.time LocalDate , LocalTime , LocalDateTime , OffsetTime , OffsetDateTime , Segera
Pelbagai variasi tarikh dan masa java.util tarikh dan kalendar
Format tarikh dan masa lama java.sql Tarikh , Masa , Cap masa
Tatasusunan bait atau aksara byte[] atau Byte[] , char[] atau Character[]
Enums Mana-mana enum
Objek boleh bersiri Sebarang pelaksanaan java.io.Serializable

Semua jenis ini mempunyai rakan sejawatannya dalam bahasa SQL, jadi Hibernate tahu cara menyimpan dan memuatkannya daripada pangkalan data.

Contoh:

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

Tugasan jenis manual - anotasi @Type

Kadangkala anda mungkin ingin mengganggu dasar Hibernate dan secara eksplisit memberitahu jenis untuk menyimpan data dalam pangkalan data. Sebagai contoh, anda mempunyai medan dalam kelas Entiti jenis Integer anda, tetapi dalam pangkalan terdapat lajur untuknya dengan jenis VARCHAR.

Terdapat anotasi khas untuk ini - @Type . Ia kelihatan sangat mudah:

@Type(type="type-name")

Mari, sebagai contoh, minta Hibernate untuk membuat medanCreatedDatekelas Pengguna kami disimpan dalam pangkalan data sebagai rentetan:

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

Jika Hibernate mengetahui cara menukar jenis Tarikh kepada jenis baharu anda, maka ia hanya akan melakukannya. Jika ia tidak faham, maka anda perlu menentukan penukar jenis khas. Tetapi lebih lanjut mengenai itu kemudian.

Senarai jenis Hibernate untuk pangkalan data

By the way, adakah anda perasan bahawa kami menentukan jenis org.hibernate.type.StringType , bukan String . Ini kerana kami telah memilih salah satu jenis yang disokong oleh DBMS dan bukan oleh bahasa Java. Mereka masing-masing mempunyai sistem jenis mereka sendiri. Cuma pembangun Hibernate menghasilkan nama gaya Java yang mudah dan bukannya VARCHAR ini.

By the way, senarai ini tidak begitu kecil. Saya akan memberikan sebahagian daripadanya di sini:

Jenis hibernate (pakej org.hibernate.type) jenis JDBC jenis Java Kunci BasicTypeRegistry
StringType VARCHAR java.lang.string rentetan, java.lang.string
gumpalan terwujud CLOB java.lang.string materialized_clab
jenis teks LONGVARCHAR java.lang.string teks
jenis watak CHAR char, java.lang.Character char, java.lang.Character
BooleanType sedikit boolean, java.lang.Boolean boolean, java.lang.Boolean
NumericBooleanType INTEGER, 0 adalah palsu, 1 adalah benar boolean, java.lang.Boolean numeric_boolean
YesNoType CHAR, 'N'/'n' adalah palsu, 'Y'/'y' adalah benar. Nilai huruf besar ditulis ke pangkalan data. boolean, java.lang.Boolean Ya tidak
TrueFalseType CHAR, 'F'/'f' adalah palsu, 'T'/'t' adalah benar. Nilai huruf besar ditulis ke pangkalan data. boolean, java.lang.Boolean betul salah
ByteType TINYINT bait, java.lang.Byte bait, java.lang.Byte
jenis pendek KECIL pendek, java.lang.Short pendek, java.lang.Short
IntegerTypes INTEGER int, java.lang.Integer int, java.lang.Integer
jenis panjang BESAR panjang, java.lang.Long panjang, java.lang.Long
jenis apungan TERApung float, java.lang.Float float, java.lang.Float
jenis berganda BERGANDA double, java.lang.Double double, java.lang.Double
BigIntegerType NUMERIC java.math.BigInteger big_integer, java.math.BigInteger
BigDecimalType NUMERIC java.math.BigDecimal perpuluhan_besar, java.math.bigDecimal
TimestampType STAMP MASA java.sql.timestamp cap waktu, java.sql.cap waktu
Jenis Masa MASA java.sql.Time masa, java.sql.Time
jenis tarikh TARIKH java.sql.date tarikh, java.sql.date
CalendarType STAMP MASA java.util.Calendar kalendar, java.util.Calendar
CalendarDateType TARIKH java.util.Calendar tarikh_kalendar
Jenis Mata Wang java.util.Currency VARCHAR mata wang, java.util.Currency
LocaleType VARCHAR java.util.locale locale, java.utility.locale
TimeZoneType VARCHAR, menggunakan ID Zon Masa java.util.TimeZone zon waktu, java.util.TimeZone
UrlType VARCHAR java.net.URL url, java.net.URL
jenis kelas VARCHAR(kelas FQN) java.lang.Class class, java.lang.Class

Meja, tentu saja, besar, tetapi sangat berguna. Sebagai contoh, jelas daripadanya bahawa jenis Boolean boleh disimpan dalam pangkalan data dalam sekurang-kurangnya enam cara berbeza. Tidakkah anda memerlukan sebanyak itu? Dan siapa yang mengatakan bahawa anda memilih cara untuk menyimpan?

Tiada jenis Boolean dalam SQL dan ia sering disimpan seperti ini:

  • 1 atau 0
  • 'F' atau 'T'
  • 'Y' atau 'N'

Oleh itu, adalah sangat baik apabila Hibernate memahami semua masalah ini. Atau, sebagai contoh, mari kita ambil storan tatasusunan data dalam pangkalan data. Terdapat banyak pilihan yang berbeza, dan Hibernate tahu cara bekerja dengan mereka semua:

Jenis hibernate (pakej org.hibernate.type) jenis JDBC jenis Java BasicTypeRegistr
jenis gumpalan BLOB java.sql.blob blog, java.sql.blob
jenis clobtype CLOB java.sql.clob clob, java.sql.clob
BinaryType VARBINAR bait[] binari, bait[]
MaterializedBlobType BLOB bait[] materized_blob
Jenis Imej LONGVARBINARY bait[] gambar
WrapperBinaryType VARBINAR java.lang.Byte[] binari pembalut, Byte[], java.lang.Byte[]
CharArrayType VARCHAR char[] watak, char[]
CharacterArrayType VARCHAR java.lang.Character[] aksara pembalut, Aksara[], java.lang.Character[]
UUIDBinaryType BINARI java.util.UUID uuid-binary, java.util.UUID
UUIDCarType CHAR, boleh juga baca VARCHAR java.util.UUID uuid-char
PostgreSQLUUIDType PostgreSQL UUID, melalui Types#OTHER, yang mematuhi definisi pemacu PostgreSQL JDBC java.util.UUID pg-uuid
Dan sejak keluaran JDK 8, Hibernate telah menambah beberapa lagi jenis berkaitan masa. Semuanya untuk memudahkan hidup anda. Anda tidak perlu lagi tertanya-tanya sama ada semua jenis model baharu ini disokong. Pencipta Hibernate telah menambah sokongan mereka untuk anda:
Jenis hibernate (pakej org.hibernate.type) jenis JDBC jenis Java BasicTypeRegistr
Jenis Tempoh BESAR java.time.Duration Tempoh, java.time.Duration
jenis segera STAMP MASA java.time.Instant Segera, java.time.Instant
LocalDateTimeType STAMP MASA java.time.LocalDateTime LocalDateTime, java.time.LocalDateTime
LocalDateType TARIKH java.time.LocalDate LocalDate, java.time.LocalDate
LocalTimeType MASA java.time.LocalTime LocalTime, java.time.LocalTime
OffsetDateTimeType STAMP MASA java.time.OffsetDateTime OffsetDateTime, java.time.OffsetDateTime
OffsetTimeType MASA java.time.OffsetTime OffsetTime, java.time.OffsetTime
OffsetTimeType STAMP MASA java.time.ZonedDateTime ZonedDateTime, java.time.ZonedDateTime