Hibernate активная транзакция - PullRequest
7 голосов
/ 31 января 2011

В моем классе обслуживания я хотел бы иметь что-то вроде:

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

Обратите внимание на закомментированный текст после заголовка метода.Я не очень знаком с Hibernate, но я думаю, что было бы здорово, если бы сервисные методы проверяли, существует ли транзакция, используют ли ее, в противном случае создайте новую и закройте ее.

Если это возможно, есть ликакие-либо причины производительности (или другие), которые я должен иметь в виду?Или это какой-то другой способ выполнения таких вещей?

С уважением

Ответы [ 3 ]

12 голосов
/ 01 февраля 2011

Ответ lweller является более подходящим подходом, чем мой ответ, но вы можете проверить состояние транзакции, позвонив по номеру session.getTransaction().isActive()

. См. Javadoc для Hibernate Transaction .

3 голосов
/ 31 января 2011

Как правило, вы можете вызвать session.beginTransaction(); в любом случае, как указано в JavaDoc Hibernate:

Начните единицу работы и верните связанный объект транзакции. Если требуется новая базовая транзакция, начните транзакцию. В противном случае продолжите новую работу в контексте существующей базовой транзакции.

Но я бы серьезно подумал об использовании фреймворка для управления переходами, например spring

0 голосов
/ 18 января 2019

((SessionImpl) session) .isTransactionInProgress () даст транзакцию активную или нет, не создавая новую транзакцию

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...