Hubungan one-to-many antara dua entity adalah hubungan saat setiap instance parent entity tidak berkaitan atau berkaitan dengan beberapa instance entity turunan, tetapi setiap instance entity turunan hanya berkaitan dengan tepat satu instance parent entity.
Dalam contoh aplikasi streaming musik, misalnya pengguna dapat mengatur
lagu mereka ke dalam playlist. Setiap pengguna dapat membuat playlist sebanyak yang diinginkan,
tetapi setiap playlist dibuat oleh satu pengguna saja. Oleh karena itu, ada hubungan
one-to-many antara entity User dan entity Playlist.
Ikuti langkah-langkah berikut untuk menentukan dan membuat kueri hubungan one-to-many di database Anda:
- Tentukan hubungan: Buat class untuk kedua entity, dengan entity turunan mereferensikan kunci utama induk.
- Kueri entitas: Buat model hubungan di class data baru dan terapkan fungsi untuk mengambil data terkait.
Menentukan hubungan
Untuk menentukan hubungan one-to-many, buat class untuk setiap entitas terlebih dahulu. Seperti dalam hubungan one-to-one, entity turunan harus menyertakan variabel yang mereferensikan kunci utama parent entity.
@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 )
Mengkueri entity
Untuk membuat kueri daftar pengguna dan playlist terkait, Anda harus terlebih dahulu memodelkan hubungan one-to-many di antara dua entity.
Untuk membuat model hubungan, buat class data baru. Setiap instance class ini menyimpan instance parent entity dan daftar semua instance entity turunan yang sesuai.
Tambahkan anotasi @Relation ke properti yang merepresentasikan daftar
entitas turunan. Tetapkan parentColumns ke nama kolom kunci utama
parent entity, dan tetapkan entityColumns ke nama kolom
child entity yang mereferensikan kunci utama parent entity.
data class UserWithPlaylists( @Embedded val user: User, @Relation( parentColumns = ["userId"], entityColumns = ["userCreatorId"] ) val playlists: List<Playlist> )
Terakhir, tambahkan fungsi ke class objek akses data (DAO) yang menampilkan semua instance class data yang menghubungkan parent entity dan entity turunan.
Tambahkan anotasi @Transaction agar Room melakukan seluruh operasi secara atomik. Anotasi ini diperlukan karena fungsi memerlukan Room untuk menjalankan dua kueri.
@Transaction @Query("SELECT * FROM User") suspend fun getUsersWithPlaylists(): List<UserWithPlaylists>
Kunci komposit
Jika Anda menentukan hubungan menggunakan kunci gabungan, tentukan beberapa kolom di
parentColumns dan entityColumns. Urutan kolom dalam parentColumns
harus cocok dengan urutan kolom dalam entityColumns.
@Entity(primaryKeys = ["firstName", "lastName"]) data class User( val firstName: String, val lastName: String, val age: Int ) @Entity data class Playlist( @PrimaryKey val playlistId: Long, val userFirstName: String, val userLastName: String, val playlistName: String ) data class UserWithPlaylists( @Embedded val user: User, @Relation( parentColumns = ["firstName", "lastName"], entityColumns = ["userFirstName", "userLastName"] ) val playlists: List<Playlist> )