我正在使用Spring配置来测试Spring-Hibernate Transactions。
<beans ...>
<tx:annotation-driven transaction-manager="transactionManager"/>
<bean id="transactionManager"
class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<!-- hibernate 4 onwards annotationsessionfactorybean is replaced with localsessionfactory bean -->
<bean id="sessionFactory"
class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="annotatedClasses">
<list>
<value>com.fg.arch.test.transaction.Foo</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
<prop key="hibernate.current_session_context_class">thread</prop>
<!-- <prop key="hibernate.current_session_context_class">org.hibernate.context.internal.ThreadLocalSessionContext</prop> -->
</props>
</property>
</bean>
</beans>
我的服务图层使用@Transactional
注释。
这是我的DAO:
public class FooHibernateDaoImpl implements FooDao {
private SessionFactory sessionFactory;
public void testFoo(Foo foo) throws Throwable {
System.out.println(" --- ");
sessionFactory.openSession().save(foo);
}
public void setSessionFactory(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}
}
使用openSession()
方法明确打开会话不会导致问题,但是当我更改为getCurrentSession()
时,我会收到异常。
我有两个问题。
openSession()
是一种好习惯。getCurrentSession()
工作,以便它不会给我一个例外,例如没有活动交易?感谢。
答案 0 :(得分:2)
回答你的问题:
不,不是。应该在调用@Transactional
的服务类方法上的testFoo()
注释正在为您打开会话。您应该在DAO中使用getCurrentSession()
来获得此会话。
你可以,但你不应该。这就是使用基于注释的事务管理的Hibernate SessionFactory
的全部要点。只要您将服务方法标记为交易方式,就不会有问题。
作为旁注,为什么不自动装配SessionFactory
?不要使用setter设置应该自动装配的东西。否则你也可以不使用Spring。