2011-01-31 24 views
7

Nella mia classe di servizio Mi piacerebbe avere qualcosa di simile:Hibernate transazione attiva

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; 
    } 
    } 
} 

Avviso del testo commentato dopo la testa metodo. Non sono così familiare con Hibernate, ma penso che sarebbe bello se i metodi di servizio controllassero se esiste una transazione, usarla, altrimenti crearne una nuova e chiuderla.

Se è possibile, ci sono motivi di prestazioni (o altri) che dovrei avere in mente? O è un altro modo per eseguire questo genere di cose?

migliori saluti

risposta

12

di lweller è un approccio più appropriato di mia risposta, ma si può verificare lo stato di una transazione chiamando session.getTransaction().isActive()

Vedere la javadoc per Hibernate Transaction.

+0

Penso che session.getTransaction() restituisca sicuramente sempre una transazione attiva ... Quindi non funziona per me (atlest) .... c'è qualche altra soluzione? –

3

Fondamentalmente è possibile chiamare session.beginTransaction(); in ogni caso, come è specificato da JavaDoc di Hibernate:

Iniziare un'unità di lavoro e restituire l'oggetto di transazione associato. Se è necessaria una nuova transazione sottostante, iniziare la transazione. Altrimenti, continua il nuovo lavoro nel contesto della transazione sottostante esistente.

Ma vorrei prendere seriamente in considerazione l'utilizzo di un quadro per la gestione transation, come risposta spring

+0

Sono assolutamente d'accordo. Al nostro posto di lavoro, non usano Spring e causano tutti i tipi di problemi di transazione in letargo. – blackpanther

Problemi correlati