Подтвердить что ты не робот

Поддерживает ли JPA сопоставление с представлениями sql?

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

4b9b3361

Ответ 1

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

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

Ответ 2

Я изучал это сам, и я нашел хак, что я не на 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 месяцев вы больше не заботитесь.:-) Какого черта, что значок "Некромант" не просто зарабатывает себя....

Ответ 3

По моему мнению, у меня есть "уникальный" id, поэтому я сопоставил его как идентификатор Entity. Он работает очень хорошо:

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