2010-08-05 2 views
34

Я хотел бы, чтобы лучше понять различие междуJPA: Когда выбрать Многозначные ассоциации против элементов коллекции карт

(1) традиционными многозначных Отношениями/Ассоциациями

@Entity -> @OneToMany -> @Entity 

и

(2) JPA2 Вставка вложенных (и основных) типов

@Entity -> @ElementCollection -> @Embeddable 

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

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

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

Спасибо, J.

ответ

16

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

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

Emdedded Collections

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

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

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

8

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

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

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

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

/** 
    * 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")); 

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

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

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

Here вы можете увидеть его коллега в Hibernate.

+0

@Jan Здесь http://stackoverflow.com/questions/2440806/uml-class-relationships/2441251#2441251 Взгляните на ** состав **, и вы увидите, где @ElementCollection подходит лучше –

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