ชนิดข้อมูลที่สนับสนุน
ในช่วงสามระดับก่อนหน้านี้ เราคุ้นเคยกับ 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 |
ประเภทไฮเบอร์เนต (แพ็คเกจ 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 |
GO TO FULL VERSION