2009-03-13 13 views
27

Obecnie używam Eclipselink, ale wiem, że obecnie większość implementacji JPA jest dość wystandaryzowana. Czy istnieje natywny sposób mapowania jednostki JPA do widoku? Nie chcę wstawiać/aktualizować, ale pytanie brzmi jak obsłużyć adnotację @Id. Każda jednostka w świecie WZP musi mieć pole ID, ale wiele utworzonych widoków nie jest zgodnych z tym. Czy istnieje natywne wsparcie dla tego w JPA, czy też muszę użyć hacków, aby to działało? Dużo przeszukałem i znalazłem bardzo mało informacji na ten temat.Czy JPA obsługuje mapowanie do widoków sql?

+0

Widoki funkcje jak normalnych tabel Jednak jeśli poglądy nie pasuje dobrze z mapowania JPA ORM można zamiast skorzystać z procedury przechowywanej, aby powrócić kursorem niestandardową utworzoną z widoku (ów). Można zmapować procedury składowane w EclipseLink za pomocą adnotacji @NamedStoredProcedureQuery. Aby uzyskać więcej informacji na temat tego Google dla "rozszerzeń EclipseLink". –

Odpowiedz

7

Podczas korzystania z @Id adnotacji z dziedzin bezpośrednio obsługiwanych typów nie jest jedynym sposobem, aby określić tożsamość jednostki (patrz @IdClass z wieloma @Id adnotacji lub @EmbeddedId z @Embedded), specyfikacja JPA wymaga klucza podstawowego dla każdego podmiotu.

Powiedziałeś, że nie potrzebujesz jednostek do używania JPA z widokami bazy danych. Ponieważ mapowanie do widoku nie różni się od mapowania do tabeli z perspektywy SQL, nadal można używać natywnych zapytań (createNativeQuery na EntityManager) w celu pobrania wartości skalarnych.

0

Sam się nad tym zastanawiałem. Znalazłem włamanie, że nie jestem w 100% pewnym dziełem, ale wygląda obiecująco.

W moim przypadku mam kolumnę FK w widoku, która może skutecznie funkcjonować jako PK - dowolna instancja tego obiektu obcego może wystąpić tylko raz w widoku. Zdefiniowałem dwa obiekty z tego jednego pola: jeden jest oznaczony ID i reprezentuje surową wartość pola, a drugi jest oznaczony jako tylko do odczytu i reprezentuje obiekt, do którego się odwołuje.


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

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

Tak jak mówiłem, nie jestem w 100% pewien na ten jeden (a ja po prostu usunąć tę odpowiedź, jeśli okaże się nie do pracy), ale dostałem kod przeszłość określonego punktu zderzenia.

Nie wiem, czy dotyczy to Twojej konkretnej sytuacji. Jest wielka szansa, że ​​po 11 miesiącach przestanie ci to zależeć. :-) Co do cholery, ta odznaka "Nekromanty" nie tylko zarabia sama ...

0

Moim zdaniem mam "unikalny" identyfikator, więc zamapowałem go jako identyfikator podmiotu. To działa bardzo dobrze:

@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; 
Powiązane problemy