HibernateException:非法尝试将代理与两个打开的Sessions关联

时间:2016-07-07 21:39:50

标签: java hibernate criteria

我有这个错误,请为此我需要帮助,不起作用,我不知道问题出在哪里

org.hibernate.HibernateException: illegally attempted to associate a proxy with two open Sessions
at org.hibernate.proxy.AbstractLazyInitializer.setSession(AbstractLazyInitializer.java:123)
at org.hibernate.engine.internal.StatefulPersistenceContext.reassociateProxy(StatefulPersistenceContext.java:568)
at org.hibernate.engine.internal.StatefulPersistenceContext.reassociateIfUninitializedProxy(StatefulPersistenceContext.java:533)
at org.hibernate.event.internal.ProxyVisitor.processEntity(ProxyVisitor.java:49)
at org.hibernate.event.internal.AbstractVisitor.processValue(AbstractVisitor.java:124)
at org.hibernate.event.internal.AbstractVisitor.processValue(AbstractVisitor.java:82)
at org.hibernate.event.internal.AbstractVisitor.processEntityPropertyValues(AbstractVisitor.java:76)
at org.hibernate.event.internal.AbstractVisitor.process(AbstractVisitor.java:143)
at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.performUpdate(DefaultSaveOrUpdateEventListener.java:310)
at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.entityIsDetached(DefaultSaveOrUpdateEventListener.java:244)
at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.performSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:109)
at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:90)
at org.hibernate.internal.SessionImpl.fireSaveOrUpdate(SessionImpl.java:680)
at org.hibernate.internal.SessionImpl.saveOrUpdate(SessionImpl.java:672)
at org.hibernate.engine.spi.CascadingActions$5.cascade(CascadingActions.java:235)
at org.hibernate.engine.internal.Cascade.cascadeToOne(Cascade.java:352)
at org.hibernate.engine.internal.Cascade.cascadeAssociation(Cascade.java:295)
at org.hibernate.engine.internal.Cascade.cascadeProperty(Cascade.java:161)
at org.hibernate.engine.internal.Cascade.cascade(Cascade.java:118)
at org.hibernate.event.internal.AbstractSaveEventListener.cascadeBeforeSave(AbstractSaveEventListener.java:432)
at org.hibernate.event.internal.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:265)
at org.hibernate.event.internal.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:194)
at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:137)
at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:209)
at org.hibernate.event.internal.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:55)
at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:194)
at org.hibernate.event.internal.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:49)
at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:90)
at org.hibernate.internal.SessionImpl.fireSave(SessionImpl.java:711)
at org.hibernate.internal.SessionImpl.save(SessionImpl.java:703)
at org.hibernate.internal.SessionImpl.save(SessionImpl.java:698)
at hibernate.mapeo.dao.rh.Datos_LaboralesDAO.AgregarDatos(Datos_LaboralesDAO.java:32)
at Sistema.Rh.VEmpleados.btnGuardarActionPerformed(VEmpleados.java:1557)
at Sistema.Rh.VEmpleados.access$800(VEmpleados.java:92)
at Sistema.Rh.VEmpleados$9.actionPerformed(VEmpleados.java:702)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2348)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)
at java.awt.AWTEventMulticaster.mouseReleased(AWTEventMulticaster.java:289)
at java.awt.Component.processMouseEvent(Component.java:6535)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3324)
at java.awt.Component.processEvent(Component.java:6300)
at java.awt.Container.processEvent(Container.java:2236)
at java.awt.Component.dispatchEventImpl(Component.java:4891)
at java.awt.Container.dispatchEventImpl(Container.java:2294)
at java.awt.Component.dispatchEvent(Component.java:4713)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4888)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4525)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4466)
at java.awt.Container.dispatchEventImpl(Container.java:2280)
at java.awt.Window.dispatchEventImpl(Window.java:2750)
at java.awt.Component.dispatchEvent(Component.java:4713)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:758)
at java.awt.EventQueue.access$500(EventQueue.java:97)
at java.awt.EventQueue$3.run(EventQueue.java:709)
at java.awt.EventQueue$3.run(EventQueue.java:703)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:86)
at java.awt.EventQueue$4.run(EventQueue.java:731)
at java.awt.EventQueue$4.run(EventQueue.java:729)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:728)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)

帮我解决这个问题。

这是HibernateUtil.java

package hibernate.mapeo;

import org.hibernate.SessionFactory;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;

public class HibernateUtil {

private static final SessionFactory sessionFactory = builSessionFactory();

private static SessionFactory builSessionFactory(){
    try {
        Configuration configuration = new Configuration();

        return configuration.configure().buildSessionFactory(
        new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()).build());
    }catch (Throwable ex) {
        System.err.println("El inicio de la sesion fallo." +ex);
        throw new ExceptionInInitializerError(ex);
    }
}

public static SessionFactory getSessionFactory() {
    return sessionFactory;
}
}

这是Sucursal,hbm.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD  3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="entidades.Rh.Sucursal" table="rh.SUCURSAL">
    <id column="idsucursal" name="idsucursal">
        <generator class="increment">
        </generator>
    </id>
    <property name="sucursal"/>
    <property name="direccion"/>
    <many-to-one cascade="save-update" class="entidades.Configuracion.Empresas" column="idempresa" fetch="select" name="empresa">          
    </many-to-one>
    <many-to-one cascade="save-update" class="entidades.ConfRegional.Sector" column="idsector" fetch="select" name="sector">          
    </many-to-one>
    <set fetch="select" inverse="true" lazy="true" name="usuarios" table="usuarios">
        <key>
            <column name="idsucursal"/>
        </key>
        <one-to-many class="entidades.Seguridad.Usuarios"/>
    </set>
    <set fetch="select" inverse="true" cascade="all" lazy="true" name="datos_laborales" table="datos_laborales">
        <key>
            <column name="idsucursal"/>
        </key>
        <one-to-many class="entidades.Rh.Datos_Laborales"/>
    </set>  
</class>

Datos_LaboralesDAO.java

package hibernate.mapeo.dao.rh;

import entidades.Rh.Datos_Laborales;
import hibernate.mapeo.HibernateUtil;
import java.util.List;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.criterion.Order;

public class Datos_LaboralesDAO {


private Session sesion;
private Transaction tx;

public boolean AgregarDatos(Datos_Laborales datos_laborales) throws HibernateException{

    boolean resp = false;
    try {
        iniciarOperacion();
        //tr.setTimeout(2);
        sesion.save(datos_laborales);
        tx.commit();
        resp = true;
    } catch (HibernateException he) {
        tx.rollback();
        he.printStackTrace();
        resp = false;
        throw he;
    } finally {
        if (sesion.isOpen()) {
            sesion.close();
        }
    }
    return resp;
}

public boolean ActualizarDatos(Datos_Laborales datos_laborales) throws HibernateException{

    boolean resp = false;
    try {
        iniciarOperacion();
        //tr.setTimeout(2);
        sesion.saveOrUpdate(datos_laborales);
        tx.commit();
        resp = true;
    } catch (HibernateException he) {
        tx.rollback();
        he.printStackTrace();
        resp = false;
        throw he;
    } finally {
        if (sesion.isOpen()) {
            sesion.close();
        }
    }
    return resp;
}

public boolean EliminarDatos(Datos_Laborales datos_laborales) throws HibernateException {

    boolean resp = false;
    try {
        iniciarOperacion();
        //tr.setTimeout(2);
        sesion.delete(datos_laborales);
        tx.commit();
        resp = true;
    } catch (HibernateException he) {
        tx.rollback();
        he.printStackTrace();
        resp = false;
        throw he;
    } finally {
        if (sesion.isOpen()) {
            sesion.close();
        }
    }
    return resp;
}
public List<Datos_Laborales> listadoDatos_Laborales() {

    List<Datos_Laborales> lista = null;
    try {
        this.iniciarOperacion();
        lista = sesion.createCriteria(Datos_Laborales.class).addOrder(Order.asc("iddatos_laborales")).list();
    } catch (HibernateException he) {
        throw he;
    } finally {
        if (sesion.isOpen()) {
            sesion.close();
        }
    }
    return lista;
}

public void iniciarOperacion() throws HibernateException {

    sesion = HibernateUtil.getSessionFactory().getCurrentSession();
    tx = sesion.beginTransaction();
}

public void manejaException(HibernateException he) throws HibernateException {

    tx.rollback();
    throw new HibernateException("Ocurrio un error en la capa de acceso a datos. ", he);
}
}

Datos_Laborales.hbm.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="entidades.Rh.Datos_Laborales" table="rh.datos_laborales">
    <id column="iddatos_laborales" name="iddatos_laborales">
    </id>
    <property name="idempleado"/>
    <property name="telefono"/>
    <property name="ext"/>
    <property name="flota"/>
    <property name="nss"/>
    <property name="salario_mensual"/>
    <property name="salario_quincenal"/>
    <property name="salario_diario"/>
    <property name="salario_hora"/>
    <property name="fecha_contratacion"/>   
    <property name="fecha_inicio"/>  
    <property name="fecha_terminacion"/>    
    <many-to-one cascade="save-update" class="entidades.Rh.Posicion" column="idposicion" fetch="select" name="posicion">          
    </many-to-one>
    <many-to-one cascade="save-update" class="entidades.Rh.Contratacion" column="idcontratacion" fetch="select" name="contratacion">          
    </many-to-one> 
    <many-to-one cascade="save-update" class="entidades.Rh.Nivel_Academico" column="idnivel_academico" fetch="select" name="nivel_academico">          
    </many-to-one>
    <many-to-one cascade="save-update" class="entidades.Rh.Sucursal" column="idsucursal" fetch="select" name="sucursal">          
    </many-to-one> 
</class>
</hibernate-mapping>

保存按钮

public void iniciarOperacion() throws HibernateException {

    sesion = HibernateUtil.getSessionFactory().openSession();
    tx = sesion.beginTransaction();
}
    private void btnGuardarActionPerformed(java.awt.event.ActionEvent evt) {                                           
    this.iniciarOperacion();
    List<Empleados> lst;

    //Captura maxID del empleado
    long maxid = (long) sesion.createCriteria(Empleados.class)
            .setProjection(Projections.max("idempleado")).uniqueResult();

    ed = new EmpleadosDAO();
    dpd = new Datos_PersonalesDAO();
    dpgd = new Datos_PagoDAO();
    dld = new Datos_LaboralesDAO();
    listaempleados = new ArrayList<>();
    listadatos_personales = new ArrayList<>();
    listadatos_pago = new ArrayList<>();
    listadatos_laborales = new ArrayList<>();

    //Capturar datos principales
    String empleado = txtEmpleado.getText();
    String cedula = txtCedula.getText();
    Estados estado = (Estados) cbxEstados.getSelectedItem();

    //Capturar datos personales
    String nombre_empleado = txtNombreEmpleado.getText();
    String apellido_empleado = txtApellidos.getText();
    Sexo sexo = (Sexo) cbxSexo.getSelectedItem();
    Estado_Civil estado_civil = (Estado_Civil) cbxEstado_Civil.getSelectedItem();
    Sector sector = (Sector) cbxSector.getSelectedItem();
    String direccion = txtDireccion.getText();
    String telefono_empleado = txtTelefono.getText();
    String celular_empleado = txtCelular.getText();
    String lugar_nacimiento = txtLugarNacimiento.getText();
    String email = txtEmail.getText();
    Date fecha_nacimiento = dcFecha_Nacimiento.getDate();
    byte[] foto = new byte[(int) this.longitudBytes];

    //Capturar datos de pago
    Forma_Pago forma_pago = (Forma_Pago) cbxForma_Pago.getSelectedItem();
    Cuentas_Bancarias cuenta_bancaria = (Cuentas_Bancarias) cbxCuenta_Bancaria.getSelectedItem();
    String cuentabancariaEmpleado = txtCuenta_BancariaEmpleado.getText();

    //Capturar datos laborales
    Posicion posicion = (Posicion) cbxPosicion.getSelectedItem();
    Sucursal sucursal = (Sucursal) cbxSucursal.getSelectedItem();
    Nivel_Academico nivel_academico = (Nivel_Academico) cbxNivel_Academico.getSelectedItem();
    Contratacion contratacion = (Contratacion) cbxContratacion.getSelectedItem();
    Date fecha_contratacion = dcFecha_Contratacion.getDate();
    Date fecha_inicio = dcFecha_Inicio.getDate();
    Date fecha_terminacion = dcFecha_Terminacion.getDate();
    String telefono_oficina = txtTelefono_Oficina.getText();
    String extension = txtExtension.getText();
    String flota = txtFlota.getText();
    String sueldo_mensual = txtSalario_Mensual.getText();
    String salario_mensual = sueldo_mensual.replace(",", "");
    String sueldo_quincenal = txtSalario_Quincenal.getText();
    String salario_quincenal = sueldo_quincenal.replace(",", "");
    String sueldo_diario = txtSalario_Diario.getText();
    String salario_diario = sueldo_diario.replace(",", "");
    String sueldo_hora = txtSalario_Hora.getText();
    String salario_hora = sueldo_hora.replace(",", "");
    String nss = txtNSS.getText();

    lst = sesion.createCriteria(Empleados.class)
            .add(Restrictions.eq("cedula", cedula))
            .list();

    if (!(lst.isEmpty())) {
        JOptionPane.showMessageDialog(this, "Existe un empleado con el numero de cedula");
    } else {
        if (empleado.trim().equals("")) {
            JOptionPane.showMessageDialog(this, "Ingrese el nombre del empleado");
        } else {
            if (estado != null) {
                long id = ((maxid) + 1);
                Empleados empleados = new Empleados();
                empleados.setIdempleado(id);
                empleados.setEstados(estado);
                empleados.setEmpleado(empleado);
                empleados.setCedula(cedula);
                if (nombre_empleado.trim().equals("")) {
                    JOptionPane.showMessageDialog(this, "Ingrese Nombres del empleado");
                } else {
                    if ((apellido_empleado.trim().equals(""))) {
                        JOptionPane.showMessageDialog(this, "Ingrese Apellidos del empleado");
                    } else {
                        if (ed.AgregarDatos(empleados) == true) {
                            listaempleados.add(empleados);
                            //tblSectores.removeAll();
                        }
                        //Setea Valores Datos_Personales
                        Datos_Personales datos_empleados = new Datos_Personales();
                        datos_empleados.setIddatos_personales(id);
                        datos_empleados.setIdempleado(id);
                        datos_empleados.setNombres(nombre_empleado);
                        datos_empleados.setApellidos(apellido_empleado);
                        datos_empleados.setSexo(sexo);
                        datos_empleados.setEstado_civil(estado_civil);
                        datos_empleados.setSector(sector);
                        datos_empleados.setDireccion(direccion);
                        datos_empleados.setTelefono(telefono_empleado);
                        datos_empleados.setCelular(celular_empleado);
                        datos_empleados.setLugar_nacimiento(lugar_nacimiento);
                        datos_empleados.setCorreo_electronico(email);
                        datos_empleados.setFecha_nacimiento(fecha_nacimiento);
                        datos_empleados.setFoto(foto);

                        if (dpd.AgregarDatos(datos_empleados) == true) {
                            listadatos_personales.add(datos_empleados);
                            //tblSectores.removeAll();
                        }
                        //Setea Valores Datos_Pago
                        Datos_Pago datos_pago = new Datos_Pago();
                        datos_pago.setIddatos_pago(id);
                        datos_pago.setIdempleado(id);
                        datos_pago.setForma_pago(forma_pago);
                        datos_pago.setCuenta_bancaria(cuenta_bancaria);
                        datos_pago.setCuentabancaria_empleado(cuentabancariaEmpleado);

                        if (dpgd.AgregarDatos(datos_pago) == true) {
                            listadatos_pago.add(datos_pago);
                            //tblSectores.removeAll();
                        }
                        //Setea Valores Datos_Laborales
                        Datos_Laborales datos_laborales = new Datos_Laborales();
                        datos_laborales.setIddatos_laborales(id);
                        datos_laborales.setIdempleado(id);
                        datos_laborales.setPosicion(posicion);
                        datos_laborales.setSucursal(sucursal);
                        datos_laborales.setNivel_academico(nivel_academico);
                        datos_laborales.setContratacion(contratacion);
                        datos_laborales.setFlota(flota);
                        datos_laborales.setTelefono(telefono_oficina);
                        datos_laborales.setExt(extension);
                        datos_laborales.setNss(nss);
                        datos_laborales.setSalario_mensual(Double.parseDouble(salario_mensual));
                        datos_laborales.setSalario_quincenal(Double.parseDouble(salario_quincenal));
                        datos_laborales.setSalario_diario(Double.parseDouble(salario_diario));
                        datos_laborales.setSalario_hora(Double.parseDouble(salario_hora));
                        datos_laborales.setFecha_contratacion(fecha_contratacion);
                        datos_laborales.setFecha_inicio(fecha_inicio);
                        datos_laborales.setFecha_terminacion(fecha_terminacion);
                        if (dld.AgregarDatos(datos_laborales) == true) {
                            listadatos_laborales.add(datos_laborales);
                            //tblSectores.removeAll();
                        }

                    }
                }

            }
        }

         }
    }
    }

2 个答案:

答案 0 :(得分:0)

问题是,您可以通过调用SessionbtnGuardarActionPerformed()中打开this.iniciarOperacion(),并可能在Session中打开另一个ed.AgregarDatos(empleados)。当然,你不能通过这种方式使用两个会话。

您可以尝试使用getCurrentSession()。它返回一个会话被绑定到当前线程(或一个事务,取决于Hibernate设置)。

但最好的解决方案是使用Spring。 Spring将控制会话和事务。

答案 1 :(得分:0)

我改变了这个

package hibernate.mapeo.dao.rh;

import entidades.Rh.Datos_Laborales;
import hibernate.mapeo.HibernateUtil;
import java.util.List;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.criterion.Order;


public class Datos_LaboralesDAO {


private Session sesion;
private Transaction tx;

public boolean AgregarDatos(Datos_Laborales datos_laborales) throws HibernateException{

    boolean resp = false;
    try {
        iniciarOperacion();
        //tr.setTimeout(2);
        sesion.save(datos_laborales);
        tx.commit();
        resp = true;
    } catch (HibernateException he) {
        tx.rollback();
        he.printStackTrace();
        resp = false;
        throw he;
    } finally {
        if (sesion.isOpen()) {
            sesion.close();
        }
    }
    return resp;
}

public boolean ActualizarDatos(Datos_Laborales datos_laborales) throws HibernateException{

    boolean resp = false;
    try {
        iniciarOperacion();
        //tr.setTimeout(2);
        sesion.saveOrUpdate(datos_laborales);
        tx.commit();
        resp = true;
    } catch (HibernateException he) {
        tx.rollback();
        he.printStackTrace();
        resp = false;
        throw he;
    } finally {
        if (sesion.isOpen()) {
            sesion.close();
        }
    }
    return resp;
}

public boolean EliminarDatos(Datos_Laborales datos_laborales) throws HibernateException {

    boolean resp = false;
    try {
        iniciarOperacion();
        //tr.setTimeout(2);
        sesion.delete(datos_laborales);
        tx.commit();
        resp = true;
    } catch (HibernateException he) {
        tx.rollback();
        he.printStackTrace();
        resp = false;
        throw he;
    } finally {
        if (sesion.isOpen()) {
            sesion.close();
        }
    }
    return resp;
}
public List<Datos_Laborales> listadoDatos_Laborales() {

    List<Datos_Laborales> lista = null;
    try {
        this.iniciarOperacion();
        lista = sesion.createCriteria(Datos_Laborales.class).addOrder(Order.asc("iddatos_laborales")).list();
    } catch (HibernateException he) {
        throw he;
    } finally {
        if (sesion.isOpen()) {
            sesion.close();
        }
    }
    return lista;
}

public void iniciarOperacion() throws HibernateException {

    sesion = HibernateUtil.getSessionFactory().getCurrentSession();
    tx = sesion.beginTransaction();
}

public void manejaException(HibernateException he) throws HibernateException {

    tx.rollback();
    throw new HibernateException("Ocurrio un error en la capa de acceso a datos. ", he);
    }
}