Начиная с версии 4.27 ORMlite поддерживает настройки foreignAutoCreate и foreignAutoRefresh для аннотации @DatabaseField
в поле:
@DatabaseField(foreign = true, foreignAutoCreate = true, foreignAutoRefresh = true)
public Child child;
Это означает, что вы назначаетеВаше поле child
, и если поле id
на дочернем элементе не установлено при создании родительского элемента, оно будет создано.foreignAutoRefresh
означает, что при извлечении родителя будет выполнен отдельный вызов SQL для заполнения поля child
.
При этом родительский объект сохраняется, но не дочерний объекти автоматически сгенерированный столбец child_id в родительской таблице имеет значение 0. Это нормальное поведение?
Вы также можете лучше контролировать, когда ORMLite выполняет вызовы дочернего объекта, создав дочерний объект. до вы создаете родителя.
Parent parent = new Parent();
parent.name = "ParentName";
Child child = new Child();
child.name = "ChildName";
parent.child = child;
// this will update the id in child
childDao.create(child);
// this saves the parent with the id of the child
parentDao.create(parent);
Еще одна вещь, на которую следует обратить внимание, это то, что без foreignAutoRefresh = true
, когда вы запрашиваете родительский объект, дочерний объект, который вы получаете обратно only извлекается поле id.Если идентификатор представляет собой автоматически сгенерированный int (например), то указанное выше поле имени не будет извлечено, пока вы не выполните обновление дочернего объекта.
// assuming the id of the Parent is the name
Parent parent = parentDao.queryForId("ParentName");
System.out.println("Child id should be set: " + parent.child.id);
System.out.println("Child name should be null: " + parent.child.name);
// now we refresh the child object to load all of the fields
childDao.refresh(parent.child);
System.out.println("Child name should now be set: " + parent.child.name);
Для получения дополнительной документации об этом см.онлайн страница о Поля посторонних объектов .