0

我有一个使用 Hibernate 和 Tomcat 提供的 JPA 的 webapp。我没有 DI 框架,没有 Spring,没有 Guice,没有完整的 Java EE 应用服务器。

我需要 JPA 连接到两个不同的数据库。我像这样连接到第一个数据库:

EntityManagerFactory emf = Persistence.createEntityManagerFactory("mydb");
[...]
EntityManager em = emf.createEntityManager();

我在 persistence.xml 中声明了“mydb”持久性单元,并通过 JNDI 链接到它在 context.xml 中声明的资源。直到这里一切正常。

现在我需要连接到另一个数据库。我已将其添加到 persistence.xml 和 context.xml,并将持久性单元命名为“mydb2”。现在我假设我可以像这样使用它:

EntityManagerFactory emf2 = Persistence.createEntityManagerFactory("mydb2");
EntityManager em2 = emf2.createEntityManager();

Hibernate 配置为验证两个数据库上的类和表

<property name="hibernate.archive.autodetection" value="class, hbm"/>
<property name="hibernate.hbm2ddl.auto" value="validate"/>

在persistence.xml 中。但是,当我运行/调试 webapp 时,Hibernate 尝试验证 mydb 上属于 mydb2 的 @Entity 类,但显然失败了。现在有趣的是,如果我将 Hibernate 验证属性设置为“无”,我的应用程序确实可以正常工作并根据需要连接到正确的数据库......

有没有办法让 Hibernate 只验证属于它们各自数据库的类/表?

编辑:虽然可以在 @Table 注释中指定目录名称,但在我的情况下,这不是一个好的解决方案,因为我在生产中有多个此 webapp 的实例,并且每个实例都连接到一对不同的数据库。在投入生产之前被迫接触源代码是不好的。

4

1 回答 1

0

如果使用@javax.persistence.Table 注解,则可以使用目录参数来区分数据库。

编辑:尝试定义单独的 hibernate-cfg.xml 文件(称它们为 db1-hibernate-cfg.xml 和 db2-hibernate-cfg.xml)并在 xml 元素中使用该元素列出与该工厂对应的实体。您也可以在对应于 JPA 的 orm.xml 中定义这些。

然后在你的spring配置中明确定义哪个hibernate-cfg(或orm.xml)映射到哪个EntityManager:

使用 Spring 的 LocalContainerEntityManagerFactoryBean 的示例:

<bean id="emf" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="persistenceUnitManager" ref="pum" />
    <property name="persistenceUnitName" value="my-pu" />
    <property name="jpaProperties">
        <props>
            <prop key="hibernate.ejb.cfgfile">my-hibernate.cfg.xml</prop>
                            ... other configurations
                    </props>
 </bean>

如果你去定义单独的 orm.xml 文件,那么在你的 persistence-unit-manager 中,为每个实体管理器工厂(比如 db1-persistence.xml 和 db2 ..)定义一个单独的 persistence.xml 文件。在persistence.xml 文件中使用该元素来定义相应的orm.xml 文件。

这些文件的默认位置是类路径相关的。

于 2013-02-08T21:23:23.607 回答