2011-01-31 21 views
7

W mojej klasie usług Chciałbym mieć coś takiego:aktywna transakcja Hibernate

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

obwieszczeniu skomentował tekst po głowie metody. Nie jestem zaznajomiony z Hibernate, ale myślę, że byłoby wspaniale, gdyby metody serwisowe sprawdzały, czy transakcja istnieje, użyj jej, w przeciwnym razie utwórz nową i zamknij.

Jeśli to możliwe, czy są jakieś powody wydajności (lub inne), o których powinienem pamiętać? Czy jest to jakikolwiek inny sposób na wykonanie tego rodzaju rzeczy?

poważaniem

Odpowiedz

12

lweller jest bardziej właściwe podejście niż moją odpowiedź, ale można sprawdzić stan transakcji poprzez wywołanie session.getTransaction().isActive()

Zobacz javadoc dla Hibernate Transaction.

+0

Myślę, że session.getTransaction() z pewnością zawsze zwraca aktywną transakcję ... Więc nie działa dla mnie (atlest) .... czy istnieje jakieś inne rozwiązanie? –

3

Zasadniczo można nazwać session.beginTransaction(); w każdym razie jak to jest określone przez JavaDoc z Hibernate:

Rozpocznij jednostkę pracy i powrót powiązanych przedmiotu transakcji. Jeśli wymagana jest nowa transakcja bazowa, rozpocznij transakcję. W przeciwnym razie kontynuuj nową pracę w kontekście istniejącej transakcji bazowej.

Ale chciałbym poważnie rozważyć wykorzystanie ram zarządzania transation, jak odpowiedź spring

+0

Całkowicie się zgadzam. W naszym miejscu pracy nie używają Springa i powoduje to wszelkiego rodzaju problemy z transakcjami hibernacji. – blackpanther

Powiązane problemy