@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 在语句执行后立即关闭事务并且不将此事务绑定到任何线程。
我正在从控制器调用以下服务方法,方法顶部没有@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 在语句执行后立即关闭事务并且不将此事务绑定到任何线程。