Обновление объектов базы данных, которые имеют чужие коллекции?
Я пытаюсь придумать, как обойти эту проблему. У меня есть объект ORMlite, который может принадлежать нескольким категориям; Я использую другую таблицу (например, ForeignCollection) для отслеживания связей "многие ко многим" между моими объектами и категориями.
Проблема в том, что если я обновлю объект с измененными категориями, новые категории будут добавлены, но старые не будут удалены.
В JavaDoc для метода обновления DAO я вижу этот текст:
ПРИМЕЧАНИЕ. Обычно это не сохраняет изменения, внесенные в чужие объекты или в чужие коллекции.
Мой вопрос об использовании слова "как правило". Означает ли это, что есть какой-то способ настройки, чтобы убедиться, что обновления обновляют связанные внешние объекты / коллекции?
Или я должен прочитать предложение, как если бы "обычно" не было, предположить, что нет автоматического метода, и что мне нужно выполнить дополнительные запросы при фиксации каждого объекта для удаления старых категорий?
3 ответа
Проблема в том, что если я обновлю объект с измененными категориями, новые категории будут добавлены, но старые не будут удалены.
Итак, у вас есть объект, который имеет иностранную коллекцию категорий:
@ForeignCollectionField
ForeignCollection<Category> categories;
Если вы бежите categories.add(category1)
или же categories.remove(category1)
затем базовая коллекция должна удалить их из связанной таблицы, используя встроенный DAO.
Если вы изменяете список категорий каким-либо другим способом, вам придется удалить Category
записи вручную, используя categoryDao
непосредственно.
... об использовании слова "как правило". Означает ли это, что есть какой-то способ настройки, чтобы убедиться, что обновления обновляют связанные внешние объекты / коллекции?
Не уверен, почему я оставил слово "типично" там. Я думаю, что это было общее заявление, чтобы принять во внимание различные настройки полей автоматического создания, автоматического обновления и т. Д. - я не уверен. В любом случае, я удалил его из базы кода.
ORMLite не может узнать, были ли изменены посторонние объекты. Он не создает магические прокси-объекты или сеансы, чтобы он мог определить, когда был обновлен сторонний объект. Вы должны четко указать, что вы хотите обновить, когда. Документация по зарубежным коллекциям довольно откровенна.
OrmLite не будет сохранять объекты в ForeignCollections автоматически. Вы должны хранить и удалять эти объекты самостоятельно. Ormlite будет автоматически извлекать объекты в ForeignCollection, если вы зададите правильные параметры в аннотации.
Ormlite это "облегченный". Это делает ORM, но не полностью. Это не JPA или Hibernate.
Я решил эту проблему, добавив новую категорию непосредственно в таблицу Categories вместо добавления новой категории в foreignCollection объекта. Это можно сделать, просто создав категорию ado и добавив новый элемент. newCategory.setObject(object)
необходим для того, чтобы создать связь с объектом.
Надеюсь это поможет.