2011-01-31 14 views
7

En mi clase de servicio me gustaría tener algo como:Hibernate transacción activa

class ClientService { 

    // Authorize 
    // Returns true: Authorization successful 
    // Returns false: Authorization failed 
    public boolean authorize(String id, String password) { 

    //Here I would like to check if an active transaction exists. 
    //If it exists, use that one, else create a new session and start 
    //a new transaction. 
    //For example: 
    Session session = HibernateUtil.getSessionFactory().getCurrentSession(); 
    if(!session.SOMEMETHOD_CHECK_IF_TRANSACTION_IS_ACTIVE) { 
    session.beginTransaction(); 
    } 

    Client client = clientDAO.get(id); 

    if (client != null) { 
    if (client.getPassword().equals(password)) { 
     logger.debug("Authorization successful. ID: " + client.getId() + ", password: " + client.getPassword()); 
     return true; 
    } else { 
     logger.error("Authorization unsuccessful"); 
     return false;  
    } else { 
     logger.debug("Authorization unsuccessful. No client exists with ID: " + id); 
     return false; 
    } 
    } 
} 

Aviso del texto comentado después del cabezal método. No estoy tan familiarizado con Hibernate, pero creo que sería genial si los métodos de servicio comprueban si existe transacción, úsala, de lo contrario crea una nueva y ciérrala.

Si es posible, ¿hay algún motivo de rendimiento (u otros) que deba tener en cuenta? ¿O es de otra manera realizar este tipo de cosas?

Saludos

Respuesta

12

de lweller es un enfoque más apropiado que mi respuesta, pero se puede comprobar el estado de una transacción llamando session.getTransaction().isActive()

Consulte el javadoc para Hibernate Transaction.

+0

Creo que session.getTransaction() seguramente devuelve siempre una transacción activa ... Así que no funciona para mí (atlest) .... ¿hay alguna otra solución? –

3

Básicamente se puede llamar session.beginTransaction(); en cualquier caso, ya que se especifica por JavaDoc de Hibernate:

empezar una unidad de trabajo y devolver el objeto de transacción asociados. Si se requiere una nueva transacción subyacente, comience la transacción. De lo contrario, continúe el nuevo trabajo en el contexto de la transacción subyacente existente.

Pero yo consideraría seriamente el uso de un marco para la gestión transation, como respuesta spring

+0

Estoy totalmente de acuerdo. En nuestro lugar de trabajo, no usan Spring y están causando todo tipo de problemas de transacción de hibernación. – blackpanther

Cuestiones relacionadas