2012-08-01 95 views
0

注:虽然在第一相似,这不是Using Spring, JPA with Hibernate to access multiple databases/datasources configured in Jboss弹簧休眠JPA和JBoss - 对象保存到第二个数据库

亲爱的#1的重复,

我有一个弹簧JPA与Hibernate的应用在jboss-4.2.1.GA上运行并使用单个数据库。

我现在有第二个spring-hibernate项目与上述项目捆绑在同一个ear文件中,但它需要使用第二个数据库。第二个hibernate/spring项目使用database.properties和hibernate.cfg.xml文件进行设置。

两个数据库的详细信息都存储在JBoss上的Oracle-ds.xml文件:

<datasources> 
    <local-tx-datasource> 
     <jndi-name>DefaultDS</jndi-name> 
     ... 
    </local-tx-datasource> 
    <local-tx-datasource> 
     <jndi-name>SecondDS</jndi-name> 
     ... 
    </local-tx-datasource> 
</datasources> 

我的问题是,在第二个项目,与第二个数据库对象,而不是第一个,我怎么能为第二个数据库调用sessionFactory,其细节存储在oracle-ds.xml中而不是使用database.properties文件? 我见过一个例子调用

@Resource(mappedName = "java:SecondDS") 
private DataSource secondDS; 
... 
java.sql.Connection conn = secondDS.getConnection(); 

如果它是很容易获得的连接,这只是准备语句是有用的,我怎么能在这个SessionFactory的弄个?有没有类似的方法?

我看到的所有例子都是指database.properties而不是jboss ds.xml文件。

在此先感谢

回答

1

有几种解决方案,这取决于你如何将数据源绑定到presistance背景下,春节的方式,JPA方式或休眠方式....

要连结春/休眠应用到JNDI数据源,您将需要使用的JndiObjectFactoryBean

<bean id="serverDataSource" class="org.springframework.jndi.JndiObjectFactoryBean"> 
    <property name="jndiName" value="java:comp/env/jdbc/blah"/> 
    <property name="proxyInterface" value="javax.sql.DataSource"></property> 
</bean> 

这样你就有了一个代表JNDI数据源的spring bean。您需要创建其中的两个(每个数据源一个)。他们需要在Spring中定义的SessionFactory中注入数据源。如果您使用Spring托管的JPA实体管理器,也可以使用它。

JPA

如果你正在使用JPA(会话工厂是不冬眠JPA ...),您也可以在相应的persistance.xml文件中定义的JNDI数据源名称。

<persistence-unit name="sample"> 
    <jta-data-source>java:/DefaultDS</jta-data-source> 
    ... 
</persistence-unit> 

您需要使用的unitName参数注入EntityManager的时候:

@PersistenceContext(unitName="sample") 

休眠

对于hibernate.cfg。xml文件,你可以用这个属性

<property name="connection.datasource">java:/comp/env/jdbc/MyDB</property> 

的database.property应该被删除,以确保在JNDI数据源,使用指定JNDI数据源。

这些只是一个例子,最终的结果将取决于你如何制作管道。

+0

谢谢Kazaag,我已经看过如何访问主数据库,并采取JPA方法。因此,我将采取同样的方法。 – 2012-08-03 09:39:34