JPA поддерживает сопоставление с представлениями sql? - PullRequest
32 голосов
/ 13 марта 2009

В настоящее время я использую Eclipselink, но теперь я знаю, что большинство реализаций JPA были довольно стандартизированы. Есть ли собственный способ сопоставить сущность JPA представлению? Я не собираюсь вставлять / обновлять, но вопрос в том, как обработать аннотацию @Id. У каждого объекта в мире JPA должно быть поле идентификатора, но многие из созданных мною представлений не соответствуют этому. Есть ли встроенная поддержка для этого в JPA или мне нужно использовать хаки, чтобы заставить его работать? Я много искал и нашел очень мало информации об этом.

Ответы [ 3 ]

8 голосов
/ 14 марта 2009

Использование аннотации @Id с полями напрямую поддерживаемых типов - не единственный способ указать идентичность объекта (см. @IdClass с несколькими аннотациями @Id или @EmbeddedId с @Embedded), спецификация JPA требуется первичный ключ для каждого объекта.

Тем не менее, вам не нужны сущности для использования JPA с представлениями базы данных. Поскольку сопоставление с представлением ничем не отличается от сопоставления с таблицей с точки зрения SQL, вы все равно можете использовать собственные запросы (createNativeQuery на EntityManager) для получения скалярных значений.

0 голосов
/ 07 декабря 2015

На мой взгляд, у меня есть «уникальный» идентификатор, поэтому я сопоставил его с идентификатором сущности. Работает очень хорошо:

@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;
0 голосов
/ 05 февраля 2010

Я сам изучал это и обнаружил, что я не уверен на 100%, но это выглядит многообещающе.

В моем случае у меня есть столбец FK в представлении, который может эффективно функционировать как PK - любой данный экземпляр этого постороннего объекта может появиться только один раз в представлении. Я определил два объекта из этого одного поля: один обозначен как идентификатор и представляет необработанное значение поля, а другой - только для чтения и представляет объект, на который ссылаются.


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

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

Как я уже сказал, я не уверен на 100% в этом (и я просто удалю этот ответ, если он не сработает), но мой код прошел определенную точку сбоя.

Не знаю, если это относится к вашей конкретной ситуации. И есть отличный шанс, что через 11 месяцев вам уже все равно. :-) Что за черт, этот значок "Некромант" не просто зарабатывает сам ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...