Вид карты 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.