Какая польза от @Transactional с JPA и Hibernate? - PullRequest
0 голосов
/ 23 января 2019

Я изучаю, как создать REST API с использованием JPA и Hibernate, а также базы данных MySQL, и вижу эту аннотацию @Transactional.Может кто-нибудь объяснить, в чем польза этой аннотации?

Например, у меня есть этот простой класс DAO:

@Repository
public class EmployeeDAOHibernateImpl implements EmployeeDAO {

    // define field for entitymanager
    private EntityManager entityManager;

    // set up constructor injection
    @Autowired
    public EmployeeDAOHibernateImpl(EntityManager entityManager) {
        this.entityManager = entityManager;
    }

    @Override
    @Transactional
    public List<Employee> findAll() {

        // get the current hibernate session
        Session currentSession = entityManager.unwrap(Session.class);

        // create a query
        Query<Employee> theQuery = 
                currentSession.createQuery("from Employee", Employee.class);

        // execute query and get result list
        List<Employee> employees = theQuery.getResultList();

        // return the results
        return employees;
    }

}

Вы можете увидеть @Transactional, используемый для метода findAll (), но если я удалю этот @Transactional, я получу тот же вывод... тогда какая польза от этого @Transactional?

Ответы [ 4 ]

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

Класс объявляет @Transactional для себя или своих членов, Spring создает прокси, который реализует тот же интерфейс (ы), что и класс, который вы аннотируете.Другими словами, Spring оборачивает компонент в прокси, и сам компонент не знает об этом .

Прокси-сервер предоставляет Spring способ внедрить поведение до, после или вокруг вызовов методов в прокси-объекте.

Внутренне это то же самое, что и совет по транзакциям (с использованием AOP)где прокси создается первым и вызывается до / после метода целевого компонента.

Сгенерированный прокси-объект снабжен TransactionInterceptor, который создается Spring.Поэтому, когда метод @Transactional вызывается из клиентского кода, TransactionInterceptor сначала вызывается из прокси-объекта, который начинает транзакцию и в конечном итоге вызывает метод для целевого компонента.Когда вызов заканчивается, TransactionInterceptor фиксирует / откатывает транзакцию соответственно

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

@Transactional аннотация используется, когда вы хотите, чтобы определенный метод / класс (= все методы внутри) выполнялся в транзакции.

Предположим, пользователь A хочет передать 100 $ пользователю B. Что происходит:

  1. Мы уменьшаем счет А на 100 $
  2. Мы добавляем 100 $ на счет B

Предположим, что исключение выдается после выполнения 1) и до выполнения 2). Теперь у нас было бы какое-то несоответствие, потому что A потерял 100 $, а B ничего не получил. Транзакции означает все или ничего. Если в методе есть исключение, изменения не сохраняются в базе данных. Происходит нечто, называемое rollback.

Если вы не укажете @Transactional, каждый вызов БД будет проводиться в отдельной транзакции.

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

Как правило, аннотация @Transactional записывается на уровне обслуживания.

Используется для объединения более одной записи в базу данных в качестве одной атомарной операции .

Когда кто-то вызывает метод, отмеченный @Transactional , все или никакие записи в базу данных выполняются .

Вв случае операций чтения это бесполезно, так же как и в случае одной атомарной записи.Вы используете его в одном чтении (выберите), поэтому добавление или удаление аннотации @Transactional не оказывает никакого влияния.

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

Чтобы ознакомиться с аннотацией @Transactional в целом, ознакомьтесь с этой статьей.Чтобы копать глубже, пожалуйста, обратитесь весной документы .

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