Hola, en cuanto a la encapsulación de ejecuciones en clases para no repetir código, yo lo que tengo es una clase generica donde está el trozo que maneja las transacciones que te enseñe y luego una clase generica mas o menos así:
Código:
/**
* Class to perform actions with the hibernate wrapping
*/
public static abstract class HBAction
{
public abstract void perform(Map paramMap, Session theSession,
Map output, Map errorList);
}
Entonces cuando quiero ejecutar algo, lo que hago es crear una instancia de esa clase con el codigo que me interesa. En tu caso, seria algo asi como esto:
Código:
public static HBAction deleteOffice = new HBAction()
{
public void perform(Map paramMap, Session theSession,
Map output, Map errorList)
{
String name = (String) paramMap.get("p_name");
if ((name != null) && (name.trim().length() > 0))
{
// Realizar el query. NUNCA usar directamente parametros sin tratar
// concatenandolos para construir sentencias
try
{
List offices = session.createQuery("from Office as o where and o.name = ?").setString(0,name).list();
if (!offices.isEmpty())
{
Office office = (Office) offices.get(0);
if(office.getOrders()==null || office.getOrders().isEmpty())
{
session.delete(office);
session.flush;
}
else
{
errorList.put(OFFICE_WITH_ORDERS_ERROR,"No se puede borrar una oficina con ordenes pendientes: " + name);
}
}
else
{
errorList.put(NO_OFFICE_NAME_ERROR,"No existe una oficina con el nombre: " + name);
}
}
catch (HibernateException e)
{
errorList.put(DATABASE_ERROR,"Error borrando la oficina con ordenes pendientes: " + name);
errorList.put(DATABASE_ERROR_EXCEPTION,e);
}
}
else
{
errorList.put(NO_NAME_ERROR,"Parametro name obligatorio");
}
}
}
La clase que te envie, lo que hace es que tu le pasas un/varios HBAction y los ejecuta (donde ponia "Ejecucion de las acciones con la sesion Hibernate") y en vez un booleano de error, lo que compruebo es que el Map errorList este vacio al acabar de ejecutar las acciones. Si esta vacio, commit. Si no, rollback. En caso de querer devolver objetos (una consulta en vez de un borrado) se pondrían en el Map output y se recogen al salir (si usas Hibernate y lazy loading hay que tener cuidado con lo que haces con ellos fuera de la transaccion).
Yo en vez de objetos uso XML, asi que en vez de Maps yo paseo nodos de XML y no tengo problemas al usar los objetos una vez se ha acabado la transaccion. Así que este codigo es adaptado un poco a ojimetro y puede contener errores, el original para XML lo puedes ver aqui:
https://webleaf.dev.java.net/source/....1&view=markup
En cuanto a relacion de codigo/tratamiento de errores. A mi no me suele preocupar mucho mientras sea claro de leer y facil de mantener. En ese sentido suelo ser muy verborreico pero tengo programas en marcha 24h/dia que no he tocado en años y cuando hay un error miro los logs y se exactamente lo que pasa. Además que este tipo de planteamiento de hacer codigo "simplon" permite más adelante dejar que te lo genere automaticamente el ordenador para ciertos casos
.
Una recomendación es no usar nunca excepciones para controlar el flujo de tu programa, como estas haciendo en tu ejemplo para señalar que un parametro no esta o que un query no devolvio nada. Las excepciones son normalmente para errores graves no previstos para no confudir las cuestiones "leves", que un query no devuelva nada puede ser bien normal, de las "graves", como que la BDD no está accesible o que el SQL dio un error.
En cuanto a trabajar, trabajo en una universidad en departamento de desarrollo interno (no como profe) y algunas tardes como consultor para empresas con "problemillas" en sus aplicaciones web. Es una buena combinacion para mi gusto.
Un saludo
Nota: El codigo asi como esta no funciona directamente, esta puesto un poco a ojo adaptado del que uso
.