Как работать с реляционными данными во вложенных 1-в-1 объектах в комнате (конвертировать ForeignKey в объект)
Допустим, у меня есть Order
и User
Entity
это напоминает что-то вроде этого:
User.java
:
@Entity
public class User {
@PrimaryKey
public long id;
@NonNull
public String username;
}
Order.java
:
@Entity(foreignKeys = @ForeignKey(entity = User.class,
parentColumns = "id",
childColumns = "user_id",
onDelete = ForeignKey.CASCADE,
onUpdate = ForeignKey.CASCADE),
indices = @Index("user_id"))
public class Order {
@PrimaryKey
public long id;
public String description;
@ColumnInfo(name = "user_id")
public long userId;
@Ignore
private User user;
}
Таким образом, у меня есть Order
с User
внутри него, в базе данных, я сохраняю это отношение только с идентификатором пользователя как Foreign Key
а не сам объект (это @Ignore
d), так что все хорошо и реляционно и может быть расширено для использования с другими типами несколькими различными способами, запросами и т. д.
Теперь вопрос в том, как мне получить Order
с User
объект автоматически заполняется комнатой внутри него?
Если я использую @Embedded
, затем Order
а также User
будет жить на одном столе, что не хорошо для реляционного разделения типов. Я мог бы вернуть их обоих вместе с JOIN
но все же это работает только для типов данных, которые имеют разные имена (возможно, они оба имеют столбец с именем "description"?), кроме того, вставляя Order
с User
внутри это не будет просто с JOIN
, @Relation
работает только для одного ко многим, и это нужно List
это не мой случай.
Я думал, что, возможно, @TypeConverter
будет лучшим вариантом здесь, преобразование между long
а также User
, но это тоже сложно. @TypeConverter
потребуется ссылка на DAO
так что он мог бы запросить User
и @TypeConverter
статический метод, вызываемый Room, поэтому передача DAO
может быть сложным и привести к множеству запахов кода, кроме этого дополнительного запроса для каждого User
вызовет несколько поисков, которые не будут в том же @Transaction
,
Я новичок в Room, но держу пари, что есть правильный способ исправить это, использовать Room с реляционными типами, как это было задумано, я просто не могу найти способ сделать эту работу просто и красиво, и не могу найти это в любых документах.
1 ответ
Теперь вопрос в том, как получить ордер с объектом User, автоматически заполняемым Room внутри него?
Я думаю, что нет готового решения для этого.
ИМХО, модель сущности (т.е. Order
отображение FK с User.id
) не должен распространяться на верхний уровень, такой как домен / уровень представления, обеспечивая DataMapper
преобразовать модель объекта в модель предметной области (т.е. User
содержит Order
) для верхнего слоя может быть лучшим вариантом.