我从控制器调用以下在服务中的方法,在该方法的顶部不存在@跨国:
@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查询是如何工作的呢?什么时候创建会话?Open.jpa.open-in-view被禁用
发布于 2018-10-23 10:22:00
基本上,在视图中使用Open /在视图模式中使用是可能的。
Spring默认启用模式(即属性spring.jpa.open-in-view设置为true)。
这个属性告诉Spring注册OpenEntityManagerInViewInterceptor,这是很有用的。
UPD.
JPA不强制对读操作进行事务处理。这就是为什么select语句在没有@Transactional的情况下工作的原因。
如果用户不声明事务边界,那么每个select语句都将在一个单独的事务(自动提交模式)中执行--这就是JDBC处理这种情况的方式(即JDBC打开一个事务)。
JDBC在语句执行后立即关闭事务,并且不将此事务绑定到任何线程。
https://stackoverflow.com/questions/52946271
复制相似问题