一尘不染

@Transactional如何影响Hibernate中的当前会话?

hibernate

这是大多数DAO中使用的典型设置:

@Transactional
@Repository
public class DAO {

   @Autowired
   SessionFactory sessionFactory;

   public void save(Entity o) {
       sessionFactory.getCurrentSession().save(o);
   }

   public Entity load(int id) {
       return (Entity)sessionFactory.getCurrentSession().get(Entity.class, id);
   }

}

我看到只有getCurrentSession()呼叫,否openSessionclose

因此,当我load从不在会话中返回实体时,无法加载惰性集合。类似地,保存似乎总是同花顺!

@TransactionalSpring 的注解本身就具有开启和关闭会话以及交易的魔力吗?


阅读 240

收藏
2020-06-20

共1个答案

一尘不染

在Spring中,由划定的业务交易@Transactional与hibernate之间存在一一对应的关系Session

也就是说,当通过调用@Transactional方法开始业务交易时,将创建hibernate会话(TransactionManager可能将实际创建延迟到首次使用该会话之前)。该方法完成后,将提交或回滚业务事务,这将关闭hibernate会话。

在您的情况下,这意味着调用DAO方法将开始一个新的事务(除非某个事务已经在进行中),退出DAO方法将结束它,这将关闭hibernate会话,并刷新它,并提交或滚动返回相应的hibernate事务,然后提交或回滚相应的JDBC事务。

对于这种典型用法,hibernate文档将此称为每次操作会话反模式。同样,@Transactionalspring参考手册中的所有示例都放在业务服务方法(或类)上,而不是存储库上。

2020-06-20