Ich versuche, eine kleine Funktionsprobe von Hibernate einzurichten, die ich hier gefunden habe. Wenn ich jedoch den Code ausführen, erhalte ich den folgenden Fehler
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
Ich habe aber bereits eine Tabelle nach dem Namen person in der Datenbank und hier ist meine modifizierte 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>
Es wäre großartig, wenn jemand darauf aufmerksam machen könnte, was ich falsch mache, da dies mein erster Versuch in Hibernate ist. Danke!
BEARBEITEN: 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: Inhalt der Protokolldatei (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: Ich habe gerade etwas Ungewöhnliches bemerkt. Ich erstelle die Relation in der Datenbank und führe dann diesen Code aus. Nur um zu sehen, dass die Tabelle gelöscht wird, verschwindet sie, wenn ich diesen Code ausführte. eine Idee, warum das passiert?
Ich habe den Fehler durch Ändern der folgenden Eigenschaft in hibernate.cfg.xml behoben
<property name="hibernate.hbm2ddl.auto">validate</property>
Früher wurde die Tabelle jedes Mal gelöscht, wenn ich das Programm ausführte, und jetzt funktioniert es nicht, da der Ruhezustand nur das Schema validiert und Änderungen daran nicht beeinflusst.
Laut der Ausnahme möchte Hibernate in die Tabelle "Person" schreiben, aber Sie definieren in Ihrer hbm.xml, dass es eine Tabelle "Person" gibt. Sind Sie sicher, dass die richtige Tabelle in Ihrem Datenbankschema vorhanden ist?
Hinweis:
Es ist nicht erforderlich, den Tabellennamen in Person.hbm.xml (........) anzugeben, wenn Sie eine Tabelle mit demselben Klassennamen erstellen. Gilt auch für Felder.
Stellen Sie beim Erstellen einer "person" -Tabelle in Ihrer jeweiligen Datenbank sicher, dass die in Person.hbm.xml angegebenen FILEDS-Namen mit den COLUMNS-Namen der Tabelle übereinstimmen müssen.
Das Problem in meinem Fall war, dass der Datenbankname falsch war.
Ich habe das Problem gelöst, indem ich den richtigen Datenbanknamen im Feld wie folgt verwiesen habe
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/myDatabase</property>
Ich habe den Fehler behoben, indem ich die folgende Eigenschaft in hibernate.cfg.xml geändert habe
<property name="hibernate.hbm2ddl.auto">validate</property>
Früher wurde die Tabelle bei jeder Ausführung des Programms gelöscht und jetzt nicht mehr, da der Ruhezustand nur das Schema validiert und Änderungen daran nicht beeinflusst.
Soweit ich weiß, können Sie auch von validate zu update wechseln, z.
<property name="hibernate.hbm2ddl.auto">update</property>
Was meinen wir mit org.hibernate.exception.SQLGrammarException
?
Implementierung von JDBCException, die angibt, dass die an den Datenbankserver gesendete SQL ungültig war (Syntaxfehler, ungültige Objektreferenzen usw.).
und in meinen Worten gibt es eine Art Grammar
Fehler in Ihrer hibernate.cfg.xml
Konfigurationsdatei,
dies geschieht, wenn Sie einen falschen Namen für die Schemadefinition eingeben, wie im folgenden Beispiel:
<property name="hibernate.connection.hbm2ddl.auto">create</property>
was soll sein wie:
<property name="hibernate.hbm2ddl.auto">create</property>
Sie können versuchen, den richtigen Datenbanknamen in die Verbindungs-URL in die Konfigurationsdatei aufzunehmen. Da ich beim Ausführen der POJO-Klassendatei den gleichen Fehler hatte, wurde dieser dadurch behoben.
Ich habe diese Fehler durch Ändern des Datenbank-Zeichensatzes festgelegt. Alter Datenbank-Zeichensatz ist cp1252
und ich konvertiere zu utf-8
Es scheint, dass Sie sich mit der falschen Datenbank verbinden. Sicher, dass "jdbc:postgresql://localhost/testDB"
" Sie mit der tatsächlichen Datenquelle verbindet?
Im Allgemeinen haben sie die Form "jdbc://hostname/databasename".
Schauen Sie in die Postgresql-Protokolldatei.