Отношение «один ко многим» между двумя сущностями — это отношение, при котором каждому экземпляру родительской сущности соответствует ноль или более экземпляров дочерней сущности, но каждому экземпляру дочерней сущности может соответствовать только один экземпляр родительской сущности.
В примере с приложением для потоковой передачи музыки предположим, что пользователь может организовывать свои песни в плейлисты. Каждый пользователь может создать столько плейлистов, сколько захочет, но каждый плейлист создаст ровно один пользователь. Следовательно, существует отношение «один ко многим» между сущностью User и сущностью Playlist .
Выполните следующие шаги, чтобы определить и запросить связи «один ко многим» в вашей базе данных:
- Определите взаимосвязь : создайте классы для обеих сущностей, при этом дочерняя сущность будет ссылаться на первичный ключ родительской сущности.
- Запрос к сущностям : Смоделируйте взаимосвязь в новом классе данных и реализуйте метод для получения связанных данных.
Определите взаимоотношения
Для определения отношения «один ко многим» сначала создайте класс для двух сущностей. Как и в отношении «один к одному», дочерняя сущность должна содержать переменную, являющуюся ссылкой на первичный ключ родительской сущности.
Котлин
@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
)
Java
@Entity
public class User {
@PrimaryKey public long userId;
public String name;
public int age;
}
@Entity
public class Playlist {
@PrimaryKey public long playlistId;
public long userCreatorId;
public String playlistName;
}
Запрос к сущностям
Для запроса списка пользователей и соответствующих плейлистов необходимо сначала смоделировать отношение «один ко многим» между этими двумя сущностями.
Для этого создайте новый класс данных, в каждом экземпляре которого будет храниться экземпляр родительской сущности и список всех соответствующих экземпляров дочерних сущностей. Добавьте аннотацию @Relation к экземпляру дочерней сущности, установив parentColumn равным имени столбца первичного ключа родительской сущности, а entityColumn — имени столбца дочерней сущности, который ссылается на первичный ключ родительской сущности.
Котлин
data class UserWithPlaylists(
@Embedded val user: User,
@Relation(
parentColumn = "userId",
entityColumn = "userCreatorId"
)
val playlists: List<Playlist>
)
Java
public class UserWithPlaylists {
@Embedded public User user;
@Relation(
parentColumn = "userId",
entityColumn = "userCreatorId"
)
public List<Playlist> playlists;
}
Наконец, добавьте в класс DAO метод, который возвращает все экземпляры класса данных, связывающего родительскую и дочернюю сущности. Для работы этого метода Room должен выполнить два запроса, поэтому добавьте к нему аннотацию @Transaction , чтобы вся операция выполнялась атомарно.
Котлин
@Transaction
@Query("SELECT * FROM User")
fun getUsersWithPlaylists(): List<UserWithPlaylists>
Java
@Transaction
@Query("SELECT * FROM User")
public List<UserWithPlaylists> getUsersWithPlaylists();