Вид карты JPA без первичного ключа к объекту

У меня есть представление базы данных без первичного ключа. У него есть набор столбцов, которые однозначно определяют строку в представлении, но три из этих столбцов могут быть null, Я пытался создать объект с составным первичным ключом на основе этих четырех столбцов, но при получении данных из представления я получаю эту ошибку:

The primary key read from the row ... during the execution of the query was detected to be null.  Primary keys must not contain null.

Могу ли я что-то сделать, например, добавить автоматически сгенерированный столбец при определении представления?

2 ответа

Решение

В спецификации JPA говорится, что класс Entity должен иметь уникальный неизменный идентификатор.

Логически, если у него нет первичного ключа, его нельзя назвать сущностью. Вместо этого вы можете создать представление POJO для своего VIEW, затем выполнить собственный запрос SQL, а затем сопоставить результирующий набор с вашим POJO. Вот пример использования @SqlResultSetMapping/@ConstructorResult http://www.thoughts-on-java.org/result-set-mapping-constructor-result-mappings/

Не у всех организаций есть PK, которые соответствуют определению JPA. Есть несколько способов обойти это, все они хакерские.

1) измените представление, чтобы объединить поля (подставляя пустые значения с разумными значениями) в одно поле, и отобразите это как PK

2) использовать функцию преобразования атрибутов, чтобы заменить пустые значения разумными значениями, после чего вы можете отобразить составной PK.

3) использовать RowID в качестве PK (это нормально, только если вы не зависите от PK в течение какого-либо периода времени, поскольку RowID не гарантируют согласованность между запусками.

Я уверен, что есть другие подобные обходные пути, но я использовал 1 и 2 и исследовал с помощью 3.

Другие вопросы по тегам