首页 > 解决方案 > 为什么我会收到“createCriteria is not valid without active transaction”异常?休眠 5.6.0 最终版

问题描述

当我运行我的程序时,我收到以下错误我正在使用 Hibernate 5.6.0 final

线程“主”org.hibernate.HibernateException 中的异常:在 org.hibernate.context.internal.ThreadLocalSessionContext$TransactionProtectionWrapper.invoke(ThreadLocalSessionContext.java:347) 没有活动事务(当前状态:MARKED_ROLLBACK)的情况下调用方法“createCriteria”无效) 在 jdk.proxy2/jdk.proxy2.$Proxy33.createCriteria(Unknown Source) 在 hibernatecliente.ClienteAyuda.verCliente(ClienteAyuda.java:51) 在 hibernatecliente.Menu.opciones(Menu.java:27) 在 hibernatecliente.HibernateCliente.main (HibernateCliente.java:19)

这些是我的文件

休眠.cfg.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD//EN" "http://www.hibernate.org/dtd/hibernate-configuration.dtd"><hibernate-configuration>
    <session-factory>
        <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
        <property name="hibernate.connection.driver_class">com.mysql.cj.jdbc.Driver</property>
        <property name="hibernate.connection.url">jdbc:mysql://localhost:3307/polizas</property>
        <property name="hibernate.connection.username">root</property>
        <property name="hibernate.connection.password">root</property>
        <property name="hibernate.show_sql">true</property>
        <property name="hibernate.current_session_context_class">thread</property>
        <mapping resource="Cliente.hbm.xml"/>
    </session-factory>
</hibernate-configuration>

HibernateUtil.java

package hibernatecliente;

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

public class HibernateUtil {

    private static final SessionFactory sessionFactory = buildSessionFactory();

    private static SessionFactory buildSessionFactory() {
        try {
            Configuration configuration = new Configuration().configure("hibernate.cfg.xml");
            StandardServiceRegistryBuilder builder = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties());
            return configuration.buildSessionFactory(builder.build());
        } catch (Throwable ex) {
            System.err.println("Hay falla en la creacion de la sesion " + ex);
            throw new ExceptionInInitializerError(ex);
        }
    }

    public static SessionFactory getSessionFactory() {
        return sessionFactory;
    }

    public static void shutdown() {
// Close caches and connection pools
        getSessionFactory().close();
    }
}

ClienteAyuda.java

package hibernatecliente;

import org.hibernate.Session;
import org.hibernate.Query;
import java.io.Serializable;
import org.hibernate.Criteria;

public class ClienteAyuda implements Serializable {

    Session sesion = null;
    org.hibernate.Transaction tx = null;

    public ClienteAyuda() {
        if (sesion == null) {
            abrir();
        }
    }

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

    void cierre() {
        sesion.flush();
        sesion.clear();
        tx.commit();
        sesion.close();
    }

    public Cliente getInfoCliente(long ced) {
        Cliente resultado;
        if (!sesion.isOpen()) {
            abrir();
        }
        try {
            String cadena = "from Cliente where idcliente= :id";
            Query q = sesion.createQuery(cadena);
            q.setLong("id", ced);
            resultado = (Cliente) q.uniqueResult();
        } catch (Exception e) {
            return null;
        }
        return resultado;
    }

    public String verCliente() {
        if (!sesion.isOpen()) {
            abrir();
        }
        Criteria criteria = sesion.createCriteria(Cliente.class);
        String P = "";
        for (Object cliente_obj : criteria.list()) {
            Cliente cliente = (Cliente) cliente_obj;
            P = P + cliente.getIdcliente() + " " + cliente.getNomcliente() + "|";
        }
        if (P.length() > 0) {
            return P;
        } else {
            return "No hay Clientes";
        }
    }

    public void setAdicion(Cliente cliente) {
        if (!sesion.isOpen()) {
            abrir();
        }
        try {
            sesion.save(cliente);
            tx.commit();
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
    }

    public void setBorrar(Cliente cliente) {
        if (!sesion.isOpen()) {
            abrir();
        }
        try {
            sesion.delete(cliente);
            tx.commit();
        } catch (Exception e) {
        }
    }

    public void setEdicion(Cliente cliente) {
        if (!sesion.isOpen()) {
            abrir();
        }
        try {
            sesion.update(cliente);
            tx.commit();
        } catch (Exception e) {
        }
    }
}

菜单.java

package hibernatecliente;

import java.io.Serializable;
import javax.swing.*;

public class Menu implements Serializable {

    ClienteAyuda ayuda = null;
    Cliente cliente = null;

    public Menu() {
        ayuda = new ClienteAyuda();
        cliente = null;
    }

    public void init() {

    }

    void opciones() {
        long cedula;
        int telefono;
        String nombre, domicilio;
        int opc;
        Object[] valores = {"1. Adicion", "2. Borrar", "3. Editar", "4. Consulta", "5.Salir"};
        do {
            JOptionPane.showMessageDialog(null, ayuda.verCliente());
            String resp = (String) JOptionPane.showInputDialog(null, "Elija la Opcion", "Entrada de datos", JOptionPane.QUESTION_MESSAGE, null, valores, valores[0]);
            opc = Character.digit(resp.charAt(0), 10);
            switch (opc) {
                case 1:
                    cedula = Long.parseLong(JOptionPane.showInputDialog(null, "Escriba el número de cedula"));
                    cliente = ayuda.getInfoCliente(cedula);
                    if (cliente != null) {
                        JOptionPane.showMessageDialog(null, "Existe cedula");
                    } else {
                        nombre = JOptionPane.showInputDialog(null, "Digite Nombre");
                        domicilio = JOptionPane.showInputDialog(null, "Digite Domicilio");
                        telefono = Integer.parseInt(JOptionPane.showInputDialog(null, "Digite telefono"));
                        cliente = new Cliente(cedula, nombre, domicilio, telefono);
                        ayuda.setAdicion(cliente);
                    }
                    break;
                case 2:
                    cedula = Long.parseLong(JOptionPane.showInputDialog(null, "Escriba el número de cedula"));
                    cliente = ayuda.getInfoCliente(cedula);
                    if (cliente == null) {
                        JOptionPane.showMessageDialog(null, "No Existe cedula");
                    } else {
                        ayuda.setBorrar(cliente);
                    }
                    break;
                case 3:
                    cedula = Long.parseLong(JOptionPane.showInputDialog(null, "Escriba el número de cedula"));
                    cliente = ayuda.getInfoCliente(cedula);
                    if (cliente == null) {
                        JOptionPane.showMessageDialog(null, "No Existe cedula");
                    } else {
                        nombre = cliente.getNomcliente();
                        domicilio = cliente.getDomcliente();
                        telefono = cliente.getTelcliente();
                        nombre = JOptionPane.showInputDialog(null, "Digite Nombre", nombre);
                        domicilio = JOptionPane.showInputDialog(null, "Digite Domicilio", domicilio);
                        telefono = Integer.parseInt(JOptionPane.showInputDialog(null, "Digite Telefono", telefono));
                        cliente = new Cliente(cedula, nombre, domicilio, telefono);
                        ayuda.setEdicion(cliente);
                    }
                    break;
                case 4:
                    cedula = Integer.parseInt(JOptionPane.showInputDialog(null, "Escriba el número de cedula"));
                    cliente = ayuda.getInfoCliente(cedula);
                    if (cliente == null) {
                        JOptionPane.showMessageDialog(null, "No Existe cedula");
                    } else {
                        nombre = cliente.getNomcliente();
                        domicilio = cliente.getDomcliente();
                        telefono = cliente.getTelcliente();
                        String cadena = " ";
                        cadena = cadena + "Cedula:" + cedula + "\n";
                        cadena = cadena + "Nombre:" + nombre + "\n";
                        cadena = cadena + "Domicilio:" + domicilio + "\n";
                        cadena = cadena + "Telefono:" + telefono + "\n";
                        JOptionPane.showMessageDialog(null, cadena);
                    }
            }
        } while (opc != 5);
    }
}

标签: javahibernatehibernate-criteria

解决方案


推荐阅读