В моем недавнем проекте на Android я использую OrmLite для моделирования отношений «один ко многим», а также простых отношений «один к одному». Я заметил, что при отношениях «один ко многим» дочерний элемент содержит ссылку внешнего ключа на родителя в базе данных. Тем не менее, при загрузке родительского объекта OrmLite знает, что делать, и загружает коллекцию дочерних элементов, что, конечно же, является желаемым поведением.
Однако с простыми отношениями «один к одному» родительский объект, по-видимому, должен содержать столбец внешнего ключа, чтобы добиться того же поведения.
Итак, фактический вопрос: возможно ли, чтобы OrmLite загружал дочерние объекты в отношениях один к одному, когда внешний ключ установлен только в дочернем элементе, поскольку это стандартное поведение с отношениями один ко многим?
Вот пример кода:
@DatabaseTable
public class Parent
{
@DatabaseField(foreign = true)
private Child1 child1;
@ForeignCollectionField
private Collection<Child2> children2;
}
Итак, в дочерних 1 и 2 мне нужно иметь ссылку на родителя следующим образом:
public class Child1 / Child2
{
@DatabaseField(foreign = true)
private Parent parent;
}
Поэтому при сохранении ребенка2 я просто устанавливаю
child2.setParent(parent);
child2Dao.create(child2)
Но чтобы получить такое же поведение при запросе родителя, включая дочерний элемент1 и дочерний элемент2, мне пришлось бы сохранять отношения наоборот:
parent.setChild1(child1)
parentDao.create(parent)
Это очень неудобно, так как я хочу, чтобы либо child1/child2 содержали внешний ключ родителя, либо наоборот. Но смесь кажется несколько некрасивой!
Есть идеи, как этого добиться?
Я искал ответы на этот вопрос здесь, но не нашел. Если это дубликат, извините!
Большое тебе спасибо!
Редактировать:
Точнее: можно ли установить внешний ключ в моей таблице child1 и по-прежнему иметь возможность получить child1 при запросе Parent. ORMLite делает это автоматически для чужой коллекции child2. Я хочу такого же поведения для ребенка1. Но когда я установил
child1.setParent(parent);
child1Dao.create(child1);
а потом сделать запрос
Parent parent = parentDao.queryForId(1)
получается только дочерний элемент2, поскольку в родительской таблице нет ссылки (внешнего ключа) на дочерний элемент1. Только child1 имеет ссылку на родителя.
Итак: я хочу, чтобы OrmLite автоматически обновлял родительский столбец внешнего ключа или говорил Ormlite по-прежнему получать дочерний элемент1, даже если в родительском элементе не установлен внешний ключ (как это именно в случае с коллекцией дочерних2). Это как-то возможно? Или нет?
Я надеюсь, что это не слишком запутанно :) Я полностью понимаю, что было бы проще просто установить внешний ключ в родительском элементе. Но мне очень не нравится такой подход, так как у некоторых детей будет внешний ключ родителя, а у некоторых нет.
Большое Вам спасибо