ORM لـ Kotlin: مقارنة وأمثلة (Exposed, Ktorm, Hibernate)

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

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

ابدأ الدورة

ORM لـ Kotlin: مقارنة وأمثلة



عند التطوير باستخدام Kotlin، يعد اختيار ORM (رسم الخرائط العلائقية للكائنات) المناسب خطوة أساسية تؤثر على الأداء، وقابلية قراءة الكود، وسهولة الصيانة. في هذه المقالة، سنقارن بين ثلاثة حلول شائعة: Exposed (المكتبة الرسمية من JetBrains)، Ktorm (ORM خفيف موجه لـ DSL)، و Hibernate (الحل التقليدي الثقيل). سنستعرض نقاط قوتها، ميزاتها، ونقدم أمثلة عملية.



1. Exposed - اختيار JetBrains



Exposed هو ORM تم تطويره خصيصًا لـ Kotlin بواسطة شركة JetBrains. يقدم طريقتين: DSL (آمن من حيث النوع) و DAO (كائنات الوصول إلى البيانات). الميزة الرئيسية هي التكامل الكامل مع اللغة: يتم وصف الجداول ككائنات Kotlin، ويتم التحقق من الاستعلامات في وقت الترجمة.



مثال (طريقة DSL):

import org.jetbrains.exposed.sql.*import org.jetbrains.exposed.sql.transactions.transaction

object Users : Table() { val id = integer("id").autoIncrement() val name = varchar("name", 50) val email = varchar("email", 100).uniqueIndex() override val primaryKey = PrimaryKey(id)}

fun main() { Database.connect("jdbc:h2:mem:test", driver = "org.h2.Driver") transaction { SchemaUtils.create(Users) Users.insert { it[name] = "إيفان" it[email] = "ivan@example.com" } val result = Users.selectAll().map { "${it[Users.name]} - ${it[Users.email]}" } println(result) // [إيفان - ivan@example.com] }}


الميزات:

  • استعلامات آمنة من حيث النوع (أخطاء أقل في وقت التشغيل).
  • لا حاجة للانعكاس (أسرع من Hibernate).
  • دعم الترحيل عبر exposed-migration.
  • لا يتطلب إعداد XML أو تعليقات توضيحية - كل شيء في الكود.


2. Ktorm - الخفة والمرونة



Ktorm هو ORM بسيط يستخدم Kotlin DSL لبناء استعلامات SQL. على عكس Exposed، لا يقوم بإنشاء SQL تلقائيًا، بل يسمح بكتابة استعلامات تشبه SQL النقية تقريبًا، ولكن مع التحقق من الأنواع.



مثال:

import me.liuwj.ktorm.database.Databaseimport me.liuwj.ktorm.entity.*import me.liuwj.ktorm.schema.*

interface User : Entity<User> { companion object : Entity.Factory<User>() val id: Int val name: String val email: String}

object Users : Table<User>("users") { val id = int("id").primaryKey().bindTo { it.id } val name = varchar("name").bindTo { it.name } val email = varchar("email").bindTo { it.email }}

fun main() { val database = Database.connect("jdbc:h2:mem:test", driver = "org.h2.Driver") database.sequenceOf(Users).toList() // الحصول على جميع المستخدمين // الإدراج: val user = User { name = "بيتر" email = "petr@example.com" } database.users.add(user)}


الميزات:

  • قريب جدًا من SQL - يسهل تحسين الاستعلامات.
  • حجم JAR صغير (~200 كيلوبايت).
  • دعم الإضافات: ktorm-jackson، ktorm-spring-support.
  • يتطلب ربط الحقول بشكل صريح (bindTo)، مما يزيد من الكود التكراري.


3. Hibernate - المعيار الموثوق



Hibernate هو ORM قوي ولكنه ثقيل من عالم Java. في Kotlin، يتم استخدامه عبر التعليقات التوضيحية أو XML. يوفر Hibernate تحكمًا كاملاً في التخزين المؤقت، والتحميل البطيء، وإنشاء المخطط. ومع ذلك، بسبب الانعكاس وفئات الوكيل، قد تكون هناك مشاكل مع data class (يتطلب open).



مثال:

import javax.persistence.*

@Entity@Table(name = "users")data class User( @Id @GeneratedValue(strategy = GenerationType.IDENTITY) val id: Int = 0, @Column(nullabl

توصيات