首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >@PersistenceContext实体管理器在没有事务的情况下工作

@PersistenceContext实体管理器在没有事务的情况下工作
EN

Stack Overflow用户
提问于 2018-10-23 10:00:45
回答 1查看 791关注 0票数 0

我从控制器调用以下在服务中的方法,在该方法的顶部不存在@跨国:

代码语言:javascript
复制
@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);
    }
}

我感到困惑的是,它起了作用,结果在方法结束时提交,实体管理器在服务中注入了以下内容:

代码语言:javascript
复制
@PersistenceContext
private EntityManager entityManager;

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

更新:糟糕的是,我在界面上使用了@Transactional,而没有注意到。但是select查询是如何工作的呢?什么时候创建会话?Open.jpa.open-in-view被禁用

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-10-23 10:22:00

基本上,在视图中使用Open /在视图模式中使用是可能的。

Spring默认启用模式(即属性spring.jpa.open-in-view设置为true)。

这个属性告诉Spring注册OpenEntityManagerInViewInterceptor,这是很有用的。

UPD.

JPA不强制对读操作进行事务处理。这就是为什么select语句在没有@Transactional的情况下工作的原因。

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52946271

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档