Różnica między @OneToMany i @ElementCollection?

129

Jaka jest różnica między używaniem adnotacji @OneToManya @ElementCollectionadnotacją, skoro oba działają w relacji jeden do wielu?

n_g
źródło
3
Krótko mówiąc, @ElementCollection jest używane, gdy istnienie podmiotu podrzędnego jest bez znaczenia bez podmiotu nadrzędnego, IOW, za każdym razem, gdy podmiot nadrzędny zostanie usunięty, twoje dzieci również będą ...
dellasavia
1
Uważam, że NIE jest to jednostka potomna, ale typ wartości / obiekt wartości, który jest osadzony i którego istnienie ma mniejsze znaczenie bez jednostki głównej, w której się znajduje.
CuriousMind
zgadzam się z @CuriousMind, w JPA „Entity” ma swój własny cykl życia.
mhrsalehi

Odpowiedzi:

124

Uważam, że @ElementCollectionsłuży głównie do mapowania jednostek niebędących podmiotami (osadzanymi lub podstawowymi), podczas gdy @OneToManyjest używany do mapowania jednostek. Więc którego użyć, zależy od tego, co chcesz osiągnąć.

MrKiane
źródło
1
Dzięki Peder za odpowiedź! Masz ważny punkt, ponieważ @OneToMany może odnosić się tylko do jednostek.
n_g
157

ElementCollectionto standardowa adnotacja JPA, która jest obecnie preferowana w stosunku do zastrzeżonej adnotacji Hibernate CollectionOfElements.

Oznacza to, że kolekcja nie jest zbiorem jednostek, ale zbiorem prostych typów (ciągów znaków itp.) Lub zbiorem elementów do osadzania (klasa z adnotacją @Embeddable).

Oznacza to również, że elementy są całkowicie własnością jednostek zawierających je: są modyfikowane, gdy jednostka jest modyfikowana, usuwane, gdy jednostka jest usuwana, itp. Nie mogą mieć własnego cyklu życia.

JB Nizet
źródło
... i nie możesz ich zapytać samodzielnie.
Utknął
66

@ElementCollectionpozwala uprościć kod, gdy chcesz zaimplementować relację jeden do wielu z typem prostym lub osadzonym. Na przykład w JPA 1.0, gdy chciałeś mieć relację jeden do wielu z listą Strings, musiałeś utworzyć prostą jednostkę POJO ( StringWrapper) zawierającą tylko klucz podstawowy i Stringpytanie:

@OneToMany
private Collection<StringWrapper> strings;

//...

public class StringWrapper {
  @Id
  private int id;

  private String string;
}

Dzięki JPA 2.0 możesz po prostu napisać:

@ElementCollection
private Collection<String> strings;

Prostsze, prawda? Pamiętaj, że nadal możesz sterować nazwami tabel i kolumn za pomocą @CollectionTableadnotacji.

Zobacz też:

Tomasz Nurkiewicz
źródło
Świetne wyjaśnienie uzasadnienia. :)
Phuah Yee Keat
4

Podstawowe lub osadzone : @ElementCollection
Entities : @OneToMany lub @ManyToMany

@ElementCollection:

  • relacją zarządza (tylko) podmiot, w którym relacja jest zdefiniowana
  • tabela zawiera identyfikator będący właścicielem jednostki oraz atrybuty podstawowe lub osadzone

@OneToMany / @ManyToMany:

  • może być również zarządzany przez inny podmiot
  • join tabela lub kolumny zazwyczaj zawierają tylko odniesienia do identyfikatorów
fidudidu
źródło
1

@ElementCollectionoznacza kolekcję. Nie musi to oznaczać, że ta kolekcja odwołuje się do złączenia 1-n.

chzbrgla
źródło
1
Jaki dokładnie jest cel @ElementCollection?
n_g
0

ElementCollection może przesłonić mapowania lub tabelę dla ich kolekcji, dzięki czemu wiele jednostek może odwoływać się do tej samej klasy osadzanej, ale każda z nich przechowuje swoje zależne obiekty w oddzielnej tabeli.

farshad-nsh
źródło