Определение и запрос отношений «один к одному»

Однозначное отношение между двумя сущностями — это отношение, при котором каждому экземпляру родительской сущности соответствует ровно один экземпляр дочерней сущности, и обратное также верно.

Например, рассмотрим приложение для потоковой передачи музыки, где у пользователя есть собственная библиотека песен. У каждого пользователя только одна библиотека, и каждая библиотека соответствует ровно одному пользователю. Следовательно, существует однозначное соответствие между сущностью User и сущностью Library .

Выполните следующие шаги, чтобы определить и запросить отношения «один к одному» в вашей базе данных:

  1. Определите взаимосвязь : создайте классы для обеих сущностей, убедившись, что одна ссылается на первичный ключ другой.
  2. Запрос к сущностям : Смоделируйте взаимосвязь в новом классе данных и создайте метод для получения связанных данных.

Определите взаимоотношения

Для определения отношения «один к одному» сначала создайте класс для каждой из двух сущностей. Одна из сущностей должна содержать переменную, являющуюся ссылкой на первичный ключ другой сущности.

Котлин

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

Запрос к сущностям

Для запроса списка пользователей и соответствующих библиотек необходимо сначала смоделировать отношение «один к одному» между этими двумя сущностями.

Для этого создайте новый класс данных, в каждом экземпляре которого будет содержаться экземпляр родительской сущности и соответствующий экземпляр дочерней сущности. Добавьте аннотацию @Relation к экземпляру дочерней сущности, указав в качестве parentColumn имя столбца первичного ключа родительской сущности и в entityColumn имя столбца дочерней сущности, ссылающегося на первичный ключ родительской сущности.

Котлин

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

Наконец, добавьте в класс DAO метод, который возвращает все экземпляры класса данных, связывающего родительскую и дочернюю сущности. Для работы этого метода Room должен выполнить два запроса. Поэтому следует добавить к этому методу аннотацию @Transaction . Это гарантирует атомарное выполнение всей операции.

Котлин

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

Java

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