2012-02-10 8 views
6

Estoy tratando de configurar una pequeña muestra de trabajo de Hibernate que encontré here Sin embargo, cuando ejecuto el código recibo el error siguienteorg.hibernate.exception.SQLGrammarException: no se pudo insertar [com.sample.Person]

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 

Pero ya tengo una mesa junto a la persona que nombre en la base de datos y aquí es mi hibernate.cfg.xml modificado

<!-- 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> 

Sería genial si alguien pudiera señalar lo que estoy haciendo mal, ya que este es mi primer intento de Hibernate. Gracias!

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> 

EDITAR-II: Contenido del archivo de registro (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 

ACTUALIZACIÓN: Acabo de notar algo extraño, creo la relación en la base de datos y luego ejecuto este fragmento de código, solo para ver que la tabla se elimina, ya que simplemente desaparece cuando ejecuto este código; alguna idea de por qué sucede esto?

+0

¿Puedes publicar tu Person.hbm.xml? –

+0

@SajanChandran, agregado! – KodeSeeker

Respuesta

8

I solucionado el error mediante la modificación de la siguiente propiedad en hibernate.cfg.xml

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

Más temprano, la mesa estaba siendo eliminada cada vez que me encontré con el programa y ahora no funciona, como hibernación sólo valida el esquema y no afecta a los cambios que

4

Según la excepción, Hibernate quiere escribir en la tabla "persona", pero en su hbm.xml define que hay una tabla "Persona", ¿está seguro de que la tabla correcta existe en su esquema de base de datos?

+0

+1: es probable que el problema, y ​​postgres puede ser un poco extraño con mayúsculas y minúsculas en los nombres de tablas. –

+0

@quaylar, publiqué la corrección que hice en Person.hbm.xml, pero el error persiste – KodeSeeker

+0

@KodeSeeker ¿Puede abrir la base de datos y verificar el nombre de P (p) erson-Table? – quaylar

0

Parece que se está conectando a la base de datos incorrecta. R u Seguro "jdbc:postgresql://localhost/testDB" le conectará a la fuente de datos real?

Generalmente son de la forma Look "jdbc://hostname/databasename". en un archivo de registro de PostgreSQL.

+0

Er .. eso simplemente está mal. – KodeSeeker

+0

¿Eso ayudó? –

+0

No lo hizo. Y no puede . Lanzó un error que decía: "No se puede abrir la conexión .... Causado por :: java.sql.SQLException: No se encontró un controlador adecuado para jdbc: // localhost/testDB – KodeSeeker

2

. Nota:

  1. no su necesario especificar nombre de tabla en Person.hbm.xml (........) cuando se crea la tabla con el mismo que el nombre de la clase. También aplicable a los campos.

  2. Al crear la tabla "persona" en su base de datos respectiva, asegúrese de que los nombres de ARCHIVOS especificados en Person.hbm.xml deben coincidir con los nombres de COLUMNS de la tabla ELSE que obtendrá el error anterior.

1

El problema en mi caso era que el nombre de la base de datos era incorrecto.
me resolvió el problema consultando la base de datos el nombre correcto en el campo de la siguiente manera

<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/myDatabase</property> 
0

He resuelto el error mediante la modificación de la siguiente propiedad en hibernate.cfg.xml

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

Anteriormente, la tabla se borraba cada vez que ejecutaba el programa y no w no lo hace, ya que hibernación solo valida el esquema y no afecta los cambios en él.

Por lo que yo sé también puede cambiar de validación para actualizar ej .:

<property name="hibernate.hbm2ddl.auto">update</property> 
+0

tnx para editar mi publicación :) – Secondo

0

Usted puede tratar de poner el nombre de la base justo en el URL de conexión en el archivo de configuración. Como tuve el mismo error al ejecutar el archivo de la clase POJO y esto ha sido resuelto.

0

I sovled esta errores mediante la modificación de la base de datos charset.Old conjunto de caracteres base de datos es cp1252 y yo ConVer a utf-8

0

¿Qué entendemos por org.hibernate.exception.SQLGrammarException?

Implementación de JDBCException que indica que el SQL enviado al servidor de la base de datos no es válido (error de sintaxis, referencias de objeto no válidas, etc.).

y en mis palabras, hay un tipo de Grammar error dentro del archivo de configuración hibernate.cfg.xml,

que ocurre cuando se escribe esquema de nombre equivocado propiedad defination dentro, como ejemplo abajo:

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

cuales se supone que es como:

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