J'ai essayé de mettre à niveau l'hibernation de 4 à 5 dans mon projet avec la version print 4.2
. 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 auto incrémenté avec annotation
@GeneratedValue(strategy=GenerationType.AUTO)
encore l'erreur reste.
Vous pouvez aussi mettre:
@GeneratedValue(strategy = GenerationType.IDENTITY)
Et laissez la base de données gérer l’incrémentation de la clé primaire:
AUTO_INCREMENT PRIMARY KEY
Travailler avec Spring Boot
Placez la chaîne ci-dessous dans .application.properties
spring.jpa.properties.hibernate.id.new_generator_mappings=false
Sur Hibernate 4.X, cet attribut a par défaut la valeur true
.
C'est la raison derrière cette erreur:
Il cherchera 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. Comme 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. Donc, vous n'avez probablement pas une telle table de séquence dans votre base de données et maintenant vous obtenez cette erreur.
Je recevais 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 réalisée à l’aide de la configuration Java printanière. Maintenant, je dois ajouter la propriété hibernate.id.new_generator_mappings
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 un charme.
FYI
Si vous utilisez des fichiers hbm pour définir le mappage O/R.
Remarquerez que:
Dans Hibernate 5, le nom du paramètre pour le nom de la 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 réglage de mappage provoquera une erreur "hibernate_sequence n'existe pas".
Pour corriger cette erreur, le nom du paramètre doit changer en:
<generator class="sequence">
<param name="sequence_name">xxxxxx_seq</param>
</generator>
Ce problème m'a perdu 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.
dans hibernate 5.x, vous devez ajouter la valeur false à hibernate.id.new_generator_mappings dans hibernate.cfg.xml
<session-factory>
......
<property name="show_sql">1</property>
<property name="hibernate.id.new_generator_mappings">false</property>
......
</session-factory>
J'utilise Spring Boot
et j'ai corrigé le problème en ajoutant la ligne suivante dans le fichier application.properties
:
spring.jpa.properties.hibernate.id.new_generator_mappings = false
Vous pouvez aussi mettre:
@GeneratedValue(strategy = GenerationType.IDENTITY)
Et laissez la base de données gérer l’incrémentation de la clé primaire:
AUTO_INCREMENT PRIMARY KEY
La réponse ci-dessus m'a aidé.
Juste au cas où quelqu'un s'arracherait les cheveux avec ce problème comme je le faisais aujourd'hui, je ne pourrais pas résoudre cette erreur tant que je n'aurais pas changé
spring.jpa.hibernate.dll-auto=create
à
spring.jpa.properties.hibernate.hbm2ddl.auto=create
Dans mon cas, le remplacement de toutes les annotations GenerationType.AUTO
par GenerationType.SEQUENCE
a résolu le problème.
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 découvrirai les avantages et les inconvénients de l’utilisation de la requête, mais ceux qui ont besoin d’aide peuvent l’utiliser.
Ceci peut être causé par HHH-10876 qui a été corrigé, assurez-vous de l'actualiser: