В чем разница между использованием аннотации @OneToMany
и @ElementCollection
аннотации, поскольку оба работают с отношением «один ко многим»?
В чем разница между использованием аннотации @OneToMany
и @ElementCollection
аннотации, поскольку оба работают с отношением «один ко многим»?
Ответы:
Я считаю, что @ElementCollection
это в основном для отображения не-сущностей (встраиваемых или базовых), а @OneToMany
используется для сопоставления сущностей. Итак, какой из них использовать, зависит от того, чего вы хотите достичь.
ElementCollection
- это стандартная аннотация JPA, которая теперь предпочтительнее проприетарной аннотации Hibernate CollectionOfElements
.
Это означает, что коллекция - это не набор сущностей, а набор простых типов (строки и т. Д.) Или набор встраиваемых элементов (класс, помеченный @Embeddable
).
Это также означает, что элементы полностью принадлежат содержащим сущностям: они модифицируются при изменении сущности, удаляются при удалении сущности и т. Д. У них не может быть собственного жизненного цикла.
@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
аннотаций.
Базовый или встроенный : @ElementCollection
Entities : @OneToMany или @ManyToMany
@ElementCollection:
@OneToMany / @ManyToMany:
ElementCollection может переопределять сопоставления или таблицу для их коллекции, поэтому вы можете иметь несколько сущностей, ссылающихся на один и тот же класс Embeddable, но каждая из них хранит свои зависимые объекты в отдельной таблице.