Differenza tra @OneToMany e @ElementCollection?


129

Qual è la differenza tra l'uso di a @OneToManye l' @ElementCollectionannotazione poiché entrambi lavorano sulla relazione uno-a-molti?


3
In breve, @ElementCollection viene utilizzato quando l'esistenza dell'entità figlio non ha senso senza l'entità madre, IOW, ogni volta che un'entità madre viene rimossa, anche i tuoi figli saranno ...
dellasavia

1
Credo che NON sia l'Entità figlio, è Tipo di valore / Oggetto valore che è incorporato e la cui esistenza ha un significato minore senza l'Entità principale in cui è contenuta.
CuriousMind

d'accordo con @CuriousMind, in JPA un 'Entity' ha il suo ciclo di vita.
mhrsalehi,

Risposte:


124

Credo che @ElementCollectionsia principalmente per mappare le non entità (incorporabili o di base) mentre @OneToManyè usato per mappare le entità. Quindi quale usare dipende da cosa vuoi ottenere.


1
Grazie Peder per la risposta! Hai un punto valido lì poiché @OneToMany può solo mettere in relazione entità.
n_g

157

ElementCollectionè un'annotazione JPA standard, che ora è preferita rispetto all'annotazione proprietaria Hibernate CollectionOfElements.

Significa che la raccolta non è una raccolta di entità, ma una raccolta di tipi semplici (stringhe, ecc.) O una raccolta di elementi incorporabili (classe annotata con @Embeddable).

Significa anche che gli elementi sono completamente di proprietà delle entità contenenti: vengono modificati quando l'entità viene modificata, eliminati quando l'entità viene eliminata, ecc. Non possono avere il proprio ciclo di vita.


... e non puoi interrogarli da soli.
Bloccato il

66

@ElementCollectionconsente di semplificare il codice quando si desidera implementare una relazione uno-a-molti con tipo semplice o incorporato. Ad esempio in JPA 1.0 quando volevi avere una relazione uno-a-molti con un elenco di Strings, dovevi creare una semplice entità POJO ( StringWrapper) contenente solo la chiave primaria e la Stringdomanda in questione:

@OneToMany
private Collection<StringWrapper> strings;

//...

public class StringWrapper {
  @Id
  private int id;

  private String string;
}

Con JPA 2.0 puoi semplicemente scrivere:

@ElementCollection
private Collection<String> strings;

Più semplice, no? Nota che puoi ancora controllare i nomi di tabella e colonna usando l' @CollectionTableannotazione.

Guarda anche:


Grande spiegazione per il ragionamento. :)
Phuah Yee Keat

4

Di base o incorporato :
Entità @ElementCollection: @OneToMany o @ManyToMany

@ElementCollection:

  • la relazione è gestita (solo) dall'entità in cui è definita la relazione
  • La tabella contiene il riferimento ID all'entità proprietaria più gli attributi di base o incorporati

@OneToMany / @ManyToMany:

  • può anche essere gestito dall'altra entità
  • la tabella o le colonne di join in genere contengono solo riferimenti ID

1

@ElementCollectionsegna una raccolta. Ciò non significa necessariamente che questa raccolta faccia riferimento a un join 1-n.


1
Allora, qual è esattamente lo scopo di @ElementCollection?
n_g

0

ElementCollection può sovrascrivere i mapping o la tabella per la loro raccolta, quindi è possibile avere più entità che fanno riferimento alla stessa classe Embeddable, ma ognuno ha i propri oggetti dipendenti in una tabella separata.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.