ชนิดข้อมูลที่สนับสนุน

ในช่วงสามระดับก่อนหน้านี้ เราคุ้นเคยกับ Hibernate กันเล็กน้อย ถึงเวลาสำหรับรอบที่สอง ตอนนี้เราจะเริ่มศึกษาสิ่งเดียวกันให้ลึกลงไปเท่านั้น และเราจะเริ่มต้นด้วยการแมปฟิลด์ของคลาสเอนทิตีกับคอลัมน์ของตารางในฐานข้อมูล

ดังที่คุณทราบแล้ว การแมปฟิลด์ในคลาสเอนทิ ตีกับคอลัมน์ทำได้โดยใช้ คำอธิบายประกอบ @Column และตอนนี้คำถามก็คือ: ฟิลด์ประเภทใดที่สามารถแมปกับคำอธิบายประกอบดังกล่าวได้

ชนิดข้อมูลทั้งหมดใน Java สามารถแบ่งออกเป็นสามกลุ่ม:

  • ประเภทค่อนข้างเรียบง่ายและง่ายต่อการจัดเก็บในฐานข้อมูล
  • ประเภทมีความซับซ้อนและคุณต้องเขียนตัวแปลงพิเศษ สำหรับ มัน
  • ประเภทมีความซับซ้อนมากและต้องการตารางแยกต่างหาก เพื่อจัดเก็บ ค่า

ประเภทง่าย ๆ ที่ Hibernate รู้วิธีจัดเก็บ ได้แก่ :

พิมพ์ในภาษาจาวา บรรจุุภัณฑ์ ตัวอย่างชั้นเรียน
ประเภท Java ดั้งเดิม บูลีน , int , double , ฯลฯ
ห่อหุ้มเหนือสิ่งดั้งเดิม java.lang บูลีน ,จำนวนเต็ม ,ดับเบิ้ล , ฯลฯ
สตริง java.lang สตริง
หมายเลข "ขั้นสูง" java.math BigIntegerและ BigDecimal
วันและเวลา java.time LocalDate , LocalTime , LocalDateTime , OffsetTime , OffsetDateTime ,ทันที
การเปลี่ยนแปลงวันที่และเวลาที่หลากหลาย java.util วันที่และปฏิทิน
รูปแบบวันที่และเวลาแบบเก่า java.sql วันที่เวลาประทับเวลา
อาร์เรย์ของไบต์หรืออักขระ byte[]หรือ Byte[] , char[]หรือ Character[]
Enums อะไรก็ได้
วัตถุที่ทำให้เป็นอนุกรมได้ การใช้งาน java.io.Serializable ใดๆ

ประเภทเหล่านี้ทั้งหมดมีคู่ในภาษา SQL ดังนั้น Hibernate จึงรู้วิธีจัดเก็บและโหลดจากฐานข้อมูล

ตัวอย่าง:

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

การกำหนดประเภทด้วยตนเอง - คำอธิบายประกอบ @Type

บางครั้งคุณอาจต้องการแก้ไขนโยบายของ Hibernate และบอกให้ชัดเจนว่าจะเก็บข้อมูลประเภทใดในฐานข้อมูล ตัวอย่างเช่น คุณมีฟิลด์ในคลาสเอนทิตีของคุณเป็นประเภทจำนวนเต็ม แต่ในฐานมีคอลัมน์สำหรับฟิลด์ที่มีประเภท VARCHAR

มีคำอธิบายประกอบพิเศษสำหรับสิ่งนี้- @Type มันดูง่ายมาก:

@Type(type="type-name")

ตัวอย่างเช่น ขอให้ไฮเบอร์เนตสร้างฟิลด์วันที่สร้างของ คลาสUser ของเรา ถูกจัดเก็บไว้ในฐานข้อมูลเป็นสตริง:

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

หาก Hibernate ทราบวิธีแปลงประเภท Date เป็นประเภทใหม่ของคุณ ก็จะทำได้ หากไม่เข้าใจคุณจะต้องระบุตัวแปลงชนิดพิเศษ แต่เพิ่มเติมในภายหลัง

รายการประเภท Hibernate สำหรับฐานข้อมูล

อย่างไรก็ตาม คุณสังเกตไหมว่าเราระบุประเภทorg.hibernate.type.StringTypeไม่ใช่String นี่เป็นเพราะเราเลือกหนึ่งในประเภทที่รองรับโดย DBMS ไม่ใช่โดยภาษา Java พวกเขาแต่ละคนมีระบบประเภทของตัวเอง เป็นเพียงการที่นักพัฒนา Hibernate คิดชื่อสไตล์จาวาที่สะดวกขึ้นแทน VARCHAR เหล่านี้

อย่างไรก็ตามรายการนี้ไม่เล็ก ฉันจะให้บางส่วนที่นี่:

ประเภทไฮเบอร์เนต (แพ็คเกจ org.hibernate.type) ประเภท JDBC ประเภทจาวา คีย์ BasicTypeRegistry
ประเภทสตริง วาร์ชาร์ java.lang.string สตริง java.lang.string
บล็อกที่เป็นรูปธรรม CLOB java.lang.string materialized_clob
ประเภทข้อความ ลองวาร์ชาร์ java.lang.string ข้อความ
ประเภทตัวอักษร ชาร์ ถ่าน, java.lang. Character ถ่าน, java.lang. Character
ประเภทบูลีน นิดหน่อย บูลีน, java.lang.Boolean บูลีน, java.lang.Boolean
ประเภทบูลีนที่เป็นตัวเลข จำนวนเต็ม, 0 เป็นเท็จ, 1 เป็นความจริง บูลีน, java.lang.Boolean ตัวเลข_บูลีน
ใช่ไม่ใช่ประเภท CHAR, 'N'/'n' เป็นเท็จ, 'Y'/'y' เป็นจริง ค่าตัวพิมพ์ใหญ่ถูกเขียนลงในฐานข้อมูล บูลีน, java.lang.Boolean ใช่ไม่ใช่
ประเภท TrueFalse CHAR, 'F'/'f' เป็นเท็จ, 'T'/'t' เป็นจริง ค่าตัวพิมพ์ใหญ่ถูกเขียนลงในฐานข้อมูล บูลีน, java.lang.Boolean ถูกผิด
ประเภทไบต์ ไทนี่อินท์ ไบต์, java.lang.Byte ไบต์, java.lang.Byte
ชนิดสั้น สมอลลินท์ สั้น java.lang.Short สั้น java.lang.Short
ประเภทจำนวนเต็ม จำนวนเต็ม int, java.lang.จำนวนเต็ม int, java.lang.จำนวนเต็ม
ประเภทยาว บิ๊กอินท์ ยาว java.lang.Long ยาว java.lang.Long
ประเภทลอย ลอย ลอย, java.lang.Float ลอย, java.lang.Float
ประเภทคู่ สองเท่า สองเท่า, java.lang.Double สองเท่า, java.lang.Double
BigIntegerType ตัวเลข java.math.BigInteger big_integer, java.math.BigInteger
BigDecimalType ตัวเลข java.math.BigDecimal big_decimal, java.math.bigDecimal
ประเภทการประทับเวลา ประทับเวลา java.sql.timestamp การประทับเวลา, java.sql.timestamp
ประเภทเวลา เวลา java.sql.Time เวลา, java.sql.Time
ประเภทวันที่ วันที่ java.sql.date วันที่ java.sql.date
ประเภทปฏิทิน ประทับเวลา java.util.Calendar ปฏิทิน, java.util.Calendar
ประเภทวันที่ของปฏิทิน วันที่ java.util.Calendar ปฏิทิน_วันที่
ประเภทสกุลเงิน java.util.Currency วาร์ชาร์ สกุลเงิน java.util.Currency
LocaleType วาร์ชาร์ java.util.locale โลแคล, java.utility.locale
ประเภทเขตเวลา VARCHAR โดยใช้รหัสโซนเวลา java.util.TimeZone เขตเวลา, java.util.TimeZone
ประเภท URL วาร์ชาร์ java.net.URL URL, java.net.URL
ประเภทชั้นเรียน VARCHAR (คลาส FQN) java.lang.Class คลาส java.lang.Class

แน่นอนว่าโต๊ะมีขนาดใหญ่ แต่มีประโยชน์มาก ตัวอย่างเช่น เป็นที่ชัดเจนแล้วว่าประเภทบูลีนสามารถจัดเก็บในฐานข้อมูลได้อย่างน้อยหกวิธี คุณไม่จำเป็นต้องขนาดนั้น? และใครบอกว่าคุณเลือกวิธีที่จะประหยัด?

ไม่มีประเภทบูลีนใน SQL และมักจะถูกจัดเก็บในลักษณะนี้:

  • 1 หรือ 0
  • 'F' หรือ 'T'
  • 'ย' หรือ 'น'

ดังนั้นจึงเป็นเรื่องดีมากเมื่อ Hibernate เข้าใจปัญหาเหล่านี้ทั้งหมด หรือ ตัวอย่างเช่น ลองมาเก็บข้อมูลอาร์เรย์ข้อมูลในฐานข้อมูล มีตัวเลือกต่างๆ มากมาย และ Hibernate รู้วิธีทำงานกับตัวเลือกทั้งหมด:

ประเภทไฮเบอร์เนต (แพ็คเกจ org.hibernate.type) ประเภท JDBC ประเภทจาวา BasicTypeRegistr
ประเภทหยด หยด java.sql.blob บล็อก java.sql.blob
ชนิดก้อน CLOB java.sql.clob clob, java.sql.clob
ประเภทไบนารี วาร์บินารี่ ไบต์[] ไบนารี, ไบต์[]
MaterializedBlobType หยด ไบต์[] materized_blob
ประเภทรูปภาพ ยาววาร์ไบนารี ไบต์[] ภาพ
WrapperBinaryType วาร์บินารี่ java.lang.Byte[] wrapper-binary, Byte[], java.lang.Byte[]
CharArrayType วาร์ชาร์ ถ่าน[] ตัวอักษร ถ่าน[]
CharacterArrayType วาร์ชาร์ java.lang.อักขระ[] อักขระตัวห่อ, อักขระ [], java.lang. อักขระ []
UUIDBinaryType ไบนารี่ java.util.UUID uuid ไบนารี java.util.UUID
UUIDCharType CHAR ยังสามารถอ่าน VARCHAR java.util.UUID uuid-ถ่าน
PostgreSQLUUIDType PostgreSQL UUID ผ่าน Types#OTHER ซึ่งเป็นไปตามข้อกำหนดไดรเวอร์ PostgreSQL JDBC java.util.UUID pg-uuid
และตั้งแต่เปิดตัว JDK 8 ไฮเบอร์เนตก็ได้เพิ่มประเภทที่เกี่ยวข้องกับเวลาอีกสองสามประเภท ทั้งหมดเพื่อให้ชีวิตของคุณง่ายขึ้น คุณไม่ต้องสงสัยอีกต่อไปว่ารองรับประเภทเขี้ยวใหม่ทั้งหมดเหล่านี้หรือไม่ ผู้สร้าง Hibernate ได้เพิ่มการสนับสนุนสำหรับคุณแล้ว:
ประเภทไฮเบอร์เนต (แพ็คเกจ org.hibernate.type) ประเภท JDBC ประเภทจาวา BasicTypeRegistr
DurationType บิ๊กอินท์ java.time.Duration ระยะเวลา, java.time.Duration
ประเภททันที ประทับเวลา java.time.Instant ทันที, java.time.Instant
LocalDateTimeType ประทับเวลา java.time.LocalDateTime LocalDateTime, java.time.LocalDateTime
LocalDateType วันที่ java.time.LocalDate LocalDate, java.time.LocalDate
ประเภทเวลาท้องถิ่น เวลา java.time.LocalTime LocalTime, java.time.LocalTime
ประเภท OffsetDateTime ประทับเวลา java.time.OffsetDateTime OffsetDateTime, java.time.OffsetDateTime
OffsetTimeประเภท เวลา java.time.OffsetTime OffsetTime, java.time.OffsetTime
OffsetTimeประเภท ประทับเวลา java.time.ZonedDateTime ZonedDateTime, java.time.ZonedDateTime