wake-up-neo.com

org.hibernate.exception.SQLGrammarException: [com.sample.Person] konnte nicht eingefügt werden

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? 

6
seeker

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.

8
seeker

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?

4
quaylar

Hinweis:

  1. Es ist nicht erforderlich, den Tabellennamen in Person.hbm.xml (........) anzugeben, wenn Sie eine Tabelle mit demselben Klassennamen erstellen. Gilt auch für Felder.

  2. 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.

2
Manjunath

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>
1
Tarun

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>
0
Secondo

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>
0
ArifMustafa

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.

0
amit yadav

Ich habe diese Fehler durch Ändern des Datenbank-Zeichensatzes festgelegt. Alter Datenbank-Zeichensatz ist cp1252 und ich konvertiere zu utf-8

0
John Trump

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.

0
Shashank Kadne