如何在Hibernate / Spring Data中获取@Transactional注释使用的当前会话?

时间:2017-08-14 15:00:51

标签: spring hibernate spring-data-jpa transactional

我一直在使用来自datasource的Callable语句执行存储过程。现在,此过程必须从在同一服务中执行SP之前执行的插入查询中读取数据。所以这会产生一个问题,因为整个服务都包含在@Transactional注释中,并且只在服务完成后才进行提交。那么,有没有办法获得当前@Transactional注释的当前会话。 SessionFactory的getCurrentSession给了我一个不同的会话。

2 个答案:

答案 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