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

String + hibernate

Estas en el tema de String + hibernate en el foro de Java en Foros del Web. Que tal, les comento que soy nuevo en este temilla y ya empiezo a toparme con inconvenientes por mi desconocimiento. Bueno tengo un problema con ...
  #1 (permalink)  
Antiguo 18/05/2011, 19:48
 
Fecha de Ingreso: mayo-2011
Mensajes: 2
Antigüedad: 12 años, 11 meses
Puntos: 0
String + hibernate

Que tal, les comento que soy nuevo en este temilla y ya empiezo a toparme con inconvenientes por mi desconocimiento. Bueno tengo un problema con la session que genero desde spring ya que cuando quiero actualizar mediente un update(Objeto) un objeto previamente cargado mediante load da el siguiente:

org.hibernate.HibernateException: Illegal attempt to associate a collection with two open sessions

Tengo entendido que es porque tengo un objeto cliente asociado a una session de hibernate (cuando hago el load() o get() ) y luego estoy tratando de actualizarlo mediante otra session. Espero alguien me pueda dar una manito para ver si es correcto lo que digo y ya que estamos me de una ayuda para solucionarlo.
Desde ya muchas gracias, saludos.

Les dejo la configuracion de spring:

<?xml version='1.0'?>

<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
"http://www.springframework.org/dtd/spring-beans.dtd">

<beans default-autowire="byName">

<bean id="myDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="org.gjt.mm.mysql.Driver"/>
<property name="url" value="jdbc:mysql://localhost/gym?"/>
<property name="username" value="miguel"/>
<property name="password" value="miguelgym321"/>
</bean>

<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotati on.AnnotationSessionFactoryBean">
<property name="dataSource" ref="myDataSource" />
<property name="mappingResources">
<list>
<value>hibernate/Cliente.hbm.xml</value>

</list>
</property>

<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQ LInnoDBDialect</prop>
<prop key="hibernate.show_sql">true</prop>
</props>
</property>
</bean>

<bean id="clienteDao" class="ar.com.gym.servicios.persistencia.dao.Clien teDAO">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>

</beans>

la clase de ClienteDAO

package ar.com.gym.servicios.persistencia.dao;

import java.util.List;

import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.criterion.Restrictions;
import org.springframework.orm.hibernate3.support.Hiberna teDaoSupport;

import ar.com.gym.modelo.Cliente;

public class ClienteDAO extends HibernateDaoSupport implements ClienteManager{

@Override
public Session _getSession() {
return (Session) getSession();
}

@Override
public Cliente get(Long id) {
return (Cliente) _getSession().get(Cliente.class, id);
}

@SuppressWarnings("unchecked")
@Override
public List<Cliente> list(Cliente cliente) {
return _getSession().createCriteria(Cliente.class).list() ;
}

@Override
public String save(Cliente cliente) {
String respuesta = "OK";
Session session = _getSession();
boolean commit= false;
Transaction tx = session.beginTransaction();
try{
session.save(cliente);
commit = true;
}catch(Exception e){
commit = false;
respuesta = e.toString();
System.out.println(e);
}
if(commit==true)
tx.commit();
else
tx.rollback();
return respuesta;
}

@Override
public String update(Cliente cliente) {
String respuesta = "OK";
Session session = _getSession();
boolean commit= false;
Transaction tx = session.beginTransaction();
try{
session.update(cliente);
commit = true;
}catch(Exception e){
commit = false;
System.out.println(e.toString());
}
if(commit==true)
tx.commit();
else
tx.rollback();
return respuesta;
}

@Override
public Cliente getXNroDoc(Integer nroDoc) {
return (Cliente) _getSession().createCriteria(Cliente.class).add(
Restrictions.eq("nroDoc", nroDoc)).uniqueResult();
}

}

ClienteManager:

package ar.com.gym.servicios.persistencia.dao;

import java.util.List;

import org.hibernate.Session;

import ar.com.gym.modelo.Cliente;

public interface ClienteManager {
public String update(Cliente cliente);
public String save(Cliente cliente);
public Cliente get(Long id);
public Cliente getXNroDoc(Integer dni);
public List<Cliente> list(Cliente cliente);
public Session _getSession();
}
y la clase que hace el update

Cliente cliente = new Cliente();
cliente.setId(Numeros.getLong("2"));
cliente = (((ClienteDAO)Factory.getFactory().getBean("client eDao")).get(cliente.getId()));

cliente.setNroDoc(28918084);
cliente.setApellido("Lopez");
cliente.setNombre("Pedro");
cliente.setFechaCarga(Fecha.getFecha());
cliente.setSexo("M");

((ClienteDAO)Factory.getFactory().getBean("cliente Dao")).update(cliente);
  #2 (permalink)  
Antiguo 19/05/2011, 00:02
 
Fecha de Ingreso: abril-2011
Mensajes: 12
Antigüedad: 13 años
Puntos: 1
Respuesta: String + hibernate

Puedes probar a añadir
}finally{
session.close();
}

a cada trycatch donde realizas las operaciones con session.

tampoco entiendo muy bien por que usas dos bloques try, con uno puedes controlarlo todo estilo:

Session session = HibernateUtil.getSession();
Transaction tx = null;
try {
tx=session.beginTransaction();
session.update(cliente);
tx.commit();
}catch (RuntimeException e) {
if(tx != null) tx.rollback();
throw e;
} finally {
session.close();
}

Espero que te sirva de algo, saludos.

Última edición por yashauo; 19/05/2011 a las 00:16
  #3 (permalink)  
Antiguo 19/05/2011, 20:14
 
Fecha de Ingreso: mayo-2011
Mensajes: 2
Antigüedad: 12 años, 11 meses
Puntos: 0
Respuesta: String + hibernate

Que tal desde ya muchas gracias por tu respuesta, claro podria poner el finally para que la cierre pero tendria que hacer eso tambien en la parte de los select (get y load de hibernate) con lo cual no le estaria pasandole el control a spring, lo que necesitaria es configurar bien mi DAO y Spring para que spring maneje mis session y las peticiones a ellas conjuntamente con las transacciones. Seguire probando, nuevamente muchas gracias por tu respuesta.
Saludos.

Etiquetas: hibernate, string
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 16:50.