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