我正在将一个旧的遗留应用程序迁移到Spring。在当前遗留代码的数据访问层中,有一个BaseDataAccessor。此数据访问器通过一种方法提供sessionFactory的引用。为了满足交付日期,我必须保持这个结构相同,为此我需要在BaseDataAccessor中引用Hibernate SessionFactory。
我可以通过实现ApplicationContextAware来获取org.springframework.orm.hibernate4.LocalSessionFactoryBean的引用,但我无法将其转换为SessionFactory。有没有办法做到这一点?
由于
答案 0 :(得分:7)
LocalSessionFactoryBean
创建SessionFactory
:
@Bean
public LocalSessionFactoryBean sessionFactory() {
LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();
sessionFactory.setDataSource(dataSource());
sessionFactory.setPackagesToScan(new String[] { "my.packages" });
sessionFactory.setHibernateProperties(hibernateProperties());
return sessionFactory;
}
然后你可以像他一样注射SessionFactory
:
@Autowired
SessionFactory sessionFactory;
答案 1 :(得分:2)
如果使用XML配置,它应如下所示:
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="${hibernate.connection.driver.class}"/>
<property name="url" value="${hibernate.connection.url}"/>
<property name="username" value="${hibernate.connection.username}"/>
<property name="password" value="${hibernate.connection.password}"/>
</bean>
<bean id="sessionFactory"
class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="packagesToScan" value="com.example.mypojo"/>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">${hibernate.dialect}</prop>
<prop key="hibernate.current_session_context_class">thread</prop>
</props>
</property>
</bean>
<bean id="transactionManager"
class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
之后你只需要在其他xml文件或@Qualifier注释中注入sessionFactory bean。