ชื่อโปรเจ็กต์เปลี่ยนจาก Hibernate Types เป็น Hypersistence Utils เนื่องจากขอบเขตของโปรเจ็กต์กว้างขึ้นมากในขณะนี้ โดยนำเสนอยูทิลิตี้ Spring ด้วยเช่นกัน
ด้วยเหตุนี้ เมื่อย้ายจาก Hibernate Types 2.x ไปเป็น Hypersistence Utils 3.x คุณจะต้องทำตามขั้นตอนเหล่านี้:
com.vladmihalcea.hibernate
เป็น io.hypersistence.utils.hibernate
com.vladmihalcea.spring
เป็น io.hypersistence.utils.spring
แค่นั้นแหละ!
โครงการ Hypersistence Utils มอบยูทิลิตี้อเนกประสงค์สำหรับทั้ง Spring และ Hibernate
ข้อได้เปรียบหลักของโปรเจ็กต์นี้คือ รองรับเวอร์ชัน Hibernate ที่หลากหลาย ครอบคลุมตั้งแต่ Hibernate ORM 6.6 , 6.5 , 6.4 , 6.3 ถึง 6.2 , 6.1 , 6.0 , 5.6 และ Hibernate 5.5
ขึ้นอยู่กับเวอร์ชัน Hibernate ที่คุณใช้ คุณต้องเพิ่มการขึ้นต่อกันต่อไปนี้:
<dependency>
<groupId>io.hypersistence</groupId>
<artifactId>hypersistence-utils-hibernate-63</artifactId>
<version>3.9.0</version>
</dependency>
<dependency>
<groupId>io.hypersistence</groupId>
<artifactId>hypersistence-utils-hibernate-62</artifactId>
<version>3.9.0</version>
</dependency>
<dependency>
<groupId>io.hypersistence</groupId>
<artifactId>hypersistence-utils-hibernate-60</artifactId>
<version>3.9.0</version>
</dependency>
<dependency>
<groupId>io.hypersistence</groupId>
<artifactId>hypersistence-utils-hibernate-55</artifactId>
<version>3.9.0</version>
</dependency>
โปรเจ็กต์ Hypersistence Utils กำหนดรายการการขึ้นต่อกันที่เป็นตัวเลือกที่คุณจะต้องประกาศอย่างชัดเจนในโปรเจ็กต์ของคุณเพื่อใช้งาน
เหตุผลที่การขึ้นต่อกันเหล่านี้เป็นทางเลือก เช่น Guava, Jackson หรือ PostgreSQL JDBC Driver ก็คือไม่ใช่ทุกโปรเจ็กต์อาจจำเป็นต้องใช้
นอกจากนี้ เวอร์ชันที่ขึ้นต่อกันมีความสำคัญอย่างยิ่ง เนื่องจากในบางครั้งอาจพบปัญหาด้านความปลอดภัยที่ได้รับการแก้ไขในเวอร์ชันที่ใหม่กว่า
ดังนั้นการใช้ไลบรารี่นี้ในการจัดหาเวอร์ชันที่ต้องพึ่งพาให้กับคุณจึงเป็นสิ่งที่อันตรายมาก
ตัวอย่างเช่น มีปัญหาด้านความปลอดภัย 65 รายการที่พบในไลบรารี Jackson Data Bind ที่โปรเจ็กต์นี้ต้องพึ่งพาอย่างมาก
เพื่อหลีกเลี่ยงปัญหาด้านความปลอดภัยที่เสี่ยง คุณต้องรับผิดชอบในการอัพเกรดการขึ้นต่อกันทั้งหมดที่คุณใช้ร่วมกับไลบรารี Hypersistence Utils อย่างต่อเนื่อง
หากคุณใช้ประเภท JSON คุณอาจสนใจตั้งค่าการขึ้นต่อกันต่อไปนี้ตามเวอร์ชัน Hibernate ของคุณ:
< dependency >
< groupId >com.fasterxml.jackson.module</ groupId >
< artifactId >jackson-module-jakarta-xmlbind-annotations</ artifactId >
< version >${jackson-module-jakarta-xmlbind-annotation}</ version >
</ dependency >
< dependency >
< groupId >com.fasterxml.jackson.core</ groupId >
< artifactId >jackson-databind</ artifactId >
< version >${jackson-databind.version}</ version >
</ dependency >
< dependency >
< groupId >com.fasterxml.jackson.module</ groupId >
< artifactId >jackson-module-jaxb-annotations</ artifactId >
< version >${jackson-module-jaxb-annotation}</ version >
</ dependency >
หากคุณกำลังแมป Range
โดยใช้ Guava คุณจะต้องระบุการพึ่งพา Guava อย่างชัดเจน:
< dependency >
< groupId >com.google.guava</ groupId >
< artifactId >guava</ artifactId >
< version >${guava.version}</ version >
</ dependency >
หากคุณกำลังแมป MonetaryAmount
คุณต้องระบุการขึ้นต่อกันของ Moneta อย่างชัดเจน:
< dependency >
< groupId >org.javamoney</ groupId >
< artifactId >moneta</ artifactId >
< version >${moneta.version}</ version >
< type >pom</ type >
</ dependency >
หากคุณกำลังแมปประเภทคอลัมน์เฉพาะของ PostgreSQL (เช่น inet
, hstore
, array
, interval
) คุณจะต้องระบุการพึ่งพา PostgreSQL อย่างชัดเจน:
< dependency >
< groupId >org.postgresql</ groupId >
< artifactId >postgresql</ artifactId >
< version >${postgresql.version}</ version >
</ dependency >
JsonType
ช่วยให้คุณจับคู่ประเภทคอลัมน์ JSON ได้ ไม่ว่าคุณจะใช้ Oracle, SQL Server, PostgreSQL หรือ MySQL ก็ตาม
หากคุณใช้ Hibernate 6 คุณสามารถแมปคอลัมน์ JSON ใดๆ กับคุณสมบัติเอนทิตี Map
, List
, POJO, String
หรือ JsonNode
ได้:
@ Type ( JsonType . class )
private Map < String , String > properties = new HashMap <>();
หากคุณใช้ Hibernate 5 คุณสามารถระบุชื่อประเภท Hibernate ที่มีคุณสมบัติครบถ้วนได้:
@Type(type = "io.hypersistence.utils.hibernate.type.json.JsonType")
หรือคุณสามารถเพิ่มการแม็พต่อไปนี้ให้กับคลาส package-info.java
ของคุณในแพ็คเกจเดียวกันกับที่เอนทิตี JPA ของคุณอยู่:
@ TypeDef (
name = "json" , typeClass = JsonType . class
)
package io . hypersistence . optimizer ;
import io . hypersistence . utils . hibernate . type . json . JsonType ;
import org . hibernate . annotations . TypeDef ;
หลังจากนั้น คุณสามารถแมปคุณสมบัติเอนทิตี Map
, List
, POJO, String
หรือ JsonNode
กับคอลัมน์ JSON ได้ดังนี้:
@ Type ( type = "json" )
private Map < String , String > properties = new HashMap <>();
สำหรับรายละเอียดเพิ่มเติม โปรดดูบทความนี้
เมื่อแมปประเภทคอลัมน์ JSON กับ
POJO
,List<POJO>
หรือMap<String, POJO>
คุณต้องแน่ใจว่าประเภทPOJO
จะแทนที่วิธีequals
และhashCode
เริ่มต้น และนำไปใช้ตามเนื้อหาออบเจ็กต์ JSONมิฉะนั้น กลไกการตรวจสอบสกปรกของไฮเบอร์เนตอาจทำให้เกิดคำสั่ง UPDATE ที่ไม่คาดคิด ตรวจสอบฉบับ #134 สำหรับรายละเอียดเพิ่มเติม
เมื่อใช้ Oracle คุณมีหลายตัวเลือก:
JsonType
ทั่วไปที่สามารถทำงานกับประเภทคอลัมน์ JSON
, VARCHAR
หรือ BLOB
ได้ ตราบใดที่คุณบอกใบ้ประเภทคอลัมน์โดยใช้แอตทริบิวต์ columnDefinition
ของคำอธิบายประกอบ JPA @Column
JsonStringType
เพื่อแมปประเภทคอลัมน์ VARCHAR2
ที่จัดเก็บ JSONJsonBlobType
เพื่อแมปประเภทคอลัมน์ BLOB
ที่จัดเก็บ JSONสำหรับรายละเอียดเพิ่มเติม โปรดดูบทความนี้
เมื่อใช้ SQL Server คุณสามารถใช้ JsonType
ทั่วไปหรือ JsonStringType
เพื่อแมปประเภทคอลัมน์ NVARCHAR
ที่จัดเก็บ JSON
สำหรับรายละเอียดเพิ่มเติม โปรดดูบทความนี้
เมื่อใช้ PostgreSQL คุณสามารถใช้ JsonType
ทั่วไปหรือ JsonBinaryType
เพื่อแมปทั้งประเภทคอลัมน์ jsonb
และ json
สำหรับรายละเอียดเพิ่มเติม โปรดดูบทความนี้
เมื่อใช้ MySQL คุณสามารถใช้ JsonType
ทั่วไปหรือ JsonStringType
เพื่อแมปประเภทคอลัมน์ json
สำหรับรายละเอียดเพิ่มเติม โปรดดูบทความนี้
JsonNode
กับคอลัมน์ JSONNo Dialect mapping for JDBC type: 1111
เมื่อผสมประเภท JSON กับแบบสอบถาม SQL ดั้งเดิมcolumn is of type jsonb but expression is of type record
หรือปัญหา bytea
List
Java ด้วย JPA และ HibernateDuration
ด้วย Hibernate MonetaryAmount
กับ JPA และ Hibernatejava.time.YearMonth
ถึง DATE หรือ INTEGERjava.time.Year
และ java.time.Month
ด้วย JPA และ HibernateCharacter
เป็นคอลัมน์ CHAR ที่เป็นโมฆะImmutableType
เพื่อลดความซับซ้อนในการใช้งาน UserType
findAll
รูปแบบต่อต้านทั้งหมด@Retry
เพื่อลองอีกครั้งโดยอัตโนมัติเมื่อเกิดความล้มเหลว BaseJpaRepository
เป็นทางเลือกที่ดีกว่ามากสำหรับ Spring Data JpaRepository
เริ่มต้น เนื่องจากไม่มีเมธอด findAll
หรือเมธอด save
ที่ไม่สมเหตุสมผลในคำศัพท์ของ JPA
หากต้องการใช้ยูทิลิตี BaseJpaRepository
ตรวจสอบให้แน่ใจว่าคุณได้ระบุแอ็ตทริบิวต์ repositoryBaseClass
ในคอนฟิกูเรชัน @EnableJpaRepositories
เพื่ออ้างอิง BaseJpaRepositoryImpl
จากโปรเจ็กต์ Hypersistence Utils:
@ Configuration
@ EnableJpaRepositories (
value = "your.repository.package" ,
repositoryBaseClass = BaseJpaRepositoryImpl . class
)
public class JpaConfiguration {
...
}
your.repository.package
เป็นแพ็คเกจ Java ของที่เก็บ Spring ของคุณ
แม้ว่า BaseJpaRepository
จะเป็นที่ต้องการ แต่ในกรณีที่คุณต้องการใช้ JpaRepository
เริ่มต้น อย่างน้อยคุณก็สามารถขยาย HibernateRepository
ได้เช่นกันเพื่อเลิกใช้วิธีการที่อาจทำให้เกิดปัญหาได้
หากต้องการใช้ HibernateRepository
ให้แน่ใจว่าคุณรวมแพ็คเกจ io.hypersistence.utils.spring.repository
ในการกำหนดค่า @EnableJpaRepositories
ของคุณ:
@ Configuration
@ EnableJpaRepositories (
value = {
"io.hypersistence.utils.spring.repository" ,
"your.repository.package" ,
...
}
)
public class JpaConfiguration {
...
}
your.repository.package
เป็นแพ็คเกจ Java ของที่เก็บ Spring ของคุณ
BatchSequenceGenerator
- ตัวสร้างลำดับชุดไฮเบอร์เนต CamelCaseToSnakeCaseNamingStrategy
- วิธีแมปคุณสมบัติ CamelCase กับชื่อคอลัมน์ Snake_case ด้วย Hibernate ClassImportIntegrator
- วิธีเขียนแบบสอบถามการฉายภาพ DTO แบบกะทัดรัดด้วย JPAListResultTransformer
- วิธีที่ดีที่สุดในการใช้ Hibernate ResultTransformerMapResultTransformer
- วิธีส่งคืนผลลัพธ์แผนที่จากแบบสอบถาม JPA หรือ Hibernate SQLStatementCountValidator
- วิธีตรวจสอบปัญหาแบบสอบถาม Hibernate N+1 ในระหว่างการทดสอบ SQLExtract
- วิธีรับแบบสอบถาม SQL จาก JPQL หรือ JPA CriteriaQueryStackTraceLogger
- วิธีค้นหาแหล่งที่มาของการสืบค้น SQL ที่สร้างโดย Hibernateโปรเจ็กต์นี้ฟรี เช่นเดียวกับใน Libre ไม่ใช่แบบฟรี
ไม่มีการสนับสนุนฟรี เฉพาะซอร์สโค้ดและไบนารีเท่านั้นที่สามารถใช้งานได้ฟรี
หากคุณต้องการความช่วยเหลือเกี่ยวกับปัญหาที่กำหนด คุณจะต้องซื้อโปรแกรม Coaching Basic หรือ Coaching Pro
นอกจากตัวเลือกการสนับสนุนแบบชำระเงินแล้ว คุณยังมีตัวเลือกในการแก้ไขด้วยตนเองอีกด้วย ต่อไปนี้คือสิ่งที่คุณต้องทำ:
อย่างไรก็ตาม เนื่องจากไม่มีเวลา ฉันจะตรวจสอบคำขอดึงที่ส่งมาเป็นครั้งคราว ดังนั้นคุณอาจต้องรอหลายเดือนจนกว่าคำขอดึงจะได้รับการตรวจสอบและรวมเข้าด้วยกัน
ลองนึกภาพการมีเครื่องมือที่สามารถตรวจจับได้โดยอัตโนมัติว่าคุณใช้ JPA และ Hibernate อย่างถูกต้องหรือไม่ ไม่มีปัญหาด้านประสิทธิภาพอีกต่อไป ไม่ต้องเสียเวลานับไม่ถ้วนในการพยายามคิดว่าเหตุใดแอปพลิเคชันของคุณจึงแทบไม่มีการรวบรวมข้อมูลอีกต่อไป
ลองนึกภาพการค้นพบตั้งแต่เนิ่นๆ ในระหว่างวงจรการพัฒนาว่าคุณกำลังใช้การแมปที่ต่ำกว่าปกติและความสัมพันธ์ของเอนทิตี หรือว่าคุณพลาดการตั้งค่าที่เกี่ยวข้องกับประสิทธิภาพ
ยิ่งไปกว่านั้น ด้วย Hypersistence Optimizer คุณสามารถตรวจพบปัญหาดังกล่าวทั้งหมดในระหว่างการทดสอบ และตรวจสอบให้แน่ใจว่าคุณไม่ได้ปรับใช้การเปลี่ยนแปลงที่จะส่งผลต่อประสิทธิภาพของชั้นการเข้าถึงข้อมูลในการผลิต
Hypersistence Optimizer เป็นเครื่องมือที่คุณรอคอยมานาน!
หากคุณสนใจการฝึกอบรมนอกสถานที่ ฉันสามารถเสนอการฝึกอบรม Java Persistence ประสิทธิภาพสูง ซึ่งสามารถปรับให้เข้ากับเซสชันหนึ่ง สอง หรือสามวันได้ สำหรับรายละเอียดเพิ่มเติม โปรดดูที่เว็บไซต์ของฉัน
หากคุณต้องการให้ฉันตรวจสอบใบสมัครของคุณและให้ข้อมูลเชิงลึกเกี่ยวกับวิธีเพิ่มประสิทธิภาพเพื่อให้ทำงานเร็วขึ้น โปรดดูหน้าให้คำปรึกษาของฉัน
หากคุณต้องการวิธีที่เร็วที่สุดในการเรียนรู้วิธีเพิ่มความเร็วแอปพลิเคชันฐานข้อมูล Java คุณควรลงทะเบียนในหลักสูตรวิดีโอ Java Persistence ประสิทธิภาพสูงของฉันอย่างแน่นอน
หรือหากคุณชอบอ่านหนังสือ คุณจะต้องชอบหนังสือ High-Performance Java Persistence ของฉันด้วยเช่นกัน
โปรเจ็กต์ใช้ Maven Toolchains เนื่องจากโมดูลต่างๆ ได้รับการคอมไพล์และทดสอบโดยใช้ Java เวอร์ชันต่างๆ
Hypersistence Utils 6 ต้องการ Java 11 ในขณะที่โมดูลอื่นๆ คอมไพล์ด้วย Java 8
หากต้องการดูวิธีกำหนดค่า Maven Toolchains โปรดดูบทความนี้
โปรเจ็กต์ใช้ระบบฐานข้อมูลที่หลากหลายสำหรับการทดสอบการรวม และคุณสามารถกำหนดการตั้งค่าการเชื่อมต่อ JDBC โดยใช้อินสแตนซ์ DatasourceProvider
(เช่น PostgreSQLDataSourceProvider
) และโปรเจ็กต์ใช้ Testcontainers เพื่อบูตคอนเทนเนอร์ Docker ด้วย Oracle, SQL Server, PostgreSQL หรือ MySQL ที่จำเป็น ตัวอย่างตามความต้องการ
หากคุณเป็นผู้มีส่วนร่วมเป็นประจำ ขอแนะนำให้ตั้งค่าฐานข้อมูลที่จำเป็นในเครื่อง หรือใช้การกำหนดค่า Docker Compose ที่ให้ไว้ในโฟลเดอร์
docker
เนื่องจากการบูตสแตรปคอนเทนเนอร์ตามความต้องการจะช้าลง และการทดสอบของคุณจะใช้เวลานานกว่าในการรัน
หากคุณต้องการแก้ไขปัญหาหรือเพิ่มการสนับสนุนสำหรับคุณลักษณะใหม่ โปรดระบุกรณีทดสอบการผสานรวมที่เกี่ยวข้องซึ่งพิสูจน์ว่าการปรับปรุงทำงานได้ตามที่คาดไว้