J'essaie de configurer un petit échantillon de travail d'Hibernate que j'ai trouvé ici Cependant, lorsque j'exécute le code, l'erreur suivante est générée.
Exception in thread "main" org.hibernate.exception.SQLGrammarException: could not insert: [com.sample.Person]
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.Java:92)
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.Java:66)
at org.hibernate.id.insert.AbstractReturningDelegate.performInsert(AbstractReturningDelegate.Java:64)
at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.Java:2345)
at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.Java:2852)
at org.hibernate.action.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.Java:71)
at org.hibernate.engine.ActionQueue.execute(ActionQueue.Java:273)
at org.hibernate.event.def.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.Java:320)
at org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.Java:203)
at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.Java:129)
at .....
Caused by: org.postgresql.util.PSQLException: ERROR: relation "person" does not exist
Position: 13
at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.Java:2102)
at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.Java:1835)
at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.Java:257)
at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.Java:500)
at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.Java:388)
at org.postgresql.jdbc2.AbstractJdbc2Statement.executeUpdate(AbstractJdbc2Statement.Java:334)
at org.hibernate.id.IdentityGenerator$GetGeneratedKeysDelegate.executeAndExtract(IdentityGenerator.Java:94)
at org.hibernate.id.insert.AbstractReturningDelegate.performInsert(AbstractReturningDelegate.Java:57)
... 23 more
Mais j'ai déjà une table avec le nom personne dans la base de données et voici mon fichier modifié hibernate.cfg.xml
<!-- hibernate dialect -->
<property name="hibernate.dialect">org.hibernate.dialect.MySQLInnoDBDialect</property>
<property name="hibernate.connection.driver_class">org.postgresql.Driver</property>
<property name="hibernate.connection.url">jdbc:postgresql://localhost/testDB</property>
<property name="hibernate.connection.username">postgres</property>
<property name="hibernate.connection.password"></property>
<property name="hibernate.show.sql" ></property>
<property name="transaction.factory_class">org.hibernate.transaction.JDBCTransactionFactory</property>
<!-- Automatic schema creation (begin) === -->
<property name="hibernate.hbm2ddl.auto">create</property>
<!-- Simple memory-only cache -->
<property name="hibernate.cache.provider_class">org.hibernate.cache.HashtableCacheProvider</property>
<!-- Enable Hibernate's automatic session context management -->
<property name="current_session_context_class">thread</property>
<!-- ############################################ -->
<!-- # mapping files with external dependencies # -->
<!-- ############################################ -->
<mapping resource="com/sample/Person.hbm.xml" />
</session-factory>
Ce serait formidable si quelqu'un pouvait dire ce que je fais de mal, car c'est ma première tentative d'Hibernate. Merci!
EDIT: Person.hbm.xml
<class name="com.sample.Person" table="person">
<id name="id" column="ID">
<generator class="native" />
</id>
<property name="name">
<column name="NAME" length="16" not-null="true" />
</property>
<property name="surname">
<column name="SURNAME" length="16" not-null="true" />
</property>
<property name="address">
<column name="ADDRESS" length="16" not-null="true" />
</property>
</class>
EDIT-II: Contenu du fichier journal (Postgresql.log)
2012-02-13 09:23:25 IST LOG: database system was shut down at 2012-02-10 18:14:57 IST
2012-02-13 09:23:25 IST FATAL: the database system is starting up
2012-02-13 09:23:33 IST LOG: database system is ready to accept connections
2012-02-13 09:23:38 IST LOG: autovacuum launcher started
2012-02-13 09:46:01 IST ERROR: syntax error at or near "auto_increment" at character 41
2012-02-13 09:46:01 IST STATEMENT: create table person (ID bigint not null auto_increment, NAME varchar(16) not null, SURNAME varchar(16) not null, ADDRESS varchar(16) not null, primary key (ID)) type=InnoDB
2012-02-13 09:46:01 IST ERROR: relation "person" does not exist at character 13
2012-02-13 09:46:01 IST STATEMENT: insert into person (NAME, SURNAME, ADDRESS) values ($1, $2, $3) RETURNING *
2012-02-13 09:46:01 IST LOG: could not receive data from client: No connection could be made because the target machine actively refused it.
2012-02-13 09:46:01 IST LOG: unexpected EOF on client connection
2012-02-13 09:48:15 IST ERROR: syntax error at or near "auto_increment" at character 41
2012-02-13 09:48:15 IST STATEMENT: create table person (ID bigint not null auto_increment, NAME varchar(16) not null, SURNAME varchar(16) not null, ADDRESS varchar(16) not null, primary key (ID)) type=InnoDB
2012-02-13 09:48:15 IST ERROR: relation "person" does not exist at character 13
2012-02-13 09:48:15 IST STATEMENT: insert into person (NAME, SURNAME, ADDRESS) values ($1, $2, $3) RETURNING *
2012-02-13 09:48:15 IST LOG: could not receive data from client: No connection could be made because the target machine actively refused it.
2012-02-13 09:48:15 IST LOG: unexpected EOF on client connection
UPDATE: Je viens de remarquer quelque chose de bizarre, je crée la relation dans la base de données, puis je lance ce morceau de code, seulement pour voir que la table est supprimée car elle disparaît simplement lorsque je lance ce code; aucune idée pourquoi cela se produit?
J'ai résolu l'erreur en modifiant la propriété suivante dans hibernate.cfg.xml
<property name="hibernate.hbm2ddl.auto">validate</property>
Auparavant, la table était supprimée à chaque fois que j'exécutais le programme et maintenant, elle ne le fait pas, car hibernate ne valide que le schéma et n'affecte pas ses modifications.
Selon l'exception, Hibernate veut écrire dans la table "personne", mais dans votre fichier hbm.xml, vous définissez qu'il existe une table "Personne", êtes-vous sûr que la table correcte existe dans votre schéma de base de données?
Remarque:
Il n'est pas nécessaire de spécifier le nom de la table dans Person.hbm.xml (........) lorsque vous créez une table avec le même nom que le nom de la classe. Également applicable aux champs.
Lors de la création de la table "personne" dans votre base de données respective, assurez-vous que les noms FILEDS que vous avez spécifiés dans Person.hbm.xml doivent correspondre à la table COLUMNS noms SAUF que vous obtiendrez l'erreur susmentionnée.
Le problème dans mon cas était que le nom de la base de données était incorrect.
J'ai résolu le problème en indiquant le nom de base de données correct dans le champ, comme indiqué ci-dessous.
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/myDatabase</property>
J'ai résolu l'erreur en modifiant la propriété suivante dans hibernate.cfg.xml
<property name="hibernate.hbm2ddl.auto">validate</property>
Un peu plus tôt, la table était supprimée à chaque fois que j'exécutais le programme et maintenant, ce n'est plus le cas, car hibernate ne valide que le schéma et n'affecte pas ses modifications.
Autant que je sache, vous pouvez également passer de validate à update, par exemple:
<property name="hibernate.hbm2ddl.auto">update</property>
Qu'entendons-nous par org.hibernate.exception.SQLGrammarException
?
Implémentation de JDBCException indiquant que le SQL envoyé au serveur de base de données était invalide (erreur de syntaxe, références d'objet non valides, etc.).
et dans mes mots, il y a une sorte d'erreur Grammar
à l'intérieur de votre fichier de configuration hibernate.cfg.xml
,
cela arrive quand vous écrivez un nom de propriété de définition de schéma incorrect à l'intérieur, comme dans l'exemple ci-dessous:
<property name="hibernate.connection.hbm2ddl.auto">create</property>
qui est supposé être comme:
<property name="hibernate.hbm2ddl.auto">create</property>
Vous pouvez essayer de mettre le bon nom de base de données dans l'URL de connexion dans le fichier de configuration. Comme j'ai eu la même erreur en exécutant le fichier de classe POJO et cela a été résolu par ceci.
J'ai résolu cette erreur en modifiant le jeu de caractères de la base de données. Le jeu de caractères de la base de données est cp1252
et je converge vers utf-8
.
Il semble que vous vous connectiez à la mauvaise base de données. R u sure "jdbc:postgresql://localhost/testDB"
va vous connecter à la source de données réelle?
Ils sont généralement de la forme "jdbc://hostname/databasename".
Regardez dans le fichier de log de Postgresql.