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

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

Ответ 1

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

Ответ 2

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

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

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

Ответ 3

@ElementCollection позволяет упростить код, если вы хотите реализовать отношения "один ко многим" с простым или встроенным типом. Например, в JPA 1.0, когда вы хотели иметь отношение "один ко многим" к списку String s, вам нужно было создать простой объект 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.

См. также:

Ответ 4

Основной или встроенный: @ElementCollection
Объекты: @OneToMany или @ManyToMany

@ElementCollection:

  • отношение управляется (только) объектом, в котором определено отношение
  • Таблица содержит идентификатор ссылки на владелец объекта, а также основные или встроенные атрибуты.

@OneToMany/@ManyToMany:

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

Ответ 5

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

Ответ 6

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