קשר אחד-ל-רבים בין שתי ישויות הוא קשר שבו כל מופע של הישות ההורה תואם לאפס או יותר מופעים של הישות הצאצא, אבל כל מופע של הישות הצאצא יכול להתאים רק למופע אחד בלבד של הישות ההורה.
בדוגמה של אפליקציית הסטרימינג של המוזיקה, נניח שהמשתמש יכול לארגן את השירים שלו בפלייליסטים. כל משתמש יכול ליצור כמה פלייליסטים שירצה, אבל כל פלייליסט נוצר על ידי משתמש אחד בלבד. לכן, יש קשר אחד-ל-רבים בין הישות User
לבין הישות Playlist
.
כדי להגדיר יחסי אחד-ל-רבים במסד הנתונים ולבצע שאילתות לגביהן:
- הגדרת הקשר: יוצרים כיתות לשני הישויות, כאשר הישות הצאצאית מפנה למפתח הראשי של ההורה.
- שליחת שאילתות לישויות: יוצרים מודל של הקשר בכיתה נתונים חדשה ומטמיעים שיטה לאחזור הנתונים הקשורים.
הגדרת הקשר
כדי להגדיר קשר אחד-ל-רבים, קודם צריך ליצור כיתה לשתי הישות. כמו בקשר אחד-לאחד, הישות הצאצאית חייבת לכלול משתנה שהוא הפניה למפתח הראשי של הישות ההורה.
Kotlin
@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
)
Java
@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
מוגדר לשם העמודה של הישות הצאצא שמפנה למפתח הראשי של הישות ההורה.
Kotlin
data class UserWithPlaylists(
@Embedded val user: User,
@Relation(
parentColumn = "userId",
entityColumn = "userCreatorId"
)
val playlists: List<Playlist>
)
Java
public class UserWithPlaylists {
@Embedded public User user;
@Relation(
parentColumn = "userId",
entityColumn = "userCreatorId"
)
public List<Playlist> playlists;
}
לבסוף, מוסיפים שיטה לכיתה DAO שמחזירה את כל המופעים של כיתה הנתונים שמתאימים את הישות ההורה לישות הצאצא. כדי להריץ את השיטה הזו, צריך להריץ שתי שאילתות ב-Room, לכן צריך להוסיף את ההערה @Transaction
לשיטה הזו כדי שהפעולה כולה תתבצע באופן אטומי.
Kotlin
@Transaction
@Query("SELECT * FROM User")
fun getUsersWithPlaylists(): List<UserWithPlaylists>
Java
@Transaction
@Query("SELECT * FROM User")
public List<UserWithPlaylists> getUsersWithPlaylists();