Hibernate/JPA et PostgreSQL - Clé Primaire?
Je suis en train de mettre en œuvre certaines entités de base de l'utilisation d'Hibernate/JPA. Initialement, le code a été déployé sur MySQL et fonctionnait bien. Maintenant, je suis de portage à l'utilisation de PostgreSQL. Dans MySQL, ma classe d'entité définit sa clé primaire comme auto-incrémentation de la valeur de type long avec la syntaxe suivante:
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
Cependant, j'ai constaté que j'ai des erreurs avec PostgreSQL lorsque j'essaie de l'insérer de nombreux enregistrements à la fois. De quoi ai-je besoin d'annoter ma clé primaire pour obtenir la même auto-incrémentation de comportement dans PostgreSQL comme je l'ai avec MySQL? Merci pour toute aide que vous pouvez fournir!
Je vais essayer une fois de plus, et puis après, l'exception que je suis. La façon dont j'ai mes classes d'entité de l'installation est d'avoir une classe de base abstraite avec l'id défini et l' @MappedSuperclass annotation sur elle, et puis tirer le reste de mes entités à partir de là. Tu crois que ça va créer un problème dans PostgreSQL?
Êtes-vous d'insertion avec JPA
persist()
et merge()
ou SQL directe? GenerationType.AUTO
signifie "le fournisseur de persistance devez choisir une stratégie appropriée" (JPA 2.0 Version Finale, Section 11.1.17). Il n'implique pas nécessairement une séquence de relation. Seulement GenerationType.SEQUENCE
les forces de l'APC de fournisseur à utiliser une séquence. La question est trop vague pour être sûr, mais peut-être Hibernate décidé de générer id
avec une table sous Postgres et peut-être vous exécutez SQL attend à une inexistant par défaut de la séquence de valeur pour la colonne id
. S'il vous plaît montrer la Postgres relations (psql est \d
).Je suis de la génération de test de 100 lignes à l'aide d'une boucle for. Je crée chaque entité et de définir chaque valeur à l'exception de l'identifiant (clé primaire), puis effectuer une JPA persist() pour le stocker. Je vais augmenter le niveau de journalisation et d'obtenir plus d'informations à publier. Merci!
OriginalL'auteur Shadowman | 2010-05-12
Vous devez vous connecter pour publier un commentaire.
GenerationType.L'IDENTITÉ
Ce qu'une légende! Cela a fonctionné pour moi sur mon @MappedSuperclass 🙂
Beaucoup mieux que les acceptée. Alors que l'on probablement fonctionne, il ne faut pas de générateur personnalisé définitions. Merci!
OriginalL'auteur
J'ai résolu le problème. Auparavant, dans mon MySQL mise en œuvre -- j'ai fait de l'utilisation d'une classe de base abstraite avec la signature suivante:
...et puis j'ai étendu ce dans chacun de mes restants entités. Depuis, j'ai poussé cet attribut vers le bas dans les entités elles-mêmes, et configuré le @GenerationType comme SÉQUENCE. Par exemple:
Ce faisant, le bon séquences sont générés et utilisés dans Hibernate/JPA et PostgreSQL. Avant, même si j'ai déclaré la GenerationType comme une Séquence, aucun n'a été créé. Merci à tous pour votre aide et conseils dans cette affaire!
OriginalL'auteur