Problema con campo claver (bigserial) (Eclipse+hibernate+postgresql)

60 views
Skip to first unread message

Duilio

unread,
Nov 12, 2009, 9:38:37 AM11/12/09
to JavaSOS
Hola a todos estoy empezando a utilizar hibernate en eclipse para
conectarme a una base de datos postgresql . Para empezar cree una
clase muy simple llamada Nombre :
package PruebaHibernate;

public class Nombre {
private String Nombre;

private Long IdNombre;
public Long getIdNombre() {
return IdNombre;
}
public void setIdNombre(Long idNombre) {
IdNombre = idNombre;
}
public String getNombre() {
return Nombre;
}
public void setNombre(String nombre) {
Nombre = nombre;
}
}

La mapee de esta manera:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>

<class name="PruebaHibernate.Nombre" table="nombre"
schema="pruebaHibernate">
<id name="IdNombre" type="long" column ="idNombre">
<generator class="sequence">
<param name="sequence">nombre_idNombre_seq</param>
</generator>
</id>

<property name="Nombre" type="string">
<column name="nombre" />
</property>
</class>
</hibernate-mapping>

y el archivo de configuracion es el siguiente:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property
name="hibernate.connection.driver_class">org.postgresql.Driver</
property>
<property name="hibernate.connection.password">agil</property>
<property name="hibernate.connection.url">jdbc:postgresql://
localhost:5432/pruebaHibernate</property>
<property name="hibernate.connection.username">postgres</
property>
<property
name="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</
property>
<property name="current_session_context_class">thread</
property>
<property
name="cache.provider_class">org.hibernate.cache.NoCacheProvider</
property>
<property name="show_sql">true</property>
<property name="connection.pool_size">1</property>
<mapping resource="PruebaHibernate/Nombre.hbm.xml"/>
</session-factory>
</hibernate-configuration>

La tablas se llama nombre y solo tiene dos campos idNombre (bigserial)
no null y nombre character varying

La clase que trata de hacer el alta es la clase Alta:
public class Alta {

private SessionFactory sessionFactory;
public Alta() {
try {
System.out.println("Inicalizando Hibernate");
sessionFactory = new Configuration().configure().buildSessionFactory
();
System.out.println("terminado la inicializacion de Hibernate");
} catch (HibernateException e) {
e.printStackTrace();
}
}
public void agregaNombre(String nombres) {
try {
Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
Nombre nombre = new Nombre();
nombre.setNombre(nombres);

session.save(nombre);
tx.commit();
session.close();
} catch (HibernateException e) {
e.printStackTrace();
}
}
}


Pero el ejecuto y me da el siguiente error:

Inicalizando Hibernate
terminado la inicializacion de Hibernate
Hibernate: select nextval ('nombre_idNombre_seq')
org.hibernate.exception.SQLGrammarException: could not get next
sequence value
at org.hibernate.exception.SQLStateConverter.convert
(SQLStateConverter.java:90)
at org.hibernate.exception.JDBCExceptionHelper.convert
(JDBCExceptionHelper.java:66)
at org.hibernate.id.SequenceGenerator.generate(SequenceGenerator.java:
119)
at
org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId
(AbstractSaveEventListener.java:122)
at
org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId
(DefaultSaveOrUpdateEventListener.java:210)
at
org.hibernate.event.def.DefaultSaveEventListener.saveWithGeneratedOrRequestedId
(DefaultSaveEventListener.java:56)
at
org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient
(DefaultSaveOrUpdateEventListener.java:195)
at
org.hibernate.event.def.DefaultSaveEventListener.performSaveOrUpdate
(DefaultSaveEventListener.java:50)
at
org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate
(DefaultSaveOrUpdateEventListener.java:93)
at org.hibernate.impl.SessionImpl.fireSave(SessionImpl.java:563)
at org.hibernate.impl.SessionImpl.save(SessionImpl.java:551)
at org.hibernate.impl.SessionImpl.save(SessionImpl.java:547)
at PruebaHibernate.Alta.agregaNombre(Alta.java:28)
at PruebaHibernate.Inicio.main(Inicio.java:11)
Caused by: org.postgresql.util.PSQLException: ERROR: no existe la
relación «nombre_idnombre_seq»
Position: 17
at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse
(QueryExecutorImpl.java:2062)
at org.postgresql.core.v3.QueryExecutorImpl.processResults
(QueryExecutorImpl.java:1795)
at org.postgresql.core.v3.QueryExecutorImpl.execute
(QueryExecutorImpl.java:257)
at org.postgresql.jdbc2.AbstractJdbc2Statement.execute
(AbstractJdbc2Statement.java:479)
at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags
(AbstractJdbc2Statement.java:367)
at org.postgresql.jdbc2.AbstractJdbc2Statement.executeQuery
(AbstractJdbc2Statement.java:271)
at org.hibernate.id.SequenceGenerator.generate(SequenceGenerator.java:
98)
... 11 more

Si alguien podria darme una idea se q es como q no puede obtener un
nuevo valor para la clave del nuevo registro pero probe de todo y no
puedo resolverlo.
Muchas gracias desde ya por su tiempo y ayuda
Saludos
Duilio

TuRoCaBrErA

unread,
Nov 12, 2009, 9:45:47 AM11/12/09
to JavaSOS

buenas, una manera rápida podria ser no usar secuencia y usar esto:

<id access="field" column="nombre" name="id" type="integer">
<generator class="increment" />
</id>

para generar no uses secuencia y usa increment. Siempre y cuando no
necesites usar secuencia.
o de otra manera crea la secuencia:

CREATE SEQUENCE s_prueba_seq ;
ALTER SEQUENCE s_prueba_seq MAXVALUE 99999;
sumat=> ALTER SEQUENCE s_prueba_seq MINVALUE 1;
sumat=> ALTER SEQUENCE s_prueba_seq RESTART 10;


SELECT * from s_prueba_seq ;
sequence_name | last_value | increment_by | max_value | min_value |
cache_value | log_cnt | is_cycled | is_called
---------------+------------+--------------+-----------+-----------
+-------------+---------+-----------+-----------
s_prueba_seq | 10 | 1 | 99999 | 1
| 1 | 1 | f | f
(1 fila)


mmmm creo que esto era el problema. Espero que te sirva.

Duilio Bacalor

unread,
Nov 12, 2009, 9:59:01 AM11/12/09
to jav...@googlegroups.com
Hola muchas gracias por tu ayuda pero no me anda con la primera opcion la de poner increment me da este error
org.hibernate.exception.SQLGrammarException: could not fetch initial value for increment generator
y si probe con la secuencia y igual nome anda.
Gracias de todos modos

TuRoCaBrErA

unread,
Nov 12, 2009, 10:18:27 AM11/12/09
to JavaSOS
mmmm si es de prueba la base de datos, proba borrar la tabla y luego
agrega este parametro a tu configuración de spring

<prop key="hibernate.hbm2ddl.auto" >create</prop>

creo que seria algo asi:
<property name="hibernate.hbm2ddl.auto">create</property>

y de paso se te va a crear todo: la tabla y supongo que la secuencia
tambien.

Duilio Bacalor

unread,
Nov 12, 2009, 10:21:34 AM11/12/09
to jav...@googlegroups.com
Hola gracias de vuelta por el tiempo y tu ayuda, voy a probar lo que me dijiste de crear de nuevo la base, pero con respecto a lo otro no uso spring.
Saludos
Duilio
Reply all
Reply to author
Forward
0 new messages