В настоящее время я использую Eclipselink, но теперь я знаю, что большинство реализаций JPA довольно стандартизированы. Есть ли собственный способ сопоставить объект JPA с представлением? Я не хочу вставлять/обновлять, но вопрос в том, как обрабатывать аннотацию @Id. Каждый объект в мире JPA должен иметь поле идентификатора, но многие из созданных мной представлений не соответствуют этому. Есть ли поддержка для этого в JPA или мне нужно использовать хаки, чтобы заставить ее работать? Я много искал и нашел очень мало информации об этом.
Поддерживает ли JPA сопоставление с представлениями sql?
Ответ 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;