2009-03-13 2 views
27

Attualmente sto usando Eclipselink, ma so che oggi la maggior parte delle implementazioni JPA sono state abbastanza standardizzate. Esiste un modo nativo per mappare un'entità JPA a una vista? Non sto cercando di inserire/aggiornare, ma la domanda è davvero come gestire l'annotazione @Id. Ogni entità nel mondo JPA deve avere un campo ID, ma molte delle viste che ho creato non sono conformi a questo. C'è un supporto nativo per questo nel JPA o devo usare gli hack per farlo funzionare? Ho cercato molto e ho trovato pochissime informazioni su come farlo.JPA supporta il mapping con le viste sql?

+0

Visite funzioni come le tabelle normali, tuttavia se vista non si adatta bene con la mappatura JPA ORM si può invece utilizzare una stored procedure per restituire un cursore personalizzato formata dalla view (s). È possibile mappare le stored procedure in EclipseLink utilizzando l'annotazione @NamedStoredProcedureQuery. Per maggiori informazioni su questo Google per "EclipseLink Extensions". –

risposta

7

Durante l'utilizzo del @Id annotazioni con campi di tipi supportati direttamente non è l'unico modo per specificare l'identità di un soggetto (vedi @IdClass con più @Id annotazioni o @EmbeddedId con @Embedded), la specifica JPA richiede una chiave primaria per ogni entità.

Detto questo, non è necessario che le entità utilizzino JPA con le viste del database. Poiché la mappatura di una vista non è diversa dalla mappatura a una tabella da una prospettiva SQL, è comunque possibile utilizzare query native (createNativeQuery su EntityManager) per recuperare invece valori scalari.

0

L'ho cercato anch'io, e ho scoperto che non sono certo al 100% ma sembra promettente.

Nel mio caso, ho una colonna FK nella vista che può effettivamente funzionare come un PK - ogni istanza data di tale oggetto estraneo può verificarsi solo una volta nella vista. Ho definito due oggetti fuori da quel campo: uno è designato come ID e rappresenta il valore grezzo del campo, mentre l'altro è designato in sola lettura e rappresenta l'oggetto a cui ci si riferisce.


@Id 
@Column(name = "foreignid", unique = true, nullable = false) 
public Long getForeignId() { 
... 

@OneToOne 
@JoinColumn(name = "foreignid", insertable=false, updatable=false) 
public ForeignObject getForeignObject() { 
... 

Come ho detto, io non sono sicuro al 100% su questo (e mi limiterò a eliminare questa risposta se si scopre di non lavorare), ma ha ottenuto il mio codice passato un particolare punto di crash.

Non so se si applica alla tua situazione specifica, però. E c'è un'eccellente possibilità che dopo 11 mesi non ti interessi più. :-) Che diavolo, quel badge "Negromante" non si guadagna da solo ...

0

Dal mio punto di vista ho un ID "unico", quindi l'ho mappato come ID entità. Funziona molto bene:

@Entity 
@Table(name="table") 
@NamedQuery(name="Table.findAll", query="SELECT n FROM Table n") 
public class Table implements Serializable { 
    private static final long serialVersionUID = 1L; 

    @Id 
    @Column(name="column_a") 
    private int columnA;