ORMLite не загружает дочерние посторонние поля - программирование

ORMLite не загружает дочерние посторонние поля

Я использую ORMLite 4.42 для Android-приложения. У меня есть компания, у которой есть иностранные поля. В этих полях имеются и иностранные поля. Проблема в том, что когда я получаю элемент корневого объекта, загружается только первый уровень иностранных полей. Остальные уровни равны нулю.

В базе данных каждый выглядит нормально. Идентификатор правильный. Любая помощь?

Изменить с помощью моделей.


Модель оборудования всегда имеет значение null qhen Я запрашиваю по ID. Но если я запрашиваю всю таблицу, то она дает мне доступ ко всему.

ТАБЛИЧНЫЙ ИНЦИДЕНТ

@DatabaseField(generatedId=true)
private UUID id;

@DatabaseField(foreign=true, foreignAutoRefresh=true, canBeNull=false)
private UserEntity user;

@DatabaseField(dataType = DataType.DATE, canBeNull=true)
private Date date;

@DatabaseField(foreign=true, foreignAutoRefresh=true, canBeNull=true)
private EquipmentEntity equipment;

ТАБЛИЧНОЕ ОБОРУДОВАНИЕ

@DatabaseField(generatedId=true)
private UUID id;

@DatabaseField(canBeNull=false, unique=true)
private String serial;

@DatabaseField(foreign=true, foreignAutoRefresh=true, canBeNull=false)
private EquipmentTypeEntity type;

ТАБЛИЦА ТИПА ОБОРУДОВАНИЯ

@DatabaseField(generatedId=true)
private UUID id;

@DatabaseField(canBeNull=true)
private String type;

@DatabaseField(foreign=true, foreignAutoRefresh=true, canBeNull=false)
private EquipmentModelEntity model;

МОДЕЛЬ ОБОРУДОВАНИЯ КАБЕЛЕЙ

@DatabaseField(generatedId=true)
private UUID id;

@DatabaseField(canBeNull=false)
private String model;
4b9b3361

Ответ 1

Я использую ORMLite 4.42 для Android-приложения. У меня есть компания, у которой есть иностранные поля. В этих полях имеются и иностранные поля. Проблема в том, что когда я получаю элемент корневого объекта, загружается только первый уровень иностранных полей. Остальные уровни равны нулю.

Правильно, это по дизайну. ORMLite специально ограничивает количество раз, когда он автоматически обновляет подэлемент. Это было сделано для защиты от огромных массивов объектов, поглощающих память, и против самореляционных объектов.

Чтобы процитировать docs для foreignAutoRefresh:

ПРИМЕЧАНИЕ. Чтобы защитить от рекурсии, есть пара мест, которые автоматически обновлялись. Если вы автоматически обновляете класс, у которого есть поле с параметром foreignAutoRefresh, равным true или если вы автоматически обновляете класс с помощью чужой коллекции, в обоих случаях результирующее поле будет установлено в null, а не автоматически обновлено. Вы всегда можете вызвать обновление в поле непосредственно, если вам это нужно.

ПРИМЕЧАНИЕ. Если у вас есть поле с автоматической перезагрузкой, которое является объектом, в котором также есть поле с автоматической перезагрузкой, вы можете настроить значение maxForeignAutoRefreshLevel. См. Ниже.

Для цитирования из документов для maxForeignAutoRefreshLevel:

Это можно использовать для установки максимального количества уровней для настройки посторонних объектов. Например, если у вас есть вопрос, у которого есть чужое поле лучшего ответа, а ответ имеет внешнее поле для соответствующего вопроса, тогда конфигурация взад и вперед может стать большой. Это особенно проблема с автоматически обновляемыми полями при поиске Вопроса, который может вызвать бесконечный цикл. По умолчанию ORMLite проходит только 2 уровня, но вы можете уменьшить его до 1 (0 недействительно) или увеличить его. Чем больше число, тем больше транзакций базы данных происходит при загрузке в вашем Вопросе.

Если вы увеличиваете maxForeignAutoRefreshLevel, чтобы больше, то он выдаст дополнительные запросы для обновления элементов.

@DatabaseField(foreign=true, foreignAutoRefresh=true, canBeNull=true,
    maxForeignAutoRefreshLevel=3)
private EquipmentEntity equipment;