JPA: Когда выбрать многозначную ассоциацию против сопоставления элементов коллекции
Вопрос
Я хотел бы лучше понять различия между
(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 всегда Выберите перед сохранением / обновлением, потому что ему необходимо сравнить один за другим Используя его метод равных. Отказ Так что вам нужно последовательные равные реализации При использовании набора коллекции.
Здесь Вы можете увидеть его коллегу в гибернации.