Ответ
@Embedded в Room позволяет встраивать один объект в другой как составную часть сущности, избегая создания отдельной таблицы. Это упрощает работу с сложными объектами, сохраняя их структуру в БД.
Пример:
data class Address(
val street: String,
val city: String
)
@Entity
data class User(
@PrimaryKey val id: Int,
val name: String,
@Embedded val address: Address
)
В таблице User будут колонки: id, name, street, city. Можно использовать prefix для избежания конфликтов имен. Подходит для композиции объектов, но не для наследования.
Ответ 18+ 🔞
А, ну это же про тот самый Room, который иногда так мозги выносит, что хочется головой об стенку биться. Смотри, есть у них такая фишка — @Embedded. Представь, что ты не хочешь заморачиваться с отдельной таблицей для какого-то мелкого объекта, типа адреса. Ну правда, зачем ему целая таблица, если он всегда идёт в комплекте с пользователем? Как носки, только не теряется.
Так вот, эта аннотация — просто магия, ёпта. Берёшь свой класс, вкладываешь его в сущность, и Room разворачивает его поля прямо в колонки основной таблицы. Никаких лишних связей, джойнов, геморроя. Красота!
Вот смотри на пример, тут всё понятно как божий день:
data class Address(
val street: String,
val city: String
)
@Entity
data class User(
@PrimaryKey val id: Int,
val name: String,
@Embedded val address: Address
)
Что в итоге? В таблице User будут колонки: id, name, street, city. Всё! Объект Address как будто растворился, но его поля на месте. Удобно, правда?
А ещё, если ты вкладываешь несколько объектов с одинаковыми именами полей (ну, бывает же, два адреса: домашний и рабочий), то тут тебе на помощь приходит prefix. Накинешь префикс "home" или "work" — и конфликтов как не бывало. Хитрая жопа, но работает.
Главное помнить — штука эта для композиции, когда один объект является частью другого. Для наследования она не подходит, тут уж извини. Не пытайся запихнуть сюда сложную иерархию классов, а то получишь пиздопроебибну с ошибками компиляции. Используй по назначению, и будет тебе счастье. Всё гениальное — просто, иногда даже в Android-разработке.