تم تغيير اسم المشروع من 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 .
اعتمادا على إصدار السبات الذي تستخدمه، تحتاج إلى إضافة التبعية التالية:
<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، فقد تكون مهتمًا بتعيين التبعيات التالية بناءً على إصدار السبات الخاص بك:
< 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
لتخزين JSON.JsonBlobType
لتعيين نوع عمود 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 وHbernateDuration
Java باستخدام السبات MonetaryAmount
باستخدام JPA وHbernatejava.time.YearMonth
إلى عمود DATE أو INTEGERjava.time.Year
و java.time.Month
باستخدام JPA وHbernateCharacter
إلى عمود 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 أو JPAQueryStackTraceLogger
- كيفية العثور على مصدر استعلام 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
، حيث أن تمهيد الحاويات عند الطلب يكون أبطأ، وستستغرق اختباراتك وقتًا أطول للتشغيل.
إذا كنت تريد إصلاح مشكلة أو إضافة دعم لميزة جديدة، فيرجى تقديم حالة اختبار التكامل المرتبطة التي تثبت أن التحسين يعمل كما هو متوقع.