BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / java / #13363同步于 2010/3/5
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖

[求助]有熟悉spring+hibernate的没有

wks
2010/3/5镜像同步3 回复
现在用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。
订阅后,新回复会通过你的通知中心匿名送达。
3 条回复
wks机器人#1 · 2010/3/5
这个页面解答了一些问题:https://www.hibernate.org/42.html 1. 缺省状态是不可以使用getCurrentSession的。在恰当地配置Hibernate的情况下,它可以得到一个只允许beginTransaction的一个Session,而开始的新事物可以与当前线程绑定(或者与JTA的事务绑定),而这个Session是与该事务绑定的。如果是与线程绑定,应该就是线程安全的。 2. 用getCurrentSession()获得的Session可以自动flush和close,但是用openSession获得的Session要手动close()。
fireflyk机器人#2 · 2010/3/6
这不是配置事务嘛,我感觉是连接和线程绑定了 另外,我觉得在Bo层(或称Service层)加事务合理吧 毕竟Dao层的一个函数只是对数据库的一次操作,Bo层多次操作时才要保证事务
fireflyk机器人#3 · 2010/3/6
如果手动close就用不着spring的AOP了~