ORM لجافا: مقارنة وأمثلة
ORM (تعيين الكائنات العلائقية) هي تقنية تربط نموذج جافا الموجه للكائنات بقواعد البيانات العلائقية. إنها تريح المطور من كتابة كود SQL النمطي وتسمح بالعمل مع البيانات ككائنات جافا عادية. في جافا، هناك ثلاثة مناهج شائعة: Hibernate (ORM كامل)، MyBatis (مخطط SQL) وJPA (معيار جافا). في هذه المقالة، سنقارنها بأمثلة عملية.
1. JPA (واجهة برمجة استمرارية جافا)
JPA هي مواصفة (معيار) وليست تنفيذًا محددًا. التنفيذ الأكثر شيوعًا هو Hibernate، ولكن هناك أيضًا آخرون (EclipseLink، OpenJPA). توفر JPA تعليقات توضيحية لتعيين الكيانات وتدعم JPQL (لغة استعلام استمرارية جافا).
مثال على كيان JPA:
import javax.persistence.*;
@Entity@Table(name = "users")public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id;
@Column(name = "username", nullable = false, length = 50) private String username;
@Column(name = "email") private String email;
// الدوال الجالبة والسالبة public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; }}مثال على الحفظ عبر EntityManager:
EntityManagerFactory emf = Persistence.createEntityManagerFactory("my-persistence-unit");EntityManager em = emf.createEntityManager();
em.getTransaction().begin();User user = new User();user.setUsername("ivan");user.setEmail("ivan@example.com");em.persist(user);em.getTransaction().commit();
em.close();emf.close();2. Hibernate
Hibernate هو أكثر ORM نضجًا ووظيفية لجافا. إنه ينفذ JPA بالكامل، ولكن لديه أيضًا امتداداته الخاصة. يقوم Hibernate تلقائيًا بإنشاء SQL، ويدير التخزين المؤقت، ويدعم التحميل البطيء والعمليات المتتالية.
مثال على التعيين مع Hibernate (باستخدام التعليقات التوضيحية لـ JPA):
import org.hibernate.annotations.Cache;import org.hibernate.annotations.CacheConcurrencyStrategy;
@Entity@Table(name = "orders")@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)public class Order { @Id @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "order_seq") @SequenceGenerator(name = "order_seq", sequenceName = "order_sequence", allocationSize = 1) private Long id;
@ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "user_id") private User user;
@Column(name = "total_amount") private Double totalAmount;
// الدوال الجالبة والسالبة}مثال على استعلام عبر Hibernate Criteria API:
Session session = sessionFactory.openSession();CriteriaBuilder builder = session.getCriteriaBuilder();CriteriaQuery<User> query = builder.createQuery(User.class);Root<User> root = query.from(User.class);query.select(root).where(builder.equal(root.get("username"), "ivan"));
List<User> users = session.createQuery(query).getResultList();session.close();3. MyBatis
MyBatis ليس ORM كاملاً، بل هو مخطط SQL. إنه لا ينشئ SQL تلقائيًا، بل يوفر آلية مرنة لكتابة استعلامات SQL الخاصة مع تعيين النتائج على كائنات جافا. MyBatis مثالي عندما تحتاج إلى تحكم كامل في SQL والأداء.
مثال على التعيين في XML (UserMapper.xml):
<mapper namespace="com.example.mapper.UserMapper"> <select id="selectUser" resultType="User">\