Сохранение только части коллекции в JPA - PullRequest
0 голосов
/ 18 октября 2018

У меня довольно стандартное отображение @OneToMany в JPA без каскадов (настройка по умолчанию), например:

@JoinColumn(name = "PARENT_ID")
@OneToMany(fetch = FetchType.LAZY)
@OrderBy("date")
private List<ItemRow> items;

Моя проблема в том, что когда я пытаюсь em.merge () этой сущности,Hibernate считает, что если элемент отсутствует в коллекции, он должен быть удален из базы данных.Учитывая, что я не вызываю em.remove () явно, результирующий SQL действительно не пытается удалить элементы, Hibernate просто пытается выполнить SET PARENT_ID = NULL, что, к счастью, не удается из-за ограничений базы данных.

Я не хочу загружать все элементы, просто чтобы сохранить их родителей в базе данных.Это было бы глупо.Мой пользовательский интерфейс разбит на страницы, и когда клиент отправляет частичную коллекцию, это не означает, что другие элементы должны быть удалены, я просто хочу вставить и обновить строки, которые видит пользователь, и оставить не включенные в список.

Что мне делать?Должен ли я удалить отображение коллекции из родительского объекта? Есть ли настройка для «без каскадирования, действительно, используйте это только для загрузки»?

Я использую JBoss EAP 6.4, который содержит Hibernate 4.2.18.

1 Ответ

0 голосов
/ 01 декабря 2018

После прочтения комментариев я решил сохранить родительский объект с простым JDBC, чтобы я мог точно контролировать, что происходит.Результирующий код довольно утомителен, но достаточно надежен, если его тщательно написать.

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

Хотелось бы, чтобы это было более автоматизировано, но наличие коллекции в памяти, которая не в точности соответствует тому, что будет сохранено, похоже на не поддерживаемую операцию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...