我有这个错误,请为此我需要帮助,不起作用,我不知道问题出在哪里
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();
}
}
}
}
}
}
}
}
答案 0 :(得分:0)
问题是,您可以通过调用Session
在btnGuardarActionPerformed()
中打开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);
}
}