Разница между @OneToMany и @ElementCollection?

130

В чем разница между использованием аннотации @OneToManyи @ElementCollectionаннотации, поскольку оба работают с отношением «один ко многим»?

n_g
источник
3
Короче говоря, @ElementCollection используется, когда существование дочернего объекта бессмысленно без родительского объекта, IOW, всякий раз, когда родительский объект удаляется, ваши дети также будут ...
dellasavia
1
Я считаю, что это НЕ дочерняя сущность, это встроенный тип значения / объект значения, существование которого имеет меньшее значение без основной сущности, в которой он содержится.
CuriousMind
согласен с @CuriousMind, в JPA «Сущность» имеет свой собственный жизненный цикл.
mhrsalehi

Ответы:

125

Я считаю, что @ElementCollectionэто в основном для отображения не-сущностей (встраиваемых или базовых), а @OneToManyиспользуется для сопоставления сущностей. Итак, какой из них использовать, зависит от того, чего вы хотите достичь.

MrKiane
источник
1
Спасибо Peder за ответ! У вас есть верная точка зрения, поскольку @OneToMany может связывать только сущности.
n_g
157

ElementCollection- это стандартная аннотация JPA, которая теперь предпочтительнее проприетарной аннотации Hibernate CollectionOfElements.

Это означает, что коллекция - это не набор сущностей, а набор простых типов (строки и т. Д.) Или набор встраиваемых элементов (класс, помеченный @Embeddable).

Это также означает, что элементы полностью принадлежат содержащим сущностям: они модифицируются при изменении сущности, удаляются при удалении сущности и т. Д. У них не может быть собственного жизненного цикла.

JB Nizet
источник
... и вы не можете запросить их самостоятельно.
Застрял
67

@ElementCollectionпозволяет упростить код, если вы хотите реализовать отношение «один ко многим» с помощью простого или встроенного типа. Например, в JPA 1.0, когда вы хотели иметь отношение «один ко многим» со списком Strings, вам нужно было создать простую сущность POJO ( StringWrapper), содержащую только первичный ключ и рассматриваемый String:

@OneToMany
private Collection<StringWrapper> strings;

//...

public class StringWrapper {
  @Id
  private int id;

  private String string;
}

С JPA 2.0 вы можете просто написать:

@ElementCollection
private Collection<String> strings;

Проще, правда? Обратите внимание, что вы по-прежнему можете управлять именами таблиц и столбцов с помощью @CollectionTableаннотаций.

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

Томаш Нуркевич
источник
Отличное объяснение рассуждений. :)
Phuah Yee Keat 04
4

Базовый или встроенный : @ElementCollection
Entities : @OneToMany или @ManyToMany

@ElementCollection:

  • отношение управляется (только) той сущностью, в которой это отношение определено
  • таблица содержит ссылку id на объект-владелец плюс базовые или встроенные атрибуты

@OneToMany / @ManyToMany:

  • также может управляться другим объектом
  • таблица или столбцы объединения обычно содержат только ссылки на идентификаторы
fidudidu
источник
1

@ElementCollectionотмечает коллекцию. Это не обязательно означает, что эта коллекция ссылается на соединение 1-n.

chzbrgla
источник
1
Так в чем именно цель @ElementCollection?
n_g
0

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

Farshad-НШ
источник