Java - Hibernate

 
Vista:

Hibernate

Publicado por Mariano (24 intervenciones) el 09/01/2007 19:44:44
Buenas, tengo un problema con hibernate, en un proyecto ya tenia todas las clases mapeadas y funcionando, y hoy al probar un simple alta me tira un error, que no se a que se debe.
Les posteo el codigo(Simple) y el error para ver si alguien puede ayudarme.

Session session = HibernateSessionFactory.getSession();
Transaction tx = session.beginTransaction();
Destinos destino = new Destinos();
destino.setCoddestino(8);
destino.setNombre("Catamarca");
session.save(destino);
tx.commit();
session.close();

y el error es el sigiente:

org.hibernate.exception.SQLGrammarException: could not insert: [hibernate.Destinos]
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:67)
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2078)
at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2427)
at org.hibernate.action.EntityInsertAction.execute(EntityInsertAction.java:51)
at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:248)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:232)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:139)
at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:297)
at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)
at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:985)
at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:333)
at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:106)
at modelo.Test1.alta(Test1.java:66)
at modelo.Test1.main(Test1.java:18)
Caused by: com.ibm.db2.jcc.c.SqlException: DB2 SQL error: SQLCODE: -798, SQLSTATE: 428C9, SQLERRMC: CODDESTINO
at com.ibm.db2.jcc.c.fg.e(fg.java:1596)
at com.ibm.db2.jcc.c.fg.a(fg.java:1206)
at com.ibm.db2.jcc.b.gb.g(gb.java:140)
at com.ibm.db2.jcc.b.gb.a(gb.java:39)
at com.ibm.db2.jcc.b.w.a(w.java:34)
at com.ibm.db2.jcc.b.vb.g(vb.java:139)
at com.ibm.db2.jcc.c.fg.n(fg.java:1177)
at com.ibm.db2.jcc.c.gg.eb(gg.java:1862)
at com.ibm.db2.jcc.c.gg.d(gg.java:2295)
at com.ibm.db2.jcc.c.gg.W(gg.java:457)
at com.ibm.db2.jcc.c.gg.executeUpdate(gg.java:440)
at org.hibernate.jdbc.NonBatchingBatcher.addToBatch(NonBatchingBatcher.java:23)
at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2062)

es algo de SQL creo, va no se...
Muchas gracias de antemano
Saludos
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Hibernate

Publicado por Gonzalo (180 intervenciones) el 09/01/2007 20:00:03
El manual de DB2 dice que...

"Código de clase 42 Error de sintaxis o violación de la norma de acceso"

Y en concreto para el 428C9:

"428C9 Una columna ROWID no se puede especificar como la columna de destino de INSERT o UPDATE."

Con lo cual, la pinta que tiene es que la columna CODDESTINO es clave y se autogenera, de forma que no puedes hacerle tú un setCoddestino(8). No puedo asegurar que sea esto pero si pones cómo tienes definida la tabla de destinos en DB2 y cómo has declarado el mapeado en Hibernate a lo mejor le puedo echar un vistazo y decirte algo más.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Hibernate

Publicado por Mariano (24 intervenciones) el 09/01/2007 20:31:23
Gonzalo gracias por tu pronta respuesta.
Cierta mente es asi, cambiaron el campo de la tabla y ahora se autogenera.
EL mapeo lo tenia asi:
<hibernate-mapping>
<class name="hibernate.Destinos" table="DESTINOS" schema="CURSO1">
<id name="coddestino" type="java.lang.Integer">
<column name="CODDESTINO" />
<generator class="assigned" />
</id>
<property name="nombre" type="java.lang.String">
<column name="NOMBRE" length="30" not-null="true" />
</property>
</class>
</hibernate-mapping>

Cambie el <generator class="assigned" /> por sequence, increment,
foreign y no me anda, el error se produce aca no?
Si el campo se genera automaticamente cual uso?
Ahora posteo la tabla.
Muchas Gracias, Saldudos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Hibernate

Publicado por Gonzalo (180 intervenciones) el 09/01/2007 21:56:09
Oh, me fui a comer, pero ya veo que te han contestado lo de native.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Hibernate

Publicado por luis (88 intervenciones) el 09/01/2007 20:35:34
si asi como dice gonzalo observa tu fichero de mapeo (hbm.xml)y fijate en el atributo generator-class de tu propiedad id si es que lo tiene lo necesitas quitar si es que necesitas meter el id manualmente si necesitas que auto genere te recomiendo que yses el algorito "native" ya que es el que identifica si es secuencia o hilo dependiendo el caso
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Hibernate

Publicado por luis (88 intervenciones) el 09/01/2007 20:39:05
si es autogenerado no necesitas declarar setID(8); en el codigo sin embargo tienes que poner el setter en tu clase persistente aunque no lo uses ya que el fichero de mapeo busca todos los respectivos atributos con setters y getters ya que si no los pones te va a generar error
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Hibernate

Publicado por Mariano (24 intervenciones) el 09/01/2007 20:45:31
Gracias luis, el setter lo tenia por que el campo no era autogenerado, ahora cambiaron la tabla lo saque del codigo.
Y gracias por el algoritmo native, era el que necesitaba.
Saludos

Mariano
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Otra Pregunta

Publicado por Mariano (24 intervenciones) el 09/01/2007 21:03:03
Por que si saque una clase que tenia mapeada me tira este error, en ninguna parte del codigo hago referencia la misma.
Si no es mucha molestia me podras decir por que podria llegar a suceder esto:

ERROR:
%%%% Error Creating SessionFactory %%%%
org.hibernate.MappingException: Association references unmapped class: hibernate.Viajesb
at org.hibernate.cfg.HbmBinder.bindCollectionSecondPass(HbmBinder.java:2344)
at org.hibernate.cfg.HbmBinder$CollectionSecondPass.secondPass(HbmBinder.java:2618)
at org.hibernate.cfg.CollectionSecondPass.doSecondPass(CollectionSecondPass.java:35)
at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1012)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1168)
at hibernate.HibernateSessionFactory.rebuildSessionFactory(HibernateSessionFactory.java:60)
at hibernate.HibernateSessionFactory.getSession(HibernateSessionFactory.java:43)
at modelo.Test1.main(Test1.java:24)

Codigo en el main:
Session session = HibernateSessionFactory.getSession();// aca lansa el error

y donde tira error en HibernateSessionFactory:

public static void rebuildSessionFactory() {
try {
configuration.configure(configFile);
sessionFactory = configuration.buildSessionFactory();// esta parte de error
} catch (Exception e) {
System.err.println("%%%% Error Creating SessionFactory %%%%");
.printStackTrace();
}
}

Gracias, Yo de nuevo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Otra Pregunta

Publicado por Gonzalo (180 intervenciones) el 09/01/2007 23:29:12
Esa excepción dice que hay una referencia a la clase hibernate.Viajesb que no está mapeada.
Esa referencia estará en algún mapeado en una asociación desde otra clase; aunque en el código no se haga referencia a ella, Hibernate intentará cargarla y al no encontrar su mapeo, no sabrá cómo hacerlo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Otra Pregunta

Publicado por luis (88 intervenciones) el 09/01/2007 23:44:56
porque hibernate no reconoce el fichero de mapeo de tu clase persistente
asegurate de:
1.especificar en hibernate.cfg.xml en mapping resouce el nombre de tu fichero de mapeo
2. que el nombre de tu fichero de mapeo dea del mismo nombre que tu clase persistente (Viajesb) es decir Viajesb.hbm.xml y Viajesb.java
3. Sie estas trabajando dentro de un paquete que la ruta tanto en hibernate.cfg.xml y en Viajesb.hbm.xml sea la misma de tal modo que si tus archivos los tienes guardados por ejemplo dentro del directorio viajes:
En Viajesb.hbm.xml
<class name="viajes.Viajesb table="TU_TABLA">

y en hibernate.cfg.xml
<mapping resource="viajes/Viajesb.hbm.xml"/>

recuerda que para los ficheros xml se usan puntos para separar losnombres de los paquetes y en la configuracion se usan diagonales (slashes)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Otra Pregunta

Publicado por Mariano (24 intervenciones) el 10/01/2007 13:01:43
Gracias a ambos, el problema era que el archivo hbm.xml estaba referenciado en una relacion <one-to-many> de otra tabla, entonces cuando mapeaba esta y encontraba la referencia salia el error.

Muchas gracias a los dos y disculpen si las preguntas son inapropiadas.
Saludos, Mariano
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar