@PersistenceContext entitymanager 在没有事务的情况下工作

@PersistenceContext entitymanager working without transaction

我正在从控制器调用以下服务方法,方法顶部没有@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);
    }
}

我很困惑,它有效,结果在方法结束时提交,实体管理器注入服务:

@PersistenceContext
private EntityManager entityManager;

谁能解释一下如何在没有跨国的方法上创建交易?


更新: 糟糕的是,我在没有注意到的情况下在界面上使用了@Transactional。但是 select 查询是如何工作的?什么时候创建会话? spring.jpa.open-在视图中已禁用

基本上,在使用“在视图中打开会话”/“在视图中打开实体管理器”模式时是可能的。

Spring 默认启用“在视图中打开实体管理器”模式(即 属性 spring.jpa.open-in-view 设置为 true)。

这个 属性 告诉 Spring 注册 OpenEntityManagerInViewInterceptor 就可以了。

UPD.

JPA 不对读取操作强制执行事务。这就是为什么 select 语句在没有 @Transactional.

的情况下起作用的原因

如果用户没有声明事务边界,那么每个 select 语句将在单独的事务中执行(自动提交模式)——这就是 JDBC 处理这种情况的方式(即 JDBC 打开一个事务)。

JDBC 在语句执行后立即关闭事务并且不将此事务绑定到任何线程。