我在构建的Spring-GWT应用程序中有一个特殊的问题。我们有一个以WE8ISO8859P1字符集编码的oracle DB,它不支持UTF-8。因此,我们正在AL32UTF8字符集中构建一个新的DB。不幸的是,DBA不希望将现有数据库迁移到新数据库,我们必须访问旧数据库以获取英语数据,并使用新数据库获取拉丁数据。
我们在方法/类级别有@Transactional注释,sessionFactory被注入DAO以连接到hibernate。当用户选择类似
的拉丁语时,我想重用这些@Transactional(changeThisDynamically)
,当用户在拉丁文/英文之间切换时,注入的TransactionManager和SessionFactory应该通过Ajax调用动态更改。
可以这样做吗?解决这个问题的最佳方法是什么?
第二个想法,我可以通过创建bean ApplicationContextAware来获得拉丁语会话工厂并在dao中设置它,但这是一个好方法吗?以及如何处理TransactionManager?
谢谢,
答案 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方法的返回类型可以帮助我确定我应该使用哪个数据源。