JPA clé primaire auto générer
ma clé primaire de l'entité de ressembler à ci-dessous
@GeneratedValue(strategy= GenerationType.TABLE)
private Long id;
quand je le lance, j'obtiens l'erreur
ne pouvait pas obtenir ou mettre à jour à côté de la valeur;nested exception est org.mise en veille prolongée.exception à la règle.SQLGrammerException:impossible d'obtenir ou mettre à jour à côté de la valeur
mais quand je viens de changer de
@GeneratedValue
private Long id;
pas d'erreur jeter . Je veux générer unique clé primaire par table sur oracle db .
OriginalL'auteur cometta | 2009-11-30
Vous devez vous connecter pour publier un commentaire.
La
@GeneratedValue(strategy=GenerationType.TABLE)
raconte la JPA fournisseur à utiliser un tableau pour obtenir des Identifiants de lors de l'insertion d'entités nouvellement créées dans la base de données.Lors de l'utilisation d'Hibernate en tant que fournisseur, il en résultera une table
hibernate_sequences
qui a deux colonnes: le nom de l'entité, et le max d'identité déjà attribué à cette entité. Ici, il semble Hibernate n'a pas réussi à obtenir le numéro suivant pour votre entité, mais il est difficile de dire exactement pourquoi, parce que vous n'avez pas fourni suffisamment d'informations pour que.Oui, pourriez-vous s'il vous plaît fournir le stacktrace? Aussi, veuillez activer la journalisation avec
hibernate.show_sql
propriété définie àtrue
et de définir le bon niveau de journallog4j.logger.org.hibernate.SQL=DEBUG
. Rejoindre le journal de votre question si possible.Peut-être juste vérifier que vous n'avez configurez le bon
hibernate.dialect
pour Oracle. En fait, rejoignez votre hibernate trop si c'est possible.PS: La manière "traditionnelle" pour générer PK avec Oracle est d'utiliser des séquences (vous pouvez laisser Hibernate suppose que la meilleure stratégie pour votre type de base de données à l'aide de
GenerationType.AUTO
ou de force à l'aide deSEQUENCE
), mais je vais supposer que vous voulez que la résultante de la structure de données de la base de données agnostique. Si pas, je vous suggère d'aller pour les séquences à la place.EDIT: Réponse à un commentaire de l'OP sur
GenerationType.AUTO
. En effet, la valeur par défaut est un unique et global de la séquence appeléehibernate_sequence
et ce pourrait être un problème. Mais, avec la configuration ci-dessous, vous pouvez utiliserGenerationType.AUTO
et contrôlent toujours le nom de la séquence pour le cas où la base de données utilise des séquences:En d'autres termes, vous pouvez utiliser un autre nom de la séquence pour chaque table sans perdre la portabilité.
Si nous pouvons fournir un SequenceGenerator il aide à la spécification de la stratégie que l'AUTO?
En fait, si vous utilisez
AUTO
et si la base de données utilise des séquences,@SequenceGenerator
aidera à contrôler le nom de la séquence. Mais, il va juste être "ignoré" si la base de données n'est pas (par exemple, avec HSQLDB). Ainsi, contrairement àSEQUENCE
, cela reste portable.Grand. Merci il précise.
Par défaut, la séquence du nombre maximum est 1E+27, ou 1,000,000,000,000,000,000,000,000,000. Cela devrait être suffisant 🙂
OriginalL'auteur Pascal Thivent
Il y a 4 stratégies pour la génération automatique de JPA:
Pour Oracle de l'auto-génération de la clé primaire d'annotation, de Séquence et de la Table sont à votre choix. La logique de base est de définir un générateur d'abord, l'utilisation @SequenceGenerator ou @TableGenerator respectivement, puis utilisez le générateur comme attribut dans @GeneratedValue.
C'est un exemple d'utilisation de la Séquence de la stratégie:
Voici un exemple d'utilisation de la stratégie de table:
Si aucun générateur spécifié dans @GeneratedValue annotation, le choix de laisser à l'implémentation JPA.
Si vous travaillez sur base de données avec des tables existantes, assurez-vous de la séquence ou de la table définie dans la base de données avant d'exécuter votre application. La table générateur sera également besoin de vous pour insérer une ligne à la table avant le @GeneratedValue annotation peut fonctionner correctement.
Voici un tutoriel sur comment configurer la clé primaire de la génération automatique de JPA pour la base de données Oracle.
OriginalL'auteur Sheng.W