Різниця між @OneToMany та @ElementCollection?


130

Яка різниця між використанням анотації @OneToManyта @ElementCollectionанотацією, оскільки обидві працюють на взаємовідносинах один до багатьох?


3
У двох словах, @ElementCollection використовується, коли існування дочірньої сутності є безглуздим без материнської сутності, IOW, кожного разу, коли материнське сутність буде видалено, ваші діти також будуть ...
dellasavia

1
Я вважаю, що це НЕ дочірня Сутність, це вбудований Тип цінності / Ціннісний об'єкт і існування якого означає менше значення без основної Сутності, в якій він міститься.
CuriousMind

погоджуйтеся з @CuriousMind, у JPA у «Сутності» є власний життєвий цикл.
mhrsalehi

Відповіді:


125

Я вважаю, що @ElementCollectionце в основному для відображення сутностей (вбудованих або базових), в той час @OneToManyяк використовується для картографування сутностей. Отже, яку саме використовувати, залежить від того, чого ви хочете досягти.


1
Дякую Педеру за відповідь! Ви маєте дійсну точку там, оскільки @OneToMany може стосуватися лише сутностей.
n_g

157

ElementCollection- це стандартна анотація JPA, яка зараз є кращою перед власницькою анотацією зі сплячки CollectionOfElements.

Це означає, що колекція - це не сукупність сутностей, а колекція простих типів (Strings тощо) або колекція елементів, що вбудовуються (клас, анотований із @Embeddable).

Це також означає, що елементи повністю належать об'єктам, що містять: вони модифікуються, коли сутність модифікується, видаляються при видаленні об'єкта тощо. Вони не можуть мати власного життєвого циклу.


... і ви не можете їх запитувати самостійно.
Застряг

66

@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

4

Основна або Embedded : @ElementCollection
Сутність : @OneToMany або @ManyToMany

@ElementCollection:

  • відношення управляється (лише) суб'єктом господарювання, у якому відношення визначене
  • таблиця містить посилання id на об'єкт, що володіє, плюс основні або вбудовані атрибути

@OneToMany / @ManyToMany:

  • може також управляти іншим суб'єктом господарювання
  • Таблиця або стовпець приєднання зазвичай містять лише посилання на ідентифікатори

1

@ElementCollectionпозначає колекцію. Це не обов'язково означає, що ця колекція посилається на 1-n приєднання.


1
Отже, яка саме мета @ElementCollection?
n_g

0

ElementCollection може заміняти відображення або таблицю для їх колекції, тому ви можете мати декілька сутностей, що посилаються на один клас Embeddable, але мають зберігати залежні об'єкти в окремій таблиці.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.