J'ai essayé de mettre à niveau la mise en veille prolongée de 4 à 5 dans mon projet avec la 4.2
version printemps . Après cette mise à niveau, j'ai trouvé l'erreur suivante dans ma trace de pile lorsque j'ai appelé une méthode de mise à jour.
10:53:32,185 ERROR TableStructure:149 - could not read a hi value
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'test.hibernate_sequence' doesn't exist
J'ai changé l'identifiant incrémenté automatiquement avec une annotation
@GeneratedValue(strategy=GenerationType.AUTO)
l'erreur persiste.
Réponses:
Vous pouvez également mettre:
@GeneratedValue(strategy = GenerationType.IDENTITY)
Et laissez la DateBase gérer l'incrémentation de la clé primaire:
la source
INSERT
va provoquer un aller-retour supplémentaire vers la base de données pour récupérer l'ID. Donc, quand cet inconvénient est acceptable, très bien.Vous devez définir pour Hibernate5.x
<property name="hibernate.id.new_generator_mappings">false</property>
.. voir et lien .Pour les anciennes versions d'Hibernate 4.x:
<prop key="hibernate.id.new_generator_mappings">false</prop>
la source
Travailler avec Spring Boot
Solution
Mettez la chaîne ci-dessous dans .application.properties
spring.jpa.properties.hibernate.id.new_generator_mappings=false
Explication
Sur Hibernate 4.X, cet attribut est par défaut
true
.la source
C'est la raison de cette erreur:
Il recherchera comment la base de données que vous utilisez génère des identifiants. Pour MySql ou HSQSL, il existe des champs d'incrémentation qui s'incrémentent automatiquement. Dans Postgres ou Oracle, ils utilisent des tables de séquence. Puisque vous n'avez pas spécifié de nom de table de séquence, il recherchera une table de séquence nommée hibernate_sequence et l'utilisera par défaut. Vous n'avez donc probablement pas une telle table de séquence dans votre base de données et vous obtenez maintenant cette erreur.
la source
J'obtenais la même erreur "com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: La table 'mylocaldb.hibernate_sequence' n'existe pas".
En utilisant spring mvc 4.3.7 et hibernate version 5.2.9, l'application est faite en utilisant la configuration basée sur spring java. Maintenant, je dois ajouter la
hibernate.id.new_generator_mappings
propriété mentionnée par @Eva Mariam dans mon code comme ceci:@Autowired @Bean(name = "sessionFactory") public SessionFactory getSessionFactory(DataSource dataSource) { LocalSessionFactoryBuilder sessionBuilder = new LocalSessionFactoryBuilder(dataSource); sessionBuilder.addProperties(getHibernateProperties()); sessionBuilder.addAnnotatedClasses(User.class); return sessionBuilder.buildSessionFactory(); } private Properties getHibernateProperties() { Properties properties = new Properties(); properties.put("hibernate.show_sql", "true"); properties.put("hibernate.dialect", "org.hibernate.dialect.MySQLDialect"); properties.put("hibernate.id.new_generator_mappings","false"); return properties; }
Et cela a fonctionné comme du charme.
la source
FYI
Si vous utilisez des fichiers hbm pour définir le mappage O / R.
Remarquerez que:
Dans Hibernate 5, le nom de paramètre du nom de séquence a été modifié .
Le paramètre suivant a bien fonctionné dans Hibernate 4 :
<generator class="sequence"> <param name="sequence">xxxxxx_seq</param> </generator>
Mais dans Hibernate 5 , le même fichier de paramètres de mappage provoquera une erreur "hibernate_sequence does not exist".
Pour corriger cette erreur, le nom du paramètre doit être remplacé par:
<generator class="sequence"> <param name="sequence_name">xxxxxx_seq</param> </generator>
Ce problème m'a fait perdre 2, 3 heures.
Et d'une manière ou d'une autre, il semble qu'il n'y ait aucun document à ce sujet.
Je dois lire le code source de org.hibernate.id.enhanced.SequenceStyleGenerator pour le comprendre
la source
Lorsque vous utilisez
@GeneratedValue(strategy=GenerationType.AUTO)
ou
@GeneratedValue
ce qui est un raccourci de ce qui précède, Hibernate commence à décider de la meilleure stratégie de génération pour vous, dans ce cas, il a sélectionnéGenerationType.SEQUENCE
comme stratégie et c'est pourquoi il rechercheschemaName.hibernate_sequence
qui est une table, pour la génération d'identifiant basée sur une séquence.Lorsque vous utilisez
GenerationType.SEQUENCE
comme stratégie, vous devez fournir les éléments@TableGenerator
suivants.@Id @GeneratedValue(strategy = GenerationType.TABLE, generator = "user_table_generator") @TableGenerator(name = "user_table_generator", table = "user_keys", pkColumnName = "PK_NAME", valueColumnName = "PK_VALUE") @Column(name = "USER_ID") private long userId;
Lorsque vous définissez la stratégie, il
@GeneratedValue(strategy = GenerationType.IDENTITY)
.Le problème d'origine est résolu car Hibernate cesse de rechercher la table de séquence.
la source
Juste au cas où quelqu'un s'arracherait les cheveux avec ce problème comme je l'ai fait aujourd'hui, je ne pourrais pas résoudre cette erreur jusqu'à ce que je change
à
la source
dans hibernate 5.x, vous devez ajouter set hibernate.id.new_generator_mappings à false dans hibernate.cfg.xml
<session-factory> ...... <property name="show_sql">1</property> <property name="hibernate.id.new_generator_mappings">false</property> ...... </session-factory>
la source
Vous pouvez également mettre:
@GeneratedValue(strategy = GenerationType.IDENTITY)
Et laissez la DateBase gérer l'incrémentation de la clé primaire:
La réponse ci-dessus m'a aidé.
la source
Si vous utilisez la version Hibernate antérieure à Hibernate5
@GeneratedValue(strategy = GenerationType.IDENTITY)
fonctionne comme un charme. Mais après Hibernate5, le correctif suivant est nécessaire.@Id @GeneratedValue(strategy= GenerationType.AUTO,generator="native") @GenericGenerator(name = "native",strategy = "native") private Long id;
DDL
`id` BIGINT(20) NOT NULL AUTO_INCREMENT PRIMARY KEY
RAISON
Extrait de hibernate-issue
la source
Cela peut être causé par HHH-10876 qui a été corrigé, alors assurez-vous de mettre à jour vers:
la source
Hibernate 5.2.17.Final
comme implémentation. Je reçois encore cette question quandGenerationType
estAUTO
.J'ai ajouté la séquence Hibernate dans postgres. Exécutez cette requête dans l'éditeur PostGres:
CREATE SEQUENCE hibernate_sequence INCREMENT 1 MINVALUE 1 MAXVALUE 9223372036854775807 START 2 CACHE 1; ALTER TABLE hibernate_sequence OWNER TO postgres;
Je vais découvrir les avantages / inconvénients de l'utilisation de la requête, mais pour quelqu'un qui a besoin d'aide, vous pouvez l'utiliser.
la source
Dans mon cas, le remplacement de toutes les annotations
GenerationType.AUTO
par aGenerationType.SEQUENCE
résolu le problème.la source
Exécutez cette requête
create sequence hibernate_sequence start with 1 increment by 1
la source