В чем разница между использованием аннотации @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, но каждый из которых может хранить свои зависимые объекты в отдельной таблице.