我一直在使用来自datasource的Callable语句执行存储过程。现在,此过程必须从在同一服务中执行SP之前执行的插入查询中读取数据。所以这会产生一个问题,因为整个服务都包含在@Transactional注释中,并且只在服务完成后才进行提交。那么,有没有办法获得当前@Transactional注释的当前会话。 SessionFactory的getCurrentSession给了我一个不同的会话。
答案 0 :(得分:0)
如果您使用sessionfactory,您可以通过此代码获取
@Autowired
private SessionFactory sessionFactory;
public Session getSession() {
try {
return sessionFactory.getCurrentSession();
} catch (Exception e) {
System.out.println(e.getMessage().toString());
}
return sessionFactory.openSession();
}
答案 1 :(得分:0)
我相信你的理解是正确的。 在@Transactional上下文中,如果调用getCurrentSession()方法,则会创建新的Session对象(如果它不存在)或返回附加到当前事务的Session。 OpenSession()方法始终创建新会话。 @Transactional可以帮助您扩展Session的范围。
您可以通过调用以下方法获取方法内的当前会话(使用@Transactional注释)。当然,如果您想要检索数据,则取决于ISOLATION LEVEL。
sessionFactory.getCurrentSession()
会话在执行getCurrentSession()时第一次打开,并在事务结束时关闭,并在事务提交之前刷新。
在非事务性上下文中,如果我们调用getCurrentSession(),我们会得到一个异常。 默认情况下,传播是必需的,请确保您没有其他传播类型。
在配置类中使用以下注释,它启用它
@EnableTransactionManagement