2009-03-13 4 views
27

Ich benutze derzeit Eclipselink, aber ich weiß jetzt Tage die meisten JPA-Implementierungen wurden ziemlich standardisiert. Gibt es eine native Möglichkeit, eine JPA-Entität einer Ansicht zuzuordnen? Ich möchte nicht einfügen/update, aber die Frage ist wirklich, wie mit der @ Id Annotation umzugehen. Jede Entität in der JPA-Welt muss ein ID-Feld haben, aber viele der von mir erstellten Ansichten stimmen nicht damit überein. Gibt es native Unterstützung dafür in der JPA oder muss ich Hacks verwenden, um es zur Arbeit zu bringen? Ich habe viel gesucht und wenig Informationen darüber gefunden.Unterstützt JPA die Zuordnung zu SQL-Ansichten?

+0

Ansichten Funktionen wie normale Tabellen, aber wenn Sie den Blick nicht gut mit JPA ORM-Mapping paßt Sie stattdessen eine gespeicherte Prozedur verwendet möglicherweise einen benutzerdefinierten Cursor aus der Sicht (en) gebildet zurückzukehren. Sie können gespeicherte Prozeduren in EclipseLink mithilfe der @ NamedStoredProcedureQuery-Annotation zuordnen. Weitere Informationen zu Google finden Sie unter "EclipseLink-Erweiterungen". –

Antwort

7

Während der Verwendung der @Id Annotation mit Feldern von direkt unterstützten Typen ist nicht die einzige Möglichkeit eines Unternehmens Identität angeben (siehe @IdClass mit mehreren @Id Anmerkungen oder @EmbeddedId mit @Embedded) erfordert die JPA-Spezifikation einen Primärschlüssel für jede Einheit.

Das besagt, dass Sie keine Entitäten benötigen, um JPA mit Datenbankansichten zu verwenden. Da sich die Zuordnung zu einer Ansicht nicht von der Zuordnung zu einer Tabelle aus einer SQL-Perspektive unterscheidet, können Sie weiterhin systemeigene Abfragen verwenden (createNativeQuery on EntityManager), um stattdessen skalare Werte abzurufen.

0

Ich habe mir das selbst angeschaut, und ich habe einen Hack gefunden, bei dem ich nicht hundertprozentig sicher bin, aber das sieht vielversprechend aus.

In meinem Fall habe ich eine FK-Spalte in der Ansicht, die effektiv als eine PK funktionieren kann - jede gegebene Instanz dieses fremden Objekts kann nur einmal in der Ansicht auftreten. Ich habe zwei Objekte von diesem einen Feld definiert: eines wird als ID bezeichnet und repräsentiert den Rohwert des Feldes, und das andere wird als schreibgeschützt bezeichnet und repräsentiert das Objekt, auf das Bezug genommen wird.


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

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

Wie ich schon sagte, ich bin auf diese nicht 100% sicher (und ich werde nur diese Antwort löschen, wenn sie nicht zur Arbeit stellt sich heraus), aber es hat mein Code an einem bestimmten Punkt Absturz.

Weiß nicht, ob es für Ihre spezifische Situation gilt, obwohl. Und es gibt eine ausgezeichnete Chance, dass Sie nach 11 Monaten nicht mehr kümmern. :-) Was zum Teufel, das "Nekromanten" -Abzeichen verdient sich nicht nur ...

0

Aus meiner Sicht habe ich eine "eindeutige" ID, also habe ich sie als die Entity ID abgebildet. Es funktioniert sehr gut:

@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; 
Verwandte Themen