@Transactional (распространение = Propagation.SUPPORTS) ни одна транзакция не выполняется - PullRequest
0 голосов
/ 04 мая 2020

У меня есть простой проект CRUD. У меня есть простой проект CRUD с Hibernate 5 и Spring Boot. Когда я использую @Transactional(propagation = Propagation.SUPPORTS), я улавливаю ошибку javax.persistence.transactionrequiredexception: no transaction is in progress. Когда я использую @Transactional(propagation = Propagation.REQUIRED), все в порядке. Что я делаю не так?

Репозиторий:

@Transactional(propagation = Propagation.SUPPORTS)
public Toy getToy(String companyName, String toyName) throws Exception {
    Session session = sessionFactory.getCurrentSession();
    try {
        Query query = session.createQuery("from Toy where company.name = :company and name = :name");
        query.setParameter("company", companyName);
        query.setParameter("name", toyName);
        return (Toy) query.getSingleResult();
    } catch (NoResultException e) {
        Toy toy = new Toy();
        Query query = session.createQuery("from  Company where name = :name");
        query.setParameter("name", companyName);
        Company company = (Company) query.getSingleResult();
        toy.setCompany(company);
        toy.setName(templateName);
        toy.bought(0);
        toy.setViewed(0);
        return toy;
    }
}

1 Ответ

0 голосов
/ 04 мая 2020

REQUIRED - распространение по умолчанию. Spring проверяет, существует ли активная транзакция, а затем создает новую, если ничего не было. В противном случае бизнес-логика c добавляется к текущей активной транзакции.

SUPPORTS, Spring сначала проверяет, существует ли активная транзакция. Если транзакция существует, то будет использоваться существующая транзакция. Если транзакции не существует, она выполняется не транзакционной.

Таким образом, вы получили эту ошибку просто потому, что при входе внутрь переноса метода транзакцией «SUPPORT-распространение» транзакция не существует.

Между прочим, в SUPPORTS очень мало вариантов использования ... большую часть времени по умолчанию "REQUIRED" предлагает именно то, что нам нужно.

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