这是大多数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()呼叫,否openSession或close。
getCurrentSession()
openSession
close
因此,当我load从不在会话中返回实体时,无法加载惰性集合。类似地,保存似乎总是同花顺!
load
@TransactionalSpring 的注解本身就具有开启和关闭会话以及交易的魔力吗?
@Transactional
在Spring中,由划定的业务交易@Transactional与hibernate之间存在一一对应的关系Session。
Session
也就是说,当通过调用@Transactional方法开始业务交易时,将创建hibernate会话(TransactionManager可能将实际创建延迟到首次使用该会话之前)。该方法完成后,将提交或回滚业务事务,这将关闭hibernate会话。
在您的情况下,这意味着调用DAO方法将开始一个新的事务(除非某个事务已经在进行中),退出DAO方法将结束它,这将关闭hibernate会话,并刷新它,并提交或滚动返回相应的hibernate事务,然后提交或回滚相应的JDBC事务。
对于这种典型用法,hibernate文档将此称为每次操作会话反模式。同样,@Transactionalspring参考手册中的所有示例都放在业务服务方法(或类)上,而不是存储库上。