返回信息流现在用hibernate3+spring3做web程序。
用一个类作为DAO。这里每个函数都是一个事务:
class Dao {
private SessionFactory sessionFactory;
public void setSessionFactory(...) { ... }
@Transactional
Foo getById(Long id) {
return (Foo) sessionFactory.getCurrentSession().get(Foo.class, id);
}
}
当然,context中配置了TransactionManager和事务注解。
<bean id="sessionFactory" class="......................LocalSessionFactoryBean">....</bean>
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<tx:annotation-driven /> <!-- auto-wired to transactionManager -->
<bean id="dao" class="Dao">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
然后呢,神奇般地这个代码可以正确工作。
看了Spring关于ORM和事务的介绍:
这个@Transactional是用AOP的方法织入了自动事务处理的方面。具体实现是用了一个Proxy,外界调用这个方法的时候,由Proxy代为管理事务。
但是,也没有说明一些问题:
1. getCurrentSession()从哪里获得的Session?如果所有的方法都依赖“Current”的"Session",那么这个DAO还是不是线程安全的?(Servlet服务器也许会用多线程优化性能)
2. 这个session该不该手动close()?实验证明如果手动close,第二次访问这个dao就会抛出异常(说Session is closed)。从“Session是一个工作的单位”的角度,应该close;但想到“连接池”的概念,又不该close。
这是一条镜像帖。来源:北邮人论坛 / java / #13363同步于 2010/3/5
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖
[求助]有熟悉spring+hibernate的没有
wks
2010/3/5镜像同步3 回复
订阅后,新回复会通过你的通知中心匿名送达。
3 条回复
这个页面解答了一些问题:https://www.hibernate.org/42.html
1. 缺省状态是不可以使用getCurrentSession的。在恰当地配置Hibernate的情况下,它可以得到一个只允许beginTransaction的一个Session,而开始的新事物可以与当前线程绑定(或者与JTA的事务绑定),而这个Session是与该事务绑定的。如果是与线程绑定,应该就是线程安全的。
2. 用getCurrentSession()获得的Session可以自动flush和close,但是用openSession获得的Session要手动close()。
这不是配置事务嘛,我感觉是连接和线程绑定了
另外,我觉得在Bo层(或称Service层)加事务合理吧
毕竟Dao层的一个函数只是对数据库的一次操作,Bo层多次操作时才要保证事务