Однозначное отношение между двумя сущностями — это отношение, при котором каждому экземпляру родительской сущности соответствует ровно один экземпляр дочерней сущности, и обратное также верно.
Например, рассмотрим приложение для потоковой передачи музыки, где у пользователя есть собственная библиотека песен. У каждого пользователя только одна библиотека, и каждая библиотека соответствует ровно одному пользователю. Следовательно, существует однозначное соответствие между сущностью User и сущностью Library .
Выполните следующие шаги, чтобы определить и запросить отношения «один к одному» в вашей базе данных:
- Определите взаимосвязь : создайте классы для обеих сущностей, убедившись, что одна ссылается на первичный ключ другой.
- Запрос к сущностям : Смоделируйте взаимосвязь в новом классе данных и создайте метод для получения связанных данных.
Определите взаимоотношения
Для определения отношения «один к одному» сначала создайте класс для каждой из двух сущностей. Одна из сущностей должна содержать переменную, являющуюся ссылкой на первичный ключ другой сущности.
Котлин
@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();