0

注意:虽然一开始很相似,但这不是重复使用 Spring、JPA 和 Hibernate 来访问 Jboss 中配置的多个数据库/数据源

亲爱的 Stackoverflow,

我有一个在 jboss-4.2.1.GA 上运行并使用单个数据库的带有休眠应用程序的 spring-jpa。

我现在将第二个 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 文件。

提前致谢

4

1 回答 1

1

有几种解决方案,具体取决于您如何将数据源绑定到 presistance 上下文、Spring 方式、JPA 方式或 Hibernate 方式......

春天

要将 spring/hibernate 应用程序链接到 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。您将需要创建 2 个(每个数据源一个)。他们需要在你的 spring 定义的 SessionFactory 中注入数据源。如果您使用 Spring 托管的 JPA 实体管理器,则可以使用相同的方法。

JPA

如果您使用的是 JPA(会话工厂是 hibernate 而不是 jpa...),您还可以在相应的 persistence.xml 文件中定义一个 jndi 数据源名称。

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

注入 entityManager 时需要使用 unitName 参数:

    @PersistenceContext(unitName="sample")  

休眠

对于 hibernate.cfg.xml 文件,您可以使用此属性指定 JNDI 数据源

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

应删除 database.property 以确保使用 jndi 数据源。

这些只是示例,最终结果将取决于您如何制作管道。

于 2012-08-01T10:05:34.383 回答