Menentukan dan membuat kueri hubungan one-to-one

Hubungan one-to-one antara dua entity adalah hubungan saat setiap instance parent entity berkaitan dengan tepat satu instance entity turunan, dan hal sebaliknya juga berlaku.

Misalnya, pertimbangkan aplikasi streaming musik tempat pengguna memiliki library lagu yang mereka miliki. Setiap pengguna hanya memiliki satu library, dan setiap library berkaitan dengan tepat satu pengguna. Oleh karena itu, ada hubungan one-to-one antara entity User dan entity Library.

Ikuti langkah-langkah berikut untuk menentukan dan membuat kueri hubungan satu-ke-satu di database Anda:

  1. Menentukan hubungan: Buat class untuk kedua entity, yang memastikan salah satunya mereferensikan kunci utama entity lainnya.
  2. Buat kueri entity: Buat model hubungan dalam class data baru dan buat metode untuk mengambil data terkait.

Menentukan hubungan

Untuk menentukan hubungan one-to-one, pertama-tama buat class untuk kedua entitas Anda. Salah satu entity harus menyertakan variabel yang merupakan referensi ke kunci utama entity lainnya.

Kotlin

@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
)

Java

@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;
}

Membuat kueri entitas

Untuk membuat kueri daftar pengguna dan library terkait, Anda harus terlebih dahulu membuat model hubungan one-to-one antara dua entity.

Untuk melakukannya, buat class data baru tempat setiap instance menyimpan instance parent entity dan instance entity turunan yang sesuai. Tambahkan anotasi @Relation ke instance entity turunan, dengan parentColumn ditetapkan ke nama kolom kunci utama dari entity induk dan entityColumn ditetapkan ke nama kolom entity turunan yang mereferensikan kunci utama entity induk.

Kotlin

data class UserAndLibrary(
    @Embedded val user: User,
    @Relation(
         parentColumn = "userId",
         entityColumn = "userOwnerId"
    )
    val library: Library
)

Java

public class UserAndLibrary {
    @Embedded public User user;
    @Relation(
         parentColumn = "userId",
         entityColumn = "userOwnerId"
    )
    public Library library;
}

Terakhir, tambahkan metode ke class DAO yang menampilkan semua instance class data yang menghubungkan parent entity dan entity turunan. Metode ini memerlukan Room untuk menjalankan dua kueri. Oleh karena itu, Anda harus menambahkan anotasi @Transaction ke metode ini. Hal ini memastikan bahwa seluruh operasi berjalan secara atomik.

Kotlin

@Transaction
@Query("SELECT * FROM User")
fun getUsersAndLibraries(): List<UserAndLibrary>

Java

@Transaction
@Query("SELECT * FROM User")
public List<UserAndLibrary> getUsersAndLibraries();