2017-10-19 36 views
1

J'ai une vue de base de données sans clé primaire. Il a un ensemble de colonnes qui identifient de manière unique une ligne dans la vue, mais trois de ces colonnes peuvent être null. Je l'ai essayé de créer une entité avec une clé primaire composite à base de ces quatre colonnes, mais lors de la récupération des données de la vue que je reçois cette erreur:Affichage de la carte JPA sans clé primaire à une entité

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

Y at-il quelque chose que je peux faire, par exemple, l'ajout d'un généré automatiquement colonne lors de la définition de la vue?

+0

Oui, vous pouvez ajouter un numéro automatique, il va travailler pour la lecture, mais mise à jour bien .... vous aurez besoin de tester. – Namphibian

Répondre

3

La spécification JPA indique qu'une classe d'entité doit avoir un ID unique et immuable.

Logiquement, si elle n'a pas de clé primaire, elle ne peut pas être appelée entité. Au lieu de cela, vous pouvez créer une représentation POJO de votre vue, puis exécuter une requête SQL native, puis mapper l'ensemble de résultats à votre POJO. Voici un exemple à l'aide @SqlResultSetMapping/@ConstructorResult http://www.thoughts-on-java.org/result-set-mapping-constructor-result-mappings/

0

Toutes les entités ont PKs qui correspondent à la définition de l'APP. Il y a plusieurs façons de le contourner, tous hacky.

1) modifier la vue de combiner les champs (en remplaçant les valeurs nulles ayant des valeurs sensibles) dans un champ, et le plan qui en PK

2) utiliser la fonctionnalité de convertisseur d'attributs pour remplacer les valeurs nulles à des valeurs raisonnables, vous peut mapper le composite PK.

3) utilisent RowID comme PK (ce qui est correct que si vous ne dépendez pas sur le PK pour quoi que ce soit à long terme, rowids ne sont pas guranteed rester cohérent entre les courses.

Je suis sûr qu'il sont d'autres solutions de contournement similaires, mais j'ai utilisé 1 et 2, et exploré en utilisant 3.