Rollback y Hql - Ezamudio he aplicado lo que me comentastes y ....
Hola !
He aplicado lo que me indicas, pero me pide casterar a Transaction.
Pero cuando lo ejecuto me da un excepcion.
Te adjunto el metodo tal y como lo he dejado y la excepcion para ver si pueden indicarme algo mas.
Un Saludo y gracias
----------------------------------------------------
Exception in thread "main" java.lang.ClassCastException: org.hibernate.transaction.JDBCTransaction cannot be cast to javax.transaction.Transaction
at Paquete.Main.borrarClienteHql(Main.java:217)
at Paquete.Main.menu(Main.java:77)
at Paquete.Main.main(Main.java:38)
-----------------------------------------------------
private static void borrarClienteHql() {
try {
Session session = HibernateUtil.getSession();
Transaction tx = (Transaction) session.beginTransaction();
String hql = "delete from Cliente";
Query query = session.createQuery(hql);
int rowCount = query.executeUpdate();
System.out.println("Filas Afectadas: " + rowCount);
try {
tx.commit();
} catch (RollbackException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (HeuristicMixedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (HeuristicRollbackException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SystemException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} // o rollback()
session.close();
} catch (SecurityException e) {
// TODO Auto-generated catch block
_logger.info("Exception 1");
e.printStackTrace();
}
}
}
- ajesus's blog
- Inicie sesión o regístrese para enviar comentarios
créele
Créele a la excepción.
org.hibernate.transaction.JDBCTransaction cannot be cast to javax.transaction.Transaction
Ahora hasta crean temas
Ahora hasta crean temas personalizados ...
Pues aunque no soy @ezamudio (me hace falta bigote) voy a tratar de atinarle..
Yo quitaría el casting de:
Dejándolo
Y checar si en el código hay una referencia a
Y eliminarla, sólo debería haber referencias a:
No se puede crear temas ?? (Rollback Hql)
No entro demasiado en foros, con lo cual si incumplo algun regla comentarlo y lo soluciono.
Voy a probar dentro de un ratito lo que comentas y ya te cuento.
Un saludo y muchas Gracias
No es que no se puedan crear
No es que no se puedan crear temas, pero sería mejor que el seguimiento a tu duda, se llevara en el tema donde lo iniciaste, y no iniciar otro por algún comentario adicional.
Gracias por la aclaracion ! No volvera a repetirse.
Efectivamente a realizar lo que me comentas ya me compila.
Pero sigo con el mismo problema cuando realizo tx.rollback no
aborta la ejecucion de la sentencia.
Te adjunto el metodo.
Muchas gracias y espero que puedas ayudarme.
Un Saludo
private static void borrarClienteHql() {
try {
Session session = HibernateUtil.getSession();
Transaction tx = session.beginTransaction();
String hql = "delete from Cliente";
Query query = session.createQuery(hql);
int rowCount = query.executeUpdate();
System.out.println("Filas Afectadas: " + rowCount);
tx.rollback();
//commit();
// session.close();
} catch (SecurityException e) {
// TODO Auto-generated catch block
_logger.info("Exception 1");
e.printStackTrace();
}
}
JDBC?
y si haces algo similar con JDBC funciona? O tal vez la base de datos que estás utilizando no soporta transacciones?
Esto haciendo las pruebas con Mysql luego sera Oracle
Si soporta transaciones pues en la misma clase del problema expuesto anteriormente, es donde tambien esta implementado este metodo y funciona
perfectamente el RollBack.
Te adjunto el metodo que funciona perfectamente, en este caso inserta registros pero sin Hql.
La unica diferencia es que en el metodo de borrado utilizo Hql.
Ya comente que me daba la sensacion que Hql accede directamente a la
base de datos y no hace ni caso al control de transaciones, pero vamos es un suposicion.
Pero tengo claro que tengo que buscar la solucion, pues es la unica forma que he visto para borrar o actualizar de forma
masiva registros de la base de datos. Existe otra formula ????, claro esta con control transacional.
Pero ahora que mencionas lo de la base de datos, voy a crear otra base de datos cambiando el tipo de base de datos
para ver si van los tiros por ahi.
Bueno pues nada ya veremos, si se os ocurre algo pues bien venida sera.
Otro saludo y Gracias
private static void insertarCliente() {
_logger.info("Insertar Cliente");
// Cliente cliente = new Cliente();
Session session = HibernateUtil.getSession();
_logger.info("Insertar Cliente");
session.beginTransaction();
int contador = 0;
while (true) {
contador++;
Cliente cliente = new Cliente(("" + contador), "hola", "sss");
if (contador > 1000) {
break;
}
// cliente.setId(""+ contador);
// cliente.setNombre("hola");
// cliente.setApellido("apellido");
session.save(cliente);
_logger.info("Final Insertar Cliente");
System.out.println(" Contador Nº " + contador);
}
// session.getTransaction().commit();
session.getTransaction().rollback();
}
RollBack Hql Solucionado !
A raiz de un comentario vuestro, sobre si la base de datos admitida transaciones pues me dio una pista.
Esta haciendo las pruebas con Mysql y definia las tablas con el sistema de almacenamiento MyISAM y me sonaba que
en algun momento no me funcionaban las relaciones entre tablas.
Bien lo he cambiado a sistema de almacenamiento InnDB y funciona perfectamente.
Os adjunto un pequeño texto sobre este tema que encontre en la Wiki.
MyISAM es la tecnología de almacenamiento de datos usada por defecto por el sistema administrador de bases de datos relacionales MySQL. Este tipo de tablas están basadas en el formato ISAM pero con nuevas extensiones. En las últimas versiones de MySQL, el motor InnoDB está empezando a reemplazar a este tipo de tablas por su capacidad de ejecutar transacciones de tipo ACID y bloqueo de registros e integridad referencial.
Muchas gracias a todos y espero que os sirva esta historia.
Un saludo y hasta la proxima.