JPA: Когда выбрать многозначную ассоциацию против сопоставления элементов коллекции

StackOverflow https://stackoverflow.com/questions/3418683

Вопрос

Я хотел бы лучше понять различия между

(1) традиционный Многозначные отношения / ассоциация

   @Entity -> @OneToMany -> @Entity

а также

(2) JPA2 Коллекция встроенных (и основных) типов

  @Entity -> @ElementCollection -> @Embeddable

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

Интуитивно, я бы обычно использовал @ElementCollection для Состав сценариев. Отказ Но даже это чувствует себя очень похожим на CascadeType=DELETE.

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

Спасибо, Дж.

Это было полезно?

Решение

Интуитивно, я обычно использую @ElementCollection для сценариев композиции. Но даже что чувствует себя очень похожим на Cascadetype = удалить

Они похожи, с небольшими различиями. То Remuctioncollection. Страница от Ява настойчивость Wikibook суммирует это довольно хорошо:

Выпутанные коллекции

Ан. ElementCollection сопоставление может быть использовано для определения коллекции Embeddable объекты. Это не типичное использование Embeddable объекты как объекты не встроенный В таблице исходного объекта, но хранится в отдельном столе сбора. Это похоже на OneToMany, Кроме целевого объекта является Embeddable вместо АН Entity. Отказ Это позволяет легко определять коллекции простых объектов, не требуя простых объектов, чтобы определить Id или ManyToOneобратное отображение. ElementCollection также можно переопределить отображения или таблицу для их коллекции, поэтому вы можете иметь несколько объектов, ссылаться на то же самое Embeddable Класс, но у каждого магазина их зависимые объекты в отдельной таблице.

Ограничения использования ElementCollection вместо а OneToMany Состоит в том, что целевые объекты не могут быть запрошены, сохраняются, слились независимо от своего родительского объекта. Они строго в частной собственности (зависимые) предметы, такие же, как Embedded сопоставление. Их нет cascadeВариант на АН ElementCollection, Целевые объекты всегда сохраняются, объединены, удалены со своим родителем. ElementCollection до сих пор может использовать тип приема и по умолчанию LAZY так же, как другие сопоставления коллекции.

Смотрите также

Другие советы

Спецификация JPA ясна

Встраиваемые вставки не могут быть запрошены, сохраняются, объединились независимо от своего родительского объекта. Они строго в частной собственности (зависимые) объекты

Вы должны использовать осторожно потому что его продолжительность жизни ограничен срок службы собственного экземпляра субъекта. Так что, если вы сохраняете / объединитесь / удалите свой собственный экземпляр объекта, все его встраивает экземпляры будут сохраняться / слиться / удален

Предположим, вы делаете что-то вроде

/**
  * Let's suppose owning contains SIX embeddables instances
  */
Owning owning = manager.find(Owining.class, owningId);

Так что ваше изменение только что Вашемую сущному объекту на просмотру слоя и отправить изменения. Вы извлекаете свой субъект, используя

/**
  * Usually your web framework Takes care of binding your submitted data
  */
Owning owning = new Owning();
owning.setProperty(request.getParameter("property"));

Тогда вы можете объединить ваши представленные данные и думаешь Ваши экземпляры встроек хранятся в базе данных все же. Ну, давайте посмотрим

Как показано выше Вы (или вашу веб-каркас) только что получил владение свойствами, правильно ??? Так что ваше владение. GtelementList () пусто. Отказ Потому что владение. GtelementList () пуст, JPA удалит все его экземпляры встроек. Отказ Держите это в виду.

Как правило Встроенный класс не имеет отношений с другими, чем его владение. И при использовании набора встроенных материалов JPA всегда Выберите перед сохранением / обновлением, потому что ему необходимо сравнить один за другим Используя его метод равных. Отказ Так что вам нужно последовательные равные реализации При использовании набора коллекции.

Здесь Вы можете увидеть его коллегу в гибернации.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top