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

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

(1) традиционной многозначной связью / ассоциацией

   @Entity -> @OneToMany -> @Entity

и

(2) коллекцией встраиваемых (и базовых) типов JPA2

  @Entity -> @ElementCollection -> @Embeddable

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

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

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

Спасибо, J.

36
задан Pascal Thivent 6 August 2010 в 16:53
поделиться

2 ответа

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

. Они похожи, с некоторыми небольшими отличиями. Страница ElementCollection из викибука Java Persistence довольно хорошо резюмирует это:

Добавленные коллекции

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

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

См. Также

18
ответ дан 27 November 2019 в 06:16
поделиться

Спецификация 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"));

. Затем вы можете объединить представленные данные и , по вашему мнению, ваши встраиваемые экземпляры еще хранятся в базе данных . Что ж, давайте посмотрим

Как показано выше , вы (или ваша веб-платформа) только что получили Owning properties , верно ??? Итак, ваш owning.getElementList () пуст . Поскольку owning.getElementList () пуст, JPA удалит все свои встраиваемые экземпляры . Имейте это в виду.

Обычно встраиваемый класс не имеет отношений, кроме его Собственной сущности. А при использовании набора встраиваемых файлов JPA всегда выбирает перед сохранением / обновлением, потому что ему нужно сравнивать одно за другим , используя свой метод equals . Таким образом, при использовании коллекции Set вам нужна согласованная реализация .

Здесь вы можете увидеть его аналог в Hibernate.

8
ответ дан 27 November 2019 в 06:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: