2017-10-19 5 views
1

Ich habe eine Datenbankansicht ohne Primärschlüssel. Es hat eine Reihe von Spalten, die eine Zeile in der Ansicht eindeutig identifizieren, aber drei dieser Spalten können null sein. Ich habe versucht, auf diesen vier Säulen basiert eine Einheit mit einem zusammengesetzten Primärschlüssel zu schaffen, aber wenn Daten aus der Sicht Abrufen bekomme ich diesen Fehler:JPA-Kartenansicht ohne Primärschlüssel für eine Entität

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

Gibt es etwas, was ich tun kann, zum Beispiel das Hinzufügen ein automatisch generiertes Spalte bei der Definition der Ansicht?

+0

Ja können Sie eine Auto-Nummer hinzufügen, die es zum Lesen funktioniert, aber gut zu aktualisieren .... Sie müssen testen. – Namphibian

Antwort

3

JPA-Spezifikation besagt, dass eine Entity-Klasse eine eindeutige, unveränderliche ID haben muss.

Logischerweise, wenn es keinen Primärschlüssel hat, kann es nicht Entity aufgerufen werden. Was Sie stattdessen tun können, ist eine POJO-Repräsentation Ihrer VIEW, dann führen Sie eine SQL-Native-Abfrage aus und ordnen Sie dann die Ergebnismenge Ihrem POJO zu. Hier ist eine Probe @SqlResultSetMapping/@ConstructorResult http://www.thoughts-on-java.org/result-set-mapping-constructor-result-mappings/

0

Nicht alle Entitäten PKs haben verwenden, die die Definition der JPA passen. Es gibt ein paar Möglichkeiten, die alle hacky sind.

1) modifizieren, um die Ansicht um die Felder zu kombinieren (nulls mit sinnvollen Werten) in ein Feld Substituieren und Karte, die als PK

2) die Attributwandler Funktionalität verwenden nulls mit sinnvollen Werten zu ersetzen, man dann kann die zusammengesetzte PK abbilden.

3) verwenden RowID als PK (dies ok ist nur, wenn Sie auf der PK für etwas langfristig hängen nicht, wie ROWIDs nicht zwischen den Läufen zu bleiben konsistent guranteed.

Ich bin da sicher sind andere ähnliche Workarounds, aber ich habe 1 und 2 verwendet, und erforschte mit 3.

Verwandte Themen