Я использую JPA 2.0 некоторое время, но, к сожалению, у меня не было достаточно времени, чтобы изучить его должным образом. Похоже, мне не хватает основ работы с Entity Manager.Поддержание отношений в JPA 2.0
Перемещение по одному шагу за раз, я хотел бы сначала спросить вас о поддержании связей между отображаемыми объектами. Конечно, я знаю, как создавать сопоставления между сущностями, различными типами доступных ассоциаций (OneToOne
и т. Д.) И как работают базы данных в целом. Я полностью сосредоточен на том, чтобы поддерживать его через Entity Manager
, поэтому, пожалуйста, не отправляйте меня в какой-либо учебник общего знания :-).
Вопросов:
- Правильно ли я, что как программист я ответственен за сохранение (создание/обновление/удаление) отношения между экземплярами сущностей?
- Должен ли я всегда обновлять (устанавливать в null, удалять из коллекции и т. Д.) Экземпляры вручную?
- Plain SQL может устанавливать сущности в NULL при удалении, но, похоже, JPA не может делать такую простую вещь. Это также кажется бременем для этого вручную. Есть ли способ добиться этого с помощью JPA?
- Если у меня есть связь
OneToMany
и установите для NULL объект на сторонеMany
. Затем я сохраняю изменения в наборе, сохраняя объект на сторонеOne
. Должен ли я затем обновлять объекты на сторонеMany
и устанавливать связь с NULL в каждом экземпляре? Кажется чистой глупостью для однонаправленных привязок!
Заранее благодарен!
В пункте 4 я хотел спросить о следующем: я хочу удалить ссылку между сущностью «Родитель» и «Дети». В моем коде я получаю «Родительский» и очищаю детей до «EMPTY_SET». Затем я сохраняю «Родитель». Для меня этого должно быть достаточно, но как правильно очистить другую сторону ссылки? Должен ли я сначала перебирать детей, установите «parent» в «null» и «em.persist (child)»? Я бы предположил, что 'em' достаточно умны, чтобы понять, что я сделал, и очистить эти ссылки автоматически! Можете ли вы уточнить? – user3249057
Это зависит от того, что вы хотите. Если дети не должны существовать без родителя, либо свяжите их с новым родителем, либо установите флаг удаления сирот, и JPA удалит их, когда они будут разыменованы. Если вы хотите, чтобы они существовали независимо, вам нужно сказать им, каково их нынешнее состояние и, конечно же, объединить его. Некоторые провайдеры (EclipseLink) могут по-прежнему иметь устаревший код EJB2.0, который может обрабатывать отмену другой стороны для вас. Это поддержание отношений вызвало больше проблем, чем это было необходимо, и было намеренно исключено из спецификации JPA. – Chris
Если вызов слияния для каждого обрезанного ребенка является проблемой, существует ряд подходов, которые вы можете использовать. Простым было бы хранить обрезанные объекты в коллекции, которая не сохраняется, которую вы затем используете в методе события preupdate для родителя. Этот метод будет проходить через фиксацию списка и слияние по мере необходимости. – Chris