Kotlin Academy · درس

Exposed DAO: أصناف Entity والعلاقات

استخدم DAO API لربط الجداول بأصناف Entity والتنقل بين العلاقات.

الدرس 4 من 413 خطوة

Exposed DAO: أصناف Entity والعلاقات درس مجاني في Kotlin Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Kotlin Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Kotlin Academy 4 دروس في المجموع.

ما هي طبقة Exposed DAO؟

تغلف طبقة Exposed DAO (كائن الوصول إلى البيانات) Query DSL بواجهة برمجة على نمط Active Record. وتعرّف فئات فرعية من Entity تطابق صفوف الجداول، ثم تقرأ الخصائص وتكتبها مباشرةً في مثيلات الكيانات.

تعريف Entity

اربط LongIdTable بفئة فرعية من Entity. وتملك كل فئة كيان كائنًا مرافقًا من نوع EntityClass يتولى تنفيذ الاستعلامات:

object Users : LongIdTable("users") {
    val name  = varchar("name", 100)
    val email = varchar("email", 255)
}

class User(id: EntityID<Long>) : LongEntity(id) {
    companion object : LongEntityClass<User>(Users)
    var name  by Users.name
    var email by Users.email
}

إنشاء Entity

استخدم Entity.new { } داخل transaction { } لإنشاء صف جديد والحصول على مثيل كيان:

val alice: User = transaction {
    User.new {
        name  = "Alice"
        email = "alice@example.com"
    }
}

العثور على الكيانات

يوفر الكائن المرافق EntityClass دوالًا للعثور على الكيانات: findById(id) وall() وfind { condition }:

transaction {
    val user: User? = User.findById(1L)
    val allUsers: SizedIterable<User> = User.all()
    val filtered = User.find { Users.name like "Al%" }.toList()
}

تحديث Entity

اقرأ كيانًا، ثم غيّر خصائصه داخل معاملة، وستصدر Exposed تعليمة UPDATE تلقائيًا عند تثبيت المعاملة:

transaction {
    val user = User.findById(1L) ?: error("Not found")
    user.name = "Alice Smith"
    // UPDATE issued on transaction commit
}

حذف Entity

استدعِ entity.delete() داخل معاملة لإزالة الصف المطابق:

transaction {
    User.findById(5L)?.delete()
}

علاقات واحد إلى متعدد

أشِر إلى كيان أب من كيان فرعي باستخدام reference() في الجدول وخاصية by مفوَّضة في الكيان. ويمكنك الوصول إلى قائمة الكيانات الفرعية من الكيان الأب عبر referrersOn:

object Posts : LongIdTable("posts") {
    val title    = varchar("title", 300)
    val authorId = reference("author_id", Users)
}
class Post(id: EntityID<Long>) : LongEntity(id) {
    companion object : LongEntityClass<Post>(Posts)
    var title  by Posts.title
    var author by User referencedOn Posts.authorId
}
// On User entity:
val posts by Post referrersOn Posts.authorId

علاقات متعدد إلى متعدد

استخدم جدول ربط وسيطًا. واعرضه على هيئة EntityClass، ثم صِل إلى طرفَي العلاقة باستخدام via():

object UserRoles : Table("user_roles") {
    val user = reference("user_id", Users)
    val role = reference("role_id", Roles)
}
// On User entity:
var roles by Role via UserRoles

التحميل المسبق مقابل التحميل الكسول

تُحمّل Exposed الكيانات المرتبطة تحميلًا كسولًا افتراضيًا — إذ يؤدي كل وصول إليها إلى تنفيذ استعلام SQL. استخدم load() أو with() لتحميل العلاقات مسبقًا وتجنب مشكلات استعلامات N+1:

transaction {
    User.all().with(User::posts).forEach { user ->
        println("${user.name}: ${user.posts.count()} posts")
    }
}

التخزين المؤقت داخل المعاملة

تخزّن Exposed مثيلات الكيانات مؤقتًا داخل المعاملة. ويؤدي الوصول إلى الكيان نفسه باستخدام المعرّف عدة مرات في معاملة واحدة إلى إعادة كائن الذاكرة نفسه، من دون جولات إضافية إلى قاعدة البيانات.

متى تستخدم DAO ومتى تستخدم Query DSL

استخدم طبقة DAO عندما تريد أنماط وصول كائنية التوجه مع العلاقات. واستخدم Query DSL للعمليات المجمعة، أو عمليات الربط المعقدة، أو التجميعات، أو عندما يكون الأداء مهمًا وتريد تحكمًا دقيقًا في SQL.

تحقق سريع

كيف تنشئ صفًا جديدًا وتحصل فورًا على مثيل كيان باستخدام Exposed DAO؟

مراجعة: Exposed DAO — فئات Entity والعلاقات

النقاط الأساسية:

  • اربط LongIdTable بفئة فرعية من LongEntity؛ وتفوّض الخصائص إلى تعريفات الأعمدة
  • Entity.new { } — إنشاء؛ findById() وfind { } وall() — إجراء استعلام؛ entity.delete() — إزالة
  • واحد إلى متعدد: referencedOn (جهة الكيان الفرعي)، referrersOn (جهة الكيان الأب)
  • متعدد إلى متعدد: جدول ربط + via()
  • استخدم with() لتحميل العلاقات مسبقًا وتجنب استعلامات N+1
البدء مجانًا

تعلم Kotlin مع معلم ذكاء اصطناعي — مجانًا

اكتب وقم بتشغيل أكوادك الفعلية في المتصفح، واحصل على مساعدة فورية من معلم ذكاء اصطناعي متاح 24/7، واستمر من حيث توقفت على الويب أو في التطبيق.

الدورات
51
الدروس
203

الأسئلة الشائعة

هل درس «Exposed DAO: أصناف Entity والعلاقات» مجاني؟

نعم — نص درس «Exposed DAO: أصناف Entity والعلاقات» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Kotlin Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Kotlin Academy 4 دروس في المجموع.

ماذا ستتعلم في «Exposed DAO: أصناف Entity والعلاقات»؟

استخدم DAO API لربط الجداول بأصناف Entity والتنقل بين العلاقات. تتمرن على Kotlin Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Kotlin Academy؟

لا تُشترط خبرة سابقة. Kotlin Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.

كم من الوقت يستغرق درس «Exposed DAO: أصناف Entity والعلاقات»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Kotlin Academy هذا؟

نعم. كل درس في Kotlin Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. إعداد Exposed: اتصال قاعدة البيانات وDSL للمعاملات
  2. تعريف الجداول باستخدام Table DSL
  3. عمليات CRUD باستخدام Query DSL: ‏insert وselect وupdate وdelete
  4. Exposed DAO: أصناف Entity والعلاقات
← العودة إلى Kotlin Academy