Bin*_*hel 5 java database spring 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);
}
}
Run Code Online (Sandbox Code Playgroud)
我看到只有getCurrentSession()被叫,没有openSession或close.
因此,当我从实体返回实体时load,不能加载懒惰的集合.类似地,保存似乎总是冲洗!
@Transactional春天的注释是否能够完全打开和关闭会话和交易的魔力?
在Spring中,划分的业务事务@Transactional与hibernate 之间存在一对一的对应关系Session.
也就是说,当通过调用@Transactional方法开始业务事务时,会创建hibernate会话(TransactionManager可能会延迟实际创建,直到首次使用该会话).该方法完成后,将提交或回滚业务事务,从而关闭hibernate会话.
在你的情况,这意味着调用DAO方法将开始一个新的事务(除非交易已在进行中),并退出DAO方法将结束它,它关闭了Hibernate的Session,这也刷新它,并提交或回滚返回相应的hibernate事务,然后提交或回滚相应的JDBC事务.
至于这是典型的用法,hibernate文档称之为会话操作反模式.同样,@Transactionalspring参考手册中的所有示例都放在业务服务方法(或类)上,而不是存储库中.
Spring 向用@Transactional 注释的bean 提供事务建议。Spring 事务提供了以下六个属性的支持,这些属性决定了事务的行为
1.isolation, 2.no-rollback-for, 3.propagation, 4.read-only, 5.rollback-for, 6.timeout。
@Transactional 可以启动新事务或可以根据其传播属性值加入现有的事务上下文。
在@Transactional上下文中,getCurrentSession()如果新的 Session 对象不存在,则方法创建新的 Session 对象,或者返回附加到当前事务的 Session。OpenSession() 方法总是创建新的会话。@Transactional帮助您扩展Session.
Session 在 getCurrentSession() 执行时第一次打开,在事务结束时关闭,在事务提交之前刷新。
在 Spring 中,如果我们getCurrentSession()在非事务上下文中使用,我们会得到一个异常。