2010-08-05 11 views
34

vorrei capire meglio le differenze traJPA: Quando scegliere Multivalued Associazione vs Element Collection Mapping

(1) tradizionale multivalore Relationship/Associazione

@Entity -> @OneToMany -> @Entity 

e

(2) JPA2 Raccolta di tipi incorporabili (e di base)

@Entity -> @ElementCollection -> @Embeddable 

Vedo le differenze sintattiche, ma mi chiedo se ci sono anche implicazioni sulle prestazioni. Sotto il cofano, l'implementazione del database sembra molto simile.

Intuitivamente, io di solito utilizzare i @ElementCollection per scenari di composizione. Ma anche questo sembra molto simile a CascadeType=DELETE.

Mi manca l'essenza qui? Uno è più efficiente dell'altro per determinati scopi?

Grazie, J.

risposta

16

Intuitivamente, io di solito utilizzare il @ElementCollection per gli scenari di composizione. Ma anche questo sembra molto simile a CascadeType = DELETE

Sono simili, con qualche leggera differenza. La pagina di ElementCollection dal Java Persistence wikibook riassume abbastanza bene:

Emdedded Collections

Un ElementCollection mappatura può essere usato per definire un insieme di Embeddable oggetti. Questo non è un uso tipico di Embeddable oggetti come gli oggetti non sono incorporati nella tabella dell'oggetto sorgente, ma memorizzate in una tabella di raccolta differenziata . Questo è simile a un OneToMany, ad eccezione dell'oggetto di destinazione è un Embeddable invece di un Entity. Ciò consente alle collezioni di oggetti semplici di essere facilmente definite , senza richiedere gli oggetti semplici per definire una mappatura inversa Id o ManyToOne . ElementCollection può ignorare anche le mappature, o tavolo per la loro raccolta, in modo da poter avere più entità riferimento alla stessa classe Embeddable, ma hanno ogni negozio loro oggetti dipendenti in una tabella separata.

Le limitazioni di utilizzare un ElementCollection invece di un OneToMany è che la porta oggetti non possono essere interrogati, persistito, fuse indipendentemente dalla loro oggetto principale. Sono oggetti di tipo strettamente privato (dipendenti), la stessa di una mappatura Embedded. La loro è l'opzione su un ElementCollection, gli oggetti di destinazione sono sempre permanenti, uniti, rimossi con i relativi genitori. ElementCollection è ancora possibile utilizzare un tipo di recupero e il valore predefinito su LAZY lo uguale ad altri mapping di raccolta.

Vedi anche

8

specifica JPA è chiaro

Embeddables non può essere interrogato, persisteva, fuse indipendentemente dalla loro oggetto padre. Essi sono rigorosamente di proprietà privata (dipendente) oggetti

Si dovrebbe usare con cautela perché la sua durata di vita è delimitata dalla durata della istanza di entità proprietaria. Quindi, se persistono/merge/rimuovere l'istanza di entità possedere, tutti i suoi embeddables casi saranno persistito/fusione/rimossi

Supponiamo fai qualcosa come

/** 
    * Let's suppose owning contains SIX embeddables instances 
    */ 
Owning owning = manager.find(Owining.class, owningId); 

Così il vostro modificare solo la tua entità di proprietà a livello di vista e invia le tue modifiche. Di recuperare i all'entità proprietaria utilizzando

/** 
    * Usually your web framework Takes care of binding your submitted data 
    */ 
Owning owning = new Owning(); 
owning.setProperty(request.getParameter("property")); 

Quindi è possibile unire i dati presentati e si pensa le istanze embeddables memorizzati nel database di ancora. Bene, vediamo

Come mostrato sopra tu (o il tuo framework web) hai appena recuperato Proprietà di proprietà, giusto ??? Quindi il tuo owning.getElementList() è vuoto. Poiché owning.getElementList() è vuoto, JPA rimuoverà tutte le sue istanze di incorporamento. Tienilo a mente.

Solitamente una classe incorporabile non ha relazione con un'altra entità. E quando si utilizza un Set di oggetti incorporabili, JPA sempre selezionare prima di salvare/aggiornare perché deve confrontare uno per uno utilizzando il suo metodo di uguale. Pertanto, quando si utilizza una raccolta Set, è necessaria un'implementazione coerente uguale a .

Here è possibile vedere la sua controparte in Hibernate.

+0

@Jan qui http://stackoverflow.com/questions/2440806/uml-class-relationships/2441251#2441251 Dai un'occhiata a ** composition ** e vedrai dove @ElementCollection si adatta meglio –

Problemi correlati