رابطه یک به چند بین دو موجودیت، رابطهای است که در آن هر نمونه از موجودیت والد با صفر یا چند نمونه از موجودیت فرزند مطابقت دارد، اما هر نمونه از موجودیت فرزند فقط میتواند دقیقاً با یک نمونه از موجودیت والد مطابقت داشته باشد.
در مثال برنامه پخش موسیقی، فرض کنید کاربر توانایی سازماندهی آهنگهای خود را در لیستهای پخش دارد. هر کاربر میتواند به تعداد دلخواه لیست پخش ایجاد کند، اما دقیقاً یک کاربر هر لیست پخش را ایجاد میکند. بنابراین، یک رابطه یک به چند بین موجودیت User و موجودیت Playlist وجود دارد.
برای تعریف و پرس و جو از روابط یک به چند در پایگاه داده خود، این مراحل را دنبال کنید:
- تعریف رابطه : برای هر دو موجودیت کلاسهایی ایجاد کنید، به طوری که موجودیت فرزند به کلید اصلی والد ارجاع دهد.
- پرس و جو از موجودیتها : رابطه را در یک کلاس داده جدید مدلسازی کنید و روشی را برای بازیابی دادههای مرتبط پیادهسازی کنید.
رابطه را تعریف کنید
برای تعریف یک رابطه یک به چند، ابتدا یک کلاس برای دو موجودیت ایجاد کنید. همانند یک رابطه یک به یک، موجودیت فرزند باید شامل یک متغیر باشد که ارجاعی به کلید اصلی موجودیت والد باشد.
کاتلین
@Entity
data class User(
@PrimaryKey val userId: Long,
val name: String,
val age: Int
)
@Entity
data class Playlist(
@PrimaryKey val playlistId: Long,
val userCreatorId: Long,
val playlistName: String
)
جاوا
@Entity
public class User {
@PrimaryKey public long userId;
public String name;
public int age;
}
@Entity
public class Playlist {
@PrimaryKey public long playlistId;
public long userCreatorId;
public String playlistName;
}
پرس و جو از موجودیتها
برای پرس و جو از لیست کاربران و لیستهای پخش مربوطه، ابتدا باید رابطه یک به چند بین این دو موجودیت را مدلسازی کنید.
برای انجام این کار، یک کلاس داده جدید ایجاد کنید که در آن هر نمونه، یک نمونه از موجودیت والد و لیستی از تمام نمونههای موجودیت فرزند مربوطه را در خود جای دهد. حاشیهنویسی @Relation را به نمونه موجودیت فرزند اضافه کنید، به طوری که parentColumn برابر با نام ستون کلید اصلی موجودیت والد و entityColumn برابر با نام ستون موجودیت فرزندی باشد که به کلید اصلی موجودیت والد ارجاع میدهد.
کاتلین
data class UserWithPlaylists(
@Embedded val user: User,
@Relation(
parentColumn = "userId",
entityColumn = "userCreatorId"
)
val playlists: List<Playlist>
)
جاوا
public class UserWithPlaylists {
@Embedded public User user;
@Relation(
parentColumn = "userId",
entityColumn = "userCreatorId"
)
public List<Playlist> playlists;
}
در نهایت، متدی به کلاس DAO اضافه کنید که تمام نمونههای کلاس دادهای که موجودیت والد و موجودیت فرزند را جفت میکند، برمیگرداند. این متد به Room نیاز دارد تا دو کوئری اجرا کند، بنابراین حاشیهنویسی @Transaction را به این متد اضافه کنید تا کل عملیات به صورت اتمی انجام شود.
کاتلین
@Transaction
@Query("SELECT * FROM User")
fun getUsersWithPlaylists(): List<UserWithPlaylists>
جاوا
@Transaction
@Query("SELECT * FROM User")
public List<UserWithPlaylists> getUsersWithPlaylists();