使用两个事务管理器和会话工厂,使用spring&休眠注释 [英] Using two transaction managers and session factories with spring & hibernate annotations
问题描述
我在applicationContext中定义了两个事务管理器,引用了两个完全不同的sessionFactory。我正在尝试对其中一个transactionmanagers使用注释,但它似乎将所有注释应用于这两个事务管理器。
我要迁移到的新db有< property name =hbm2ddl.auto> create< / property>
,另一个从< property name =hbm2ddl。我使用
@Entity $注释了我的新域对象。 c $ c> 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&休眠注释的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!