Foros del Web » Programación para mayores de 30 ;) » Java »

Java + Hibernate + SQLServer

Estas en el tema de Java + Hibernate + SQLServer en el foro de Java en Foros del Web. Saludos a todos tengo un pequeño problema en una aplicacion que estoy desarrollando sobre Java, en la que uso Hibernate para acceder a una BD ...
  #1 (permalink)  
Antiguo 23/10/2009, 03:37
 
Fecha de Ingreso: octubre-2009
Mensajes: 10
Antigüedad: 14 años, 6 meses
Puntos: 0
Java + Hibernate + SQLServer

Saludos a todos

tengo un pequeño problema en una aplicacion que estoy desarrollando sobre Java, en la que uso Hibernate para acceder a una BD SQL Server.

Cuando intento leer datos de las tablas para utilizarlos en la aplicacion, nunca me devuelve dichos datos. En codigo:

Código:
Session session = sessionFactory.openSession();
			Transaction tx = session.beginTransaction();
			result = session.find("FROM DB2PRAX");
			tx.commit();
			session.close();
esa variable result no es nula, pero no contiene datos nunca tras intentar efectuar la consulta, aunque la tabla esta poblada. Revisando las trazas de hibernate he detectado una cosa:

Cita:
[2009-10-22 11:15:57,513 ERROR] [main] hbm2ddl.SchemaUpdate - Unsuccessful: create table dbo.DB2PRAX (...)
[2009-10-23 11:47:48,169 ERROR] [main] hbm2ddl.SchemaUpdate - Ya hay un objeto con el nombre 'DB2PRAX' en la base de datos.
entiendo que esta intentando crear la tabla?? la tabla ya existe y quiero leerla, no se si este error en concreto tendra que ver.

El resto de trazas de Hibernate son correctas, alcanza la BD correctamente, mapea las propiedades, genera consultas etc... pero el resultado siempre es vacio :(

si alguien puede iluminarme se lo agradeceria a miles. Si es necesaria mas informacion, solo es necesario pedirla :)

saludos!!

Última edición por jesmrec; 23/10/2009 a las 03:46
  #2 (permalink)  
Antiguo 23/10/2009, 04:20
Avatar de elAntonie  
Fecha de Ingreso: febrero-2007
Mensajes: 894
Antigüedad: 17 años, 3 meses
Puntos: 10
Respuesta: Java + Hibernate + SQLServer

Wenas

Mira a ver si existe el valor

<property name="hbm2ddl.auto">

En tu cfg.xml y si es asi, mira vque valor tienes. create, update o create-drop.

Saludos.
  #3 (permalink)  
Antiguo 23/10/2009, 04:32
 
Fecha de Ingreso: octubre-2009
Mensajes: 10
Antigüedad: 14 años, 6 meses
Puntos: 0
Respuesta: Java + Hibernate + SQLServer

esto es lo que tengo:

Cita:
<property name="hibernate.hbm2ddl.auto">update</property>
  #4 (permalink)  
Antiguo 23/10/2009, 04:37
Avatar de elAntonie  
Fecha de Ingreso: febrero-2007
Mensajes: 894
Antigüedad: 17 años, 3 meses
Puntos: 10
Respuesta: Java + Hibernate + SQLServer

Quitalo. El nodo completo

Y cuenta.
  #5 (permalink)  
Antiguo 23/10/2009, 04:43
 
Fecha de Ingreso: octubre-2009
Mensajes: 10
Antigüedad: 14 años, 6 meses
Puntos: 0
Respuesta: Java + Hibernate + SQLServer

he eliminado esa linea y el error que comentaba antes ya no aparece :)

pero sigue sin recuperar los datos :(
  #6 (permalink)  
Antiguo 23/10/2009, 04:48
Avatar de elAntonie  
Fecha de Ingreso: febrero-2007
Mensajes: 894
Antigüedad: 17 años, 3 meses
Puntos: 10
Respuesta: Java + Hibernate + SQLServer

Buenos, vamos mejorando.

Coloca el fichero cfg.xml y el hbm.xml de la tabla DB2PRAX

Saludos
  #7 (permalink)  
Antiguo 23/10/2009, 04:52
Avatar de elAntonie  
Fecha de Ingreso: febrero-2007
Mensajes: 894
Antigüedad: 17 años, 3 meses
Puntos: 10
Respuesta: Java + Hibernate + SQLServer

Tambien coloca <property name="show_sql">true</property>, para ver la query que estas ejecutando en el log.
  #8 (permalink)  
Antiguo 23/10/2009, 04:57
 
Fecha de Ingreso: octubre-2009
Mensajes: 10
Antigüedad: 14 años, 6 meses
Puntos: 0
Respuesta: Java + Hibernate + SQLServer

el cfg.xml:

Cita:
<hibernate-configuration>
<session-factory>
<property name="hibernate.connection.driver_class">com.micro soft.sqlserver. jdbc.SQLServerDriver</property>
<property name="hibernate.connection.url">jdbc:sqlserver://Dc-srvr-bd:1433;User=*****;Password=******</property>
<property name="dialect">org.hibernate.dialect.SQLServerDial ect</property>
<property name="show_sql">true</property>
<property name="transaction.factory_class">
org.hibernate.transaction.JDBCTransactionFactory
</property>
<property name="hibernate.cache.provider_class">
org.hibernate.cache.HashtableCacheProvider
</property>

<mapping resource="com/desprax/orm/DB2PRAX.hbm.xml"/>
</session-factory>
</hibernate-configuration>
y el hbm.xml de DB2PRAX:

Cita:
<hibernate-mapping>
<class name="com.desprax.bean.dbo.DB2PRAX" table="dbo.DB2PRAX">
<composite-id>
<key-property name="COD_ENT" type="string"/>
<key-property name="EJER_CONT" type="string"/>
<key-property name="COD_BAL" type="string"/>
<key-property name="COD_MOD" type="int"/>
</composite-id>
<property name="DES_BAL" type="string"/>
<property name="COD_USU" type="string"/>
<property name="ACCION_USU" type="string"/>
<property name="FECHA_USU" type="date"/>
<property name="HORA_USU" type="string"/>
</class>
</hibernate-mapping>
  #9 (permalink)  
Antiguo 23/10/2009, 05:03
Avatar de elAntonie  
Fecha de Ingreso: febrero-2007
Mensajes: 894
Antigüedad: 17 años, 3 meses
Puntos: 10
Respuesta: Java + Hibernate + SQLServer

Querras decir.

<key-property name="COD_ENT" type="string" column="COD_ENT"/>
Y asi con todas. Donde esta el atributo column?? como sabe hibernate a que columnas se esta refiriendo cada campo??

Ah, bueno, claro que se llaman igual las columnas. Ni caso.
  #10 (permalink)  
Antiguo 23/10/2009, 05:07
Avatar de elAntonie  
Fecha de Ingreso: febrero-2007
Mensajes: 894
Antigüedad: 17 años, 3 meses
Puntos: 10
Respuesta: Java + Hibernate + SQLServer

La query que te saca?? Ejecutas esa query en tu BBDD y salen datos??
  #11 (permalink)  
Antiguo 23/10/2009, 05:29
 
Fecha de Ingreso: octubre-2009
Mensajes: 10
Antigüedad: 14 años, 6 meses
Puntos: 0
Respuesta: Java + Hibernate + SQLServer

efectivamente los nombres de los campos y las columnas coinciden ;)

En cuanto a la consulta. Me pierdo un poco entre toda la traza de log de hibernate, pero creo que lo que ejecuta es esto:

Cita:
[2009-10-23 12:43:12,312 DEBUG] [main] entity.EntityLoader - Static select for entity com.desprax.bean.dbo.DB2PRAX: select db2prax0_.COD_ENT as COD1_0_0_, db2prax0_.EJER_CONT as EJER2_0_0_, db2prax0_.COD_BAL as COD3_0_0_, db2prax0_.COD_MOD as COD4_0_0_, db2prax0_.DES_BAL as DES5_0_0_, db2prax0_.COD_USU as COD6_0_0_, db2prax0_.ACCION_USU as ACCION7_0_0_, db2prax0_.FECHA_USU as FECHA8_0_0_, db2prax0_.HORA_USU as HORA9_0_0_ from dbo.DB2PRAX db2prax0_ with (updlock, rowlock) where db2prax0_.COD_ENT=? and cdb2prax0_.EJER_CONT=? and db2prax0_.COD_BAL=? and db2prax0_.COD_MOD=?
asi tal cual no la puedo ejecutar en SQL Server porque pide esos campos en el where, pero si la ejecuto sin la clausula WHERE, funciona correctamente.
  #12 (permalink)  
Antiguo 23/10/2009, 05:39
 
Fecha de Ingreso: octubre-2009
Mensajes: 10
Antigüedad: 14 años, 6 meses
Puntos: 0
Respuesta: Java + Hibernate + SQLServer

acabo de ver mas abajo lo que creo que es lo que ejecuta:

Cita:
[2009-10-23 12:43:12,562 DEBUG] [main] ast.QueryTranslatorImpl - SQL: select db2prax0_.COD_ENT as COD1_0_, db2prax0_.EJER_CONT as EJER2_0_, db2praxc0_.COD_BAL as COD3_0_, db2prax0_.COD_MOD as COD4_0_, db2prax0_.DES_BAL as DES5_0_, db2prax0_.COD_USU as COD6_0_, db2prax0_.ACCION_USU as ACCION7_0_, db2prax0_.FECHA_USU as FECHA8_0_, db2prax0_.HORA_USU as HORA9_0_ from dbo.DB2PRAX db2prax0_
  #13 (permalink)  
Antiguo 23/10/2009, 05:51
Avatar de elAntonie  
Fecha de Ingreso: febrero-2007
Mensajes: 894
Antigüedad: 17 años, 3 meses
Puntos: 10
Respuesta: Java + Hibernate + SQLServer

Pues es esa la query que te esta ejecutando. Y es logico entonces que no te saque nada.

Tendrias que evitar el composite-id para sacar un load sin 'el where' (si te fijas la query es una consulta sobre la tabla y el where son los campos que tienes como clave primaria), por ejemplo haciendo una clave primaria diferente sobre otro campo 8por ejemplo, un autoincremental) o bien generar una query en el fichero hbm.xml con <sql-query

Y obtenerla en el java con:

ArrayList lista = new ArrayList(session.getNamedQuery("elnombredetuquery ")

Saludos.
  #14 (permalink)  
Antiguo 23/10/2009, 06:09
 
Fecha de Ingreso: octubre-2009
Mensajes: 10
Antigüedad: 14 años, 6 meses
Puntos: 0
Respuesta: Java + Hibernate + SQLServer

la que me ejecuta es la que pone en segundo lugar, sin where ni nada, y sigue devolviendo ningun valor, mientras que ejecutandola directamente sobre SQL Server si funciona. Si es que que cosas mas raras. Por si puede ser util, posteo la traza:

Cita:
[2009-10-23 14:05:29,745 DEBUG] [main] util.SQLStatementLogger - select db2prax0_.COD_ENT as COD1_0_, db2prax0_.EJER_CONT as EJER2_0_, db2prax0_.COD_BAL as COD3_0_, db2prax0_.COD_MOD as COD4_0_, db2praxc0_.DES_BAL as DES5_0_, db2prax0_.COD_USU as COD6_0_, db2prax0_.ACCION_USU as ACCION7_0_, db2prax0_.FECHA_USU as FECHA8_0_, db2prax0_.HORA_USU as HORA9_0_ from dbo.DB2PRAX db2prax0_
Hibernate: select db2prax0_.COD_ENT as COD1_0_, db2prax0_.EJER_CONT as EJER2_0_, db2prax0_.COD_BAL as COD3_0_, db2prax0_.COD_MOD as COD4_0_, db2prax0_.DES_BAL as DES5_0_, db2prax0_.COD_USU as COD6_0_, db2prax0_.ACCION_USU as ACCION7_0_, db2prax0_.FECHA_USU as FECHA8_0_, db2prax0_.HORA_USU as HORA9_0_ from dbo.DB2PRAX db2prax0_
[2009-10-23 14:05:29,808 DEBUG] [main] jdbc.AbstractBatcher - about to open ResultSet (open ResultSets: 0, globally: 0)
[2009-10-23 14:05:29,808 DEBUG] [main] jdbc.AbstractBatcher - about to close ResultSet (open ResultSets: 1, globally: 1)
[2009-10-23 14:05:29,808 DEBUG] [main] jdbc.AbstractBatcher - about to close PreparedStatement (open PreparedStatements: 1, globally: 1)
[2009-10-23 14:05:29,823 DEBUG] [main] engine.StatefulPersistenceContext - initializing non-lazy collections
[2009-10-23 14:05:29,823 DEBUG] [main] transaction.JDBCTransaction - commit
[2009-10-23 14:05:29,823 DEBUG] [main] transaction.JDBCTransaction - committed JDBC Connection
[2009-10-23 14:05:29,823 DEBUG] [main] jdbc.ConnectionManager - aggressively releasing JDBC connection
[2009-10-23 14:05:29,823 DEBUG] [main] jdbc.ConnectionManager - releasing JDBC connection [ (open PreparedStatements: 0, globally: 0) (open ResultSets: 0, globally: 0)]
[2009-10-23 14:05:29,823 DEBUG] [main] modules.Module2 - TENEMOS UN TOTAL DE 0 VALORES
[2009-10-23 14:05:29,823 INFO ] [main] modules.Module2 - CONEXION CERRADA
[2009-10-23 14:05:29,823 INFO ] [main] main.Main - FINAL DE LA EJECUCION
las ultimas tres trazas son introducidas por mi en el codigo.
  #15 (permalink)  
Antiguo 26/10/2009, 02:47
Avatar de elAntonie  
Fecha de Ingreso: febrero-2007
Mensajes: 894
Antigüedad: 17 años, 3 meses
Puntos: 10
Respuesta: Java + Hibernate + SQLServer

Hola de nuevo.

Prueba a ver lo que te he dicho ejecutalo como namedquery. A ver que te da.

Pregunta. A riesgo de parecer que te digo una tonteria, El usuario con el que te conectas desde hibernate, es el mismo con el que ejecutas la query en sql server??

Saludos.
  #16 (permalink)  
Antiguo 26/10/2009, 06:32
 
Fecha de Ingreso: octubre-2009
Mensajes: 10
Antigüedad: 14 años, 6 meses
Puntos: 0
Respuesta: Java + Hibernate + SQLServer

hola de nuevo, y ante todo, gracias por tu ayuda constante.

El usuario es el mismo si, de eso estoy completamente seguro. He puesto esto:

Código:
ArrayList lista = new ArrayList();
lista = (ArrayList) session.getNamedQuery("queryy").list();
log.debug("EL TAMAÑO DE LA LISTA ES: "+lista.size());
y en el hbm.xml:

Código:
<sql-query name="queryy">
                SELECT *
                FROM dbo.DB2PRAX
    </sql-query>

la traza de debug sigue devolviendo 0 resultados, pero es que se conecta bien, crea bien la consulta leyendola del hbm.xml etc etc...

Por dar mas posibles pistas:

Cita:
[2009-10-26 13:21:21,156 DEBUG] [main] util.SQLStatementLogger - SELECT *
FROM dbo.DB2PRAX
Hibernate: SELECT *
FROM dbo.DB2PRAX
[2009-10-26 13:21:21,906 DEBUG] [main] jdbc.AbstractBatcher - about to open ResultSet (open ResultSets: 0, globally: 0)
[2009-10-26 13:21:21,953 DEBUG] [main] jdbc.AbstractBatcher - about to close ResultSet (open ResultSets: 1, globally: 1)

[2009-10-26 13:21:21,953 DEBUG] [main] jdbc.AbstractBatcher - about to close PreparedStatement (open PreparedStatements: 1, globally: 1)
[2009-10-26 13:21:22,015 DEBUG] [main] engine.StatefulPersistenceContext - initializing non-lazy collections
EL TAMAÑO DE LA LISTA ES: 0
[2009-10-26 13:21:44,682 DEBUG] [main] transaction.JDBCTransaction - commit
[2009-10-26 13:21:44,682 DEBUG] [main] transaction.JDBCTransaction - committed JDBC Connection
[2009-10-26 13:21:44,682 DEBUG] [main] jdbc.ConnectionManager - aggressively releasing JDBC connection
[2009-10-26 13:21:44,682 DEBUG] [main] jdbc.ConnectionManager - releasing JDBC connection [ (open PreparedStatements: 0, globally: 0) (open ResultSets: 0, globally: 0)]

ahi en negrita marco que dice como si no abriese ResultSets, pero cierra 1, no se si tendra algo que ver.
  #17 (permalink)  
Antiguo 26/10/2009, 07:22
Avatar de elAntonie  
Fecha de Ingreso: febrero-2007
Mensajes: 894
Antigüedad: 17 años, 3 meses
Puntos: 10
Respuesta: Java + Hibernate + SQLServer

Ahi si que me has dejado a cuadros. Te sigue dando lo mismo??

Respecto a tu duda de los openresultset, es posible que esa traza, salga antes de la ejecucion, de tal modo que antes de la ejecucion, hay 0 resultsets pero despues hay 1.

Asi no seria incongruente.

No se me ocurre nada mas, deberias preguntar en un foro de hibernate.

Saludos.

PD. Si encuentras la solucion posteala aqui.
  #18 (permalink)  
Antiguo 26/10/2009, 07:34
 
Fecha de Ingreso: octubre-2009
Mensajes: 10
Antigüedad: 14 años, 6 meses
Puntos: 0
Respuesta: Java + Hibernate + SQLServer

voy a seguir investigando, y si doy con algo lo posteo aqui.

muchas gracias por tu ayuda una vez mas.
  #19 (permalink)  
Antiguo 27/10/2009, 07:47
 
Fecha de Ingreso: octubre-2009
Mensajes: 10
Antigüedad: 14 años, 6 meses
Puntos: 0
Respuesta: Java + Hibernate + SQLServer

bueno pues he conseguido arreglar el problema... el cual como era de esperar era una sonora tonteria.

En el archivo cfg.xml de hibernate tenia que añadir en el campo de la url el nombre de la base de datos

esto era lo que tenia

Código:
<property name="hibernate.connection.url">jdbc:sqlserver:******;User=******;Password=******</property>
y esto era lo necesario:

Código:
<property name="hibernate.connection.url">jdbc:sqlserver:******;database=******;User=******;Password=******</property>
tan simple y facil como eso.

un saludo!!
  #20 (permalink)  
Antiguo 27/10/2009, 07:54
Avatar de elAntonie  
Fecha de Ingreso: febrero-2007
Mensajes: 894
Antigüedad: 17 años, 3 meses
Puntos: 10
Respuesta: Java + Hibernate + SQLServer

Me alegro que lo hayas resuelto.

Saludos.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 23:04.