ORM لجافا: مقارنة Hibernate و MyBatis و JPA و Spring Data

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

ORM لجافا: مقارنة وأمثلة

في تطوير جافا الحديث، ORM (تعيين الكائنات العلائقية) هو نهج قياسي للتفاعل مع قواعد البيانات العلائقية. يسمح ORM بالعمل مع الجداول ككائنات، مما يقلل من حجم كود boilerplate. في PythonLib سنستعرض أربع أدوات رئيسية: Hibernate و MyBatis و JPA و Spring Data JPA. ستتعرف على ميزاتها ونقاط قوتها وستحصل على أمثلة جاهزة.



ما هو ORM ولماذا هو مطلوب؟

ORM هو طبقة وسيطة بين تطبيق جافا وقاعدة البيانات. يقوم بأتمتة:

  • تعيين فئات جافا إلى جداول
  • توليد استعلامات SQL
  • إدارة المعاملات
  • تخزين البيانات مؤقتًا

بدون ORM، يضطر المطور لكتابة كود JDBC يدويًا، مما يزيد من وقت التطوير وخطر الأخطاء.



1. Hibernate — قوي وناضج

Hibernate هو إطار ORM الأكثر شيوعًا لجافا. يقوم بتنفيذ JPA (واجهة برمجة تطبيقات استمرارية جافا) بالكامل ويضيف إمكانيات خاصة به: تخزين مؤقت من المستوى الثاني، تحميل كسول، HQL (لغة استعلام Hibernate). يقوم Hibernate تلقائيًا بتوليد SQL وإدارة حالة الكائنات.



مثال: كيان واستعلام بسيط

import javax.persistence.*;

@Entity@Table(name = "users")public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id;

@Column(nullable = false) private String name;

@Column(unique = true) private String email;

// getters and setters}

// الاستخدامSession session = sessionFactory.openSession();User user = session.get(User.class, 1L);System.out.println(user.getName());session.close();

الإيجابيات: توليد تلقائي للمخطط، HQL قوي، دعم العمليات المتتالية، مجتمع كبير.
السلبيات: تعقيد الإعداد، مشاكل أداء مع استعلامات N+1، سلوك "سحري".



2. MyBatis — SQL تحت السيطرة

MyBatis ليس ORM كاملًا، بل هو مخطّط SQL. تكتب SQL يدويًا، ويقوم MyBatis بتعيين النتائج إلى كائنات جافا. هذا يمنحك سيطرة كاملة على الاستعلامات وتحسين الأداء.



مثال: المخطّط وتكوين XML

// واجهة المخطّطpublic interface UserMapper {    User selectUser(@Param("id") long id);}

// مخطّط XML (UserMapper.xml)<mapper namespace="com.example.UserMapper"> <select id="selectUser" resultType="User"> SELECT * FROM users WHERE id = #{id} </select></mapper>

// الاستخدامSqlSession session = sqlSessionFactory.openSession();UserMapper mapper = session.getMapper(UserMapper.class);User user = mapper.selectUser(1L);

الإيجابيات: سيطرة كاملة على SQL، أداء عالٍ، نموذج بسيط.
السلبيات: الحاجة لكتابة SQL يدويًا، عدم وجود تخزين مؤقت تلقائي، كود أكثر.



3. JPA (واجهة برمجة تطبيقات استمرارية جافا) — المعيار

JPA هي مواصفة وليست تنفيذًا. تحدد طريقة قياسية لـ ORM من خلال التعليقات التوضيحية و EntityManager. التنفيذ الأكثر شيوعًا هو Hibernate، ولكن يوجد أيضًا EclipseLink و OpenJPA. تسمح JPA بالتبديل بسهولة بين المزوّدين.



مثال: EntityManager

@PersistenceContextprivate EntityManager em;

public User findUser(Long id) { return em.find(User.class, id);}

public List<User> findByName(String name) { return em.createQuery("SELECT u FROM User u WHERE u.name = :name", User.class) .setParameter("name", name) .getResultList();}

الإيجابيات: توحيد المعايير، قابلية النقل، التكامل مع Spring.
السلبيات: قيود المواصفة، الاستعلامات المعقدة تتطلب JPQL.



4. Spring Data JPA — سهولة

توصيات