2010-10-26 9 views
24

Cosa c'è di meglio per le chiavi principali composte JPA/Hibernate, le implementazioni @IdClass o @EmbeddedId e perché?JPA/Hibernate: Cosa c'è di meglio per le chiavi composite composite, @IdClass o @EmbeddedId e perché?

Questa è una domanda volutamente ingenua. Ho deciso di utilizzare @EmbeddedId (per qualsiasi motivo) e mi sento come se avessi fatto la scelta sbagliata. Il dereferenziamento dell'ID incorporato che contiene le proprietà della colonna è ridondante e piuttosto soggetto a errori durante la codifica.

Ci sono altri motivi per e/o contro l'altro? È una raccomandazione del JPA (spec.)?

+0

possibile duplicato di [Quale ano dovrei usare: @IdClass o @EmbeddedId] (http://stackoverflow.com/questions/212350/which-anotation-should-i-use-idclass-or-embeddedid) –

+0

It sembra essere. Ma non elenca più ragioni. – Kawu

+0

Il manuale di Hibernate sconsiglia @IdClass per ragioni sconosciute: http://docs.jboss.org/hibernate/annotations/3.5/reference/en/html/entity.html#d0e1112 Forse qualcuno che può chiarire questo? – Kawu

risposta

7

Come Pascal ha scritto qui è una parte della risposta:

Which annotation should I use: @IdClass or @EmbeddedId

Alla fine, credo utilizzando @IdClass è molto più facile, in pratica, perché si deve aggiungere il nome embeddedId proprietà per le proprietà dereferenziare PK, mentre questi non sono scritti per tutte le proprietà non PK.

Devi sempre ricordare esattamente quali proprietà fanno parte di un PK e quelle che non lo sono. Ciò complica la scrittura di query JPQL in modo ingiustificato.

Inoltre, per quanto ne so il 2.0 spec APP consente di mettere @Id sulla @XToX/@JoinColumn proprietà/s ed introduce il @MapsId annotazione, in modo che la mappatura identificare relazioni (anche noto come identificatori derivati ​​in JPA) sono più naturali da implementare.

2

I. Ricordare di utilizzare idclass per farlo. Ma raccomanderei di fare tutto il possibile per evitare le chiavi multi-campo. Creano solo lavoro extra.

+0

Ha dato +1 perché ci ha fatto rivalutare usando il PK composito e siamo giunti alla conclusione che staremmo molto meglio con loro. – Erikson

+0

A volte, specialmente quando si lavora con uno schema legacy, l'unico modo per mappare correttamente un'entità è utilizzando PK compositi. Naturalmente quando si progetta un nuovo schema è meglio evitarli (se possibile). – snorbi

8

Prima, se possibile, evitare gli ID compositi a tutti i costi. Ma se proprio ne hai bisogno, ti consiglio @EmbeddedId.

@IdClass è sostanzialmente un residuo di EJB 2,1 volte per semplificare la migrazione da BMP. In alcuni rari casi d'angolo potrebbe anche essere migliore di @EmbeddedId. Tuttavia, in genere @EmbeddedId è migliore e più OO poiché incapsula il concetto os la chiave molto meglio nell'oggetto.

È possibile utilizzare @AttributeOverride(s) se necessario nel campo chiave.

Non vedo perché pensi che il dereferenziamento dell'ID incorporato sia ridondante e soggetto a errori.

+0

Sì, hai ragione con la tua ultima frase. Se si usasse la sintassi JPA 2.0, non ci sarebbero campi ridondanti nella classe entity, quindi si dovrebbe sempre dereferenziare le colonne join, che sembra essere preferibile per tutti e 4 i vatiants della chiave composita JPA 1.0 @IdClass, JPA 1.0 @EmbeddedId, JPA 2.0 @IdClass e JPA 2.0 @EmbeddedId. – Kawu

+1

Puoi spiegare perché gli ID compositi sono negativi? – displayname

Problemi correlati