Menentukan dan membuat kueri hubungan one-to-many

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:

  1. Tentukan hubungan: Buat class untuk kedua entity, dengan entity turunan mereferensikan kunci utama induk.
  2. 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>
)