@PersistenceContext entitymanager работает без транзакции - PullRequest
0 голосов
/ 23 октября 2018

Я вызываю следующий метод в обслуживании из контроллера, где нет @Transnational в верхней части метода:

@Override
public void test1(Pageable pageable) {
    {
        Query query =entityManager.createQuery("SELECT U from User U",User.class);
        List<User> users=query.getResultList();
        User user=new User();
        user.setName("hello");
        user.setLastName("hello");
         entityManager.persist(user);
    }
}

Я был смущен, что это сработало, и результат фиксируется в конце метода,EntityManager, введенный в службу с:

@PersistenceContext
private EntityManager entityManager;

Может кто-нибудь объяснить, как транзакция создается по методу без транснационального?


обновление: плохо, я использовал @Transactional на интерфейсене замечая этого.но как работает запрос на выборку?когда создается сессия?spring.jpa.open-in-view отключен

1 Ответ

0 голосов
/ 23 октября 2018

В принципе, это возможно при использовании шаблонов Open Session In View / Open Entity Manager In View.

Spring имеет шаблон Open Entity Manager In View, включенный по умолчанию (т. Е. Для свойства spring.jpa.open-in-view установлено значение true).

Это свойство сообщает Spring для регистрации OpenEntityManagerInViewInterceptor, что и помогает..

UPD.

JPA не применяет транзакции к операциям чтения.Вот почему оператор выбора оператора работает без @Transactional.

Если пользователь не объявляет границы транзакции, то каждый оператор выбора будет выполняться в отдельной транзакции (режим автоматической фиксации) - так JDBC обрабатывает этот случай (т.е. JDBC открывает транзакцию).

JDBC закрывает транзакцию сразу после выполнения оператора и не привязывает эту транзакцию ни к какому потоку.

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