使用两个事务管理器和会话工厂,使用spring&休眠注释 [英] Using two transaction managers and session factories with spring & hibernate annotations

查看:125
本文介绍了使用两个事务管理器和会话工厂,使用spring&休眠注释的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在applicationContext中定义了两个事务管理器,引用了两个完全不同的sessionFactory。我正在尝试对其中一个transactionmanagers使用注释,但它似乎将所有注释应用于这两个事务管理器。



我要迁移到的新db有< property name =hbm2ddl.auto> create< / property> ,另一个从< property name =hbm2ddl。我使用 @Entity hibernate正在试图验证传统数据库上的这些类,我认为我已经设置为忽略注释(通过不指定注释)。以下是appContext的相关代码片段:

 < tx:annotation-driven transaction-manager =transactionManager1/> 
< context:property-placeholder location =file:$ {catalina.home} /conf/database.propertiesignore-unresolvable =true/>

< bean id =sessionFactory1class =org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBeanp:dataSource-ref =dataSource1p:configLocation =WEB-INF / classes /hibernate.cfg.xmlp:packagesToScan =com.mycompany/>

<! - 声明具有池化功能的数据源 - >
< bean id =dataSource1class =com.mchange.v2.c3p0.ComboPooledDataSource
p:driverClass =$ {app.driverClassName}p:jdbcUrl =$ {app.url }
p:user =$ {app.username}p:password =$ {app.password}

<! - 声明一个事务管理器 - >
< bean id =transactionManager1class =org.springframework.orm.hibernate3.HibernateTransactionManagerp:sessionFactory-ref =sessionFactory1/>

以及相同appContext中的遗留数据库:

 < bean id =sessionFactory2class =org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBeanp:dataSource-ref =dataSource2p:configLocation =WEB- INF / classes / hibernateTraveller.cfg.xmlp:packagesToScan =com.mycompany/> 

<! - 声明具有池化功能的数据源 - >
p:driverClass =$ {app2.driverClassName}p:jdbcUrl =$ {app2.url}
p:user =$ {app2.username}p:password =$ {app2.password}

<! - Declare交易管理器 - >
< bean id =transactionManager2class =org.springframework.orm.hibernate3.HibernateTransactionManager
p:sessionFactory-ref =sessionFactoryTraveller>
< qualifier value =legacyDB/>
< / bean>

任何指针?

解决方案

您应该使用 LocalSessionFactoryBean 而不是 AnnotationSessionFactoryBean 为您的遗留数据库不使用注释。 AnnotationSessionFactoryBean的全部用途是使用注释。如果你不想使用注释,LocalSessionFactoryBean是要走的路。


I have two transactions managers defined in applicationContext, referencing two completely different sessionFactories. I am attempting to use annotations with one of the transactionmanagers however it seems to be applying all annotations to both transaction managers.

The new db I am migrating to has <property name="hbm2ddl.auto">create</property> and the other which I am migrating from has <property name="hbm2ddl.auto">validate</property>

I have annotated my new domain objects with @Entity hibernate is attempting to validate these classes on the legacy database, which I thought I had set up to ignore annotations (by not specifying annotations). Here are the relevant snippets of appContext:

    <tx:annotation-driven transaction-manager="transactionManager1" />
    <context:property-placeholder location="file:${catalina.home}/conf/database.properties" ignore-unresolvable="true"/>

    <bean id="sessionFactory1" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean" p:dataSource-ref="dataSource1" p:configLocation="WEB-INF/classes/hibernate.cfg.xml" p:packagesToScan="com.mycompany"/>

<!-- Declare a datasource that has pooling capabilities-->   
<bean id="dataSource1" class="com.mchange.v2.c3p0.ComboPooledDataSource" 
p:driverClass="${app.driverClassName}" p:jdbcUrl="${app.url}" 
p:user="${app.username}" p:password="${app.password}"

    <!-- Declare a transaction manager-->
    <bean id="transactionManager1" class="org.springframework.orm.hibernate3.HibernateTransactionManager" p:sessionFactory-ref="sessionFactory1" />

and the legacy db in same appContext :

<bean id="sessionFactory2" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"    p:dataSource-ref="dataSource2" p:configLocation="WEB-INF/classes/hibernateTraveller.cfg.xml" p:packagesToScan="com.mycompany"/>

<!-- Declare a datasource that has pooling capabilities-->   
<bean id="dataSource2" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close" 
p:driverClass="${app2.driverClassName}" p:jdbcUrl="${app2.url}" 
p:user="${app2.username}" p:password="${app2.password}"

<!-- Declare a transaction manager-->
<bean id="transactionManager2" class="org.springframework.orm.hibernate3.HibernateTransactionManager" 
            p:sessionFactory-ref="sessionFactoryTraveller"> 
<qualifier value="legacyDB"/>
</bean>

any pointers ?

解决方案

You should use LocalSessionFactoryBean instead of AnnotationSessionFactoryBean for your legacy database that does not use annotations. The whole purpose of the AnnotationSessionFactoryBean is to use annotations. If you don't want to use annotations, LocalSessionFactoryBean is the way to go.

这篇关于使用两个事务管理器和会话工厂,使用spring&amp;休眠注释的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆