java - 为什么我会收到“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);
}
}
解决方案
推荐阅读
- c# - 为什么引用不通过
- kotlin - 无法访问协程中的函数参数
- r - 用词性标注确定句子的时间性
- r - 使用模式匹配编写 for 循环
- html - 将鼠标悬停在同一父级内的不同类上时是否可以显示一个类?
- azure - 在此期间发送的数据过多并在 Application Insights 中被删除
- swift - 我无法在 swift Playground 文件中导入 AudioKit 或 AudioKitPlaygrounds
- cakephp - 在 CAKEPHP 1.3 中编写蛋糕测试用例时使用多个数据库源
- java - 如何使用 Java 代码从具有嵌套数据的 Json 数组中获取值
- c# - 基于 XML 中的节点创建用户表单