动态更改会话工厂和 Txm 管理器以支持 I18N

发布于 2024-12-17 21:06:29 字数 560 浏览 1 评论 0原文

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

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

@Transactional(changeThisDynamically)

时,我想重用这些,即,当用户在拉丁语/英语之间切换时,注入的 TransactionManager 和 SessionFactory 应该通过 Ajax 调用动态更改。

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

再想一想,我可以通过创建 bean ApplicationContextAware 来获取拉丁会话工厂并将其设置在 dao 中,但这是一个好方法吗?我该如何处理 TransactionManager ?

谢谢,

I have a peculiar issue here in the Spring-GWT application we are building. We have an oracle DB encoded in WE8ISO8859P1 character set which doesn't support UTF-8 . Hence we are building a new DB in AL32UTF8 char set . Unfortunately the DBAs do not want to migrate the existing DB to the new DB and we have to reach the old DB for the English data and the new DB for the Latin data .

We have @Transactional annotations at method/class level and the sessionFactory is injected into the DAO to connect to hibernate. I want to reuse these when user selects latin something like

@Transactional(changeThisDynamically)

i.e, the TransactionManager and SessionFactory injected should change dynamically via an Ajax call when the user switches between Latin/English.

Can this be done? What is is the best approach to resolve this ?

On second thought, I could get the Latin session factory by making the bean ApplicationContextAware and set this in the dao but but is this a good approach ? and what do I do with the TransactionManager ?

Thanks,

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

酒与心事 2024-12-24 21:06:29

感谢您的帮助。我真正需要的是一个“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;
}

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

Thanks for all your help. What I really needed was an 'AbstractRoutingDataSource' - I fixed this by doing the following

    <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;
}

The return type of determineCurrentLookupKey method helps me determine which datasource I should be using .

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文