2014-01-29 2 views
2

Я использую JPA 2.0 некоторое время, но, к сожалению, у меня не было достаточно времени, чтобы изучить его должным образом. Похоже, мне не хватает основ работы с Entity Manager.Поддержание отношений в JPA 2.0

Перемещение по одному шагу за раз, я хотел бы сначала спросить вас о поддержании связей между отображаемыми объектами. Конечно, я знаю, как создавать сопоставления между сущностями, различными типами доступных ассоциаций (OneToOne и т. Д.) И как работают базы данных в целом. Я полностью сосредоточен на том, чтобы поддерживать его через Entity Manager, поэтому, пожалуйста, не отправляйте меня в какой-либо учебник общего знания :-).

Вопросов:

  1. Правильно ли я, что как программист я ответственен за сохранение (создание/обновление/удаление) отношения между экземплярами сущностей?
  2. Должен ли я всегда обновлять (устанавливать в null, удалять из коллекции и т. Д.) Экземпляры вручную?
  3. Plain SQL может устанавливать сущности в NULL при удалении, но, похоже, JPA не может делать такую ​​простую вещь. Это также кажется бременем для этого вручную. Есть ли способ добиться этого с помощью JPA?
  4. Если у меня есть связь OneToMany и установите для NULL объект на стороне Many. Затем я сохраняю изменения в наборе, сохраняя объект на стороне One. Должен ли я затем обновлять объекты на стороне Many и устанавливать связь с NULL в каждом экземпляре? Кажется чистой глупостью для однонаправленных привязок!

Заранее благодарен!

ответ

0

Главное, что вам нужно изучить, это различные варианты, которые вы имеете при сопоставлении с сущностью. Например, в следующем фрагменте кода опция cascade all даст команду jpa удалить дочерний список, когда родитель будет удален.

@OneToMany(fetch = FetchType.LAZY, cascade = { CascadeType.ALL }, mappedBy = "parent") 
private Set<Child> events = new HashSet<Child>(); 
0
  1. Да. Вы сохраняете дерево объектов и изменяете его, чтобы выглядеть так, как вы хотите .
  2. Да и нет. Если вы хотите, чтобы объект ссылался на нуль, тогда да. Например, если вы удаляете одно Entity, тогда вы должны очистить до любых ссылок на него, принадлежащих другим объектам, которые вы не удалили . Практический пример: хорошая практика, позволяющая сотруднику знать, что его/ее Менеджер отпущен. Если Employee собирается , то он должен либо указать ссылку своего менеджера, либо установить другому менеджеру, прежде чем текущий менеджер сможет быть удален.
    Если сотрудник будет удалён, то каскад удалит может каскадироваться всем подчиненным Управляющего, и в этом случае вы делаете не нужно очищать свои ссылки на менеджера - так как они тоже уходят.
  3. Я не совсем понимаю, что SQL устанавливает значение null. Удаление удаляет строку в базе данных, поэтому нет ничего, чтобы установить значение null. Очистка ссылки не должна быть такой сложной в объектной модели , так как JPA имеет ряд событий, например preremove preupdate и т. Д. В конце концов, проблема связана с вашими Java-объектами.Это просто объекты Java, поэтому, если вы хотите, чтобы что-то было сделано, ваше приложение должно будет сделать это для самой . JPA обрабатывает их создание и подталкивает их в базу данных, не меняет состояние для вас.
  4. Да и нет. Если вы настроили двунаправленную связь, вы должны поддерживать обе стороны, как указано выше. Если вы установите родительскую ссылку ребенка на нуль, вы должны сообщить родителям, что нет дольше имеет ребенка, не так ли? Ваш родитель будет продолжать ссылаться на его дочерний элемент до тех пор, пока этот родительский экземпляр не существует. Таким образом, , хотя база данных обновляется/контролируется стороной, что владеет отношениями, объектная модель будет не синхронизирована с базой данных , пока она не будет обновлена ​​или не перезагружена. JPA позволяет использовать несколько уровней кэширования, поэтому все зависит от настройки вашего провайдера , как долго будет существовать родительский экземпляр, ссылающийся на ребенка, которого нет больше в базе данных.
+0

В пункте 4 я хотел спросить о следующем: я хочу удалить ссылку между сущностью «Родитель» и «Дети». В моем коде я получаю «Родительский» и очищаю детей до «EMPTY_SET». Затем я сохраняю «Родитель». Для меня этого должно быть достаточно, но как правильно очистить другую сторону ссылки? Должен ли я сначала перебирать детей, установите «parent» в «null» и «em.persist (child)»? Я бы предположил, что 'em' достаточно умны, чтобы понять, что я сделал, и очистить эти ссылки автоматически! Можете ли вы уточнить? – user3249057

+0

Это зависит от того, что вы хотите. Если дети не должны существовать без родителя, либо свяжите их с новым родителем, либо установите флаг удаления сирот, и JPA удалит их, когда они будут разыменованы. Если вы хотите, чтобы они существовали независимо, вам нужно сказать им, каково их нынешнее состояние и, конечно же, объединить его. Некоторые провайдеры (EclipseLink) могут по-прежнему иметь устаревший код EJB2.0, который может обрабатывать отмену другой стороны для вас. Это поддержание отношений вызвало больше проблем, чем это было необходимо, и было намеренно исключено из спецификации JPA. – Chris

+0

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

Смежные вопросы