动态更改会话工厂和Txm Manager以支持I18N

时间:2011-11-25 11:18:26

标签: hibernate spring spring-transactions spring-orm

我在构建的Spring-GWT应用程序中有一个特殊的问题。我们有一个以WE8ISO8859P1字符集编码的oracle DB,它不支持UTF-8。因此,我们正在AL32UTF8字符集中构建一个新的DB。不幸的是,DBA不希望将现有数据库迁移到新数据库,我们必须访问旧数据库以获取英语数据,并使用新数据库获取拉丁数据。

我们在方法/类级别有@Transactional注释,sessionFactory被注入DAO以连接到hibernate。当用户选择类似

的拉丁语时,我想重用这些

@Transactional(changeThisDynamically)

,当用户在拉丁文/英文之间切换时,注入的TransactionManager和SessionFactory应该通过Ajax调用动态更改。

可以这样做吗?解决这个问题的最佳方法是什么?

第二个想法,我可以通过创建bean ApplicationContextAware来获得拉丁语会话工厂并在dao中设置它,但这是一个好方法吗?以及如何处理TransactionManager?

谢谢,

1 个答案:

答案 0 :(得分:1)

感谢您的帮助。我真正需要的是'AbstractRoutingDataSource' - 我通过执行以下操作来修复此问题

    <bean id="dataSource" class="com.myPackage.CustomRoutingDataSource">
   <property name="targetDataSources">
      <map key-type="com.myPackage.DBLocaleEnum">
         <entry key="English" value-ref="defaultDataSource"/>
         <entry key="Spanish" value-ref="latinDataSource"/>
      </map>
   </property>
   <property name="defaultTargetDataSource" ref="defaultDataSource"/>
</bean>

public class CustomRoutingDataSource extends AbstractRoutingDataSource {

@Override
protected Object determineCurrentLookupKey() {

    DBLocaleEnum localeType = LocaleContextHolder.getLocaleType();
    return localeType;
}

determineCurrentLookupKey方法的返回类型可以帮助我确定我应该使用哪个数据源。