6

I'm trying to set up a small working sample of Hibernate that I found here However when I run the code I get the follwing error

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

But I already have a table by the name person in the database and here's my modified 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>

It would be great if anyone could point out what Im doing wrong, as this is my first attempt at Hibernate. Thanks!

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: Content of the log file (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: I just noticed something weird, I create the relation in the DB and then run this piece of code, only to see that the table gets deleted as in it just dissapears when I run this code; any idea why this happens?

seeker
  • 6,841
  • 24
  • 64
  • 100

9 Answers9

9

I solved the error by modifying the following property in hibernate.cfg.xml

  <property name="hibernate.hbm2ddl.auto">validate</property>

Earlier, the table was getting deleted each time I ran the program and now it doesnt, as hibernate only validates the schema and does not affect changes to it.

seeker
  • 6,841
  • 24
  • 64
  • 100
4

According to the exception, Hibernate wants to write to the table "person", yet in your hbm.xml you define that there is a table "Person", are you sure the correct table exists in your database-schema?

quaylar
  • 2,617
  • 1
  • 17
  • 31
  • +1: Likely the problem, and postgres can be a bit odd with case-sensitivity on table names. – Don Roby Feb 10 '12 at 12:02
  • @quaylar , I posted the correction I made in Person.hbm.xml, but the error persists – seeker Feb 10 '12 at 12:03
  • @KodeSeeker Can you open up the database and check the name of the P(p)erson-Table? – quaylar Feb 10 '12 at 12:28
  • @quaylar, it is 'person' and here's the script-CREATE TABLE person ( "ID" integer NOT NULL, "NAME" character varying, "SURNAME" character varying, "ADDRESS" character varying ) WITH ( OIDS=FALSE ); ALTER TABLE person OWNER TO postgres; – seeker Feb 10 '12 at 12:30
3

Note:

  1. Its not necessary to specify table name in Person.hbm.xml (........) when you are creating table with same as class name. Also applicable to fields.

  2. While creating "person" table in your respective database,make sure that whatever FILEDS names you specified in Person.hbm.xml must match with table COLUMNS names ELSE you wil get above error.

Pablo Claus
  • 5,886
  • 3
  • 29
  • 38
Manjunath
  • 31
  • 1
1

The problem in my case was that the database name was incorrect.
I solved the problem by referring the correct database name in the field as below

<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/myDatabase</property>
techGaurdian
  • 732
  • 1
  • 14
  • 35
Tarun
  • 939
  • 15
  • 25
0

I solved the error by modifying the following property in hibernate.cfg.xml

<property name="hibernate.hbm2ddl.auto">validate</property>

Earlier, the table was getting deleted each time I ran the program and now it doesnt, as hibernate only validates the schema and does not affect changes to it.

As far as I know you can also change from validate to update e.g.:

<property name="hibernate.hbm2ddl.auto">update</property>
witrin
  • 3,701
  • 1
  • 24
  • 49
Secondo
  • 129
  • 1
  • 8
0

You may try to put the right database name in connection url in the configuration file. As I had the same error while run the POJO class file and it has been solved by this.

kenorb
  • 155,785
  • 88
  • 678
  • 743
0

I sovled this errors by modifying the Database charset.Old Database charset is cp1252 and i conver to utf-8

John Trump
  • 376
  • 2
  • 15
0

What do we mean by org.hibernate.exception.SQLGrammarException?

Implementation of JDBCException indicating that the SQL sent to the database server was invalid (syntax error, invalid object references, etc).

and in my words there is a kind of Grammar mistake inside of your hibernate.cfg.xml configuration file,

it happens when you write wrong schema defination property name inside, like below example:

<property name="hibernate.connection.hbm2ddl.auto">create</property>

which supposed to be like:

<property name="hibernate.hbm2ddl.auto">create</property>
ArifMustafa
  • 4,617
  • 5
  • 40
  • 48
0

It seems you are connecting to the wrong database. R u sure "jdbc:postgresql://localhost/testDB" will connect you to the actual datasource ?

Generally they are of the form "jdbc://hostname/databasename". Look into Postgresql log file.

Shashank Kadne
  • 7,993
  • 6
  • 41
  • 54
  • It didnt. And cannot . It threw an error saying --"Cannot open connection .... Caused by:: java.sql.SQLException: No suitable driver found for jdbc://localhost/testDB – seeker Feb 10 '12 at 12:25
  • Look into your conf file. i think you are connecting to the postgres database. – Shashank Kadne Feb 10 '12 at 12:30
  • Im sorry I dont get you , and which file are you asking me to look at sir? And if its postgresql.conf, what should I look for in it ? – seeker Feb 10 '12 at 12:35
  • If your connecting to wrong DB, it will log it into the Postgresql.log file. Can you check with "jdbc:postgresql:testDB" – Shashank Kadne Feb 10 '12 at 13:01
  • If you didnt specify any port in your JDBC connect string, it will be defaulted to 5432, is your DB really running on 5432 ? e.g jdbc:postgresql://localhost:5432/DB_NAME, if its default, then try jdbc:postgresql:DB_NAME – Sajan Chandran Feb 10 '12 at 13:06
  • @ShashankKadne, that does not work either, and the same error persists – seeker Feb 13 '12 at 04:17
  • @ShashankKadne,@Sajan Chandran, I've posted the content of the log file in the question.. Do have a look, Thanks! – seeker Feb 13 '12 at 04:23