JPA(Hibernate)和"x2B ;;Tomcat+;两个不同的数据库

JPA(Hibernate)和"x2B ;;Tomcat+;两个不同的数据库,hibernate,jakarta-ee,tomcat,hbm2ddl,Hibernate,Jakarta Ee,Tomcat,Hbm2ddl,我有一个使用Hibernate和Tomcat提供的JPA的webapp。我没有DI框架,没有Spring,没有Guice,没有完整的JavaEE应用服务器 我需要JPA连接到两个不同的数据库。我像这样连接到第一个数据库: EntityManagerFactory emf = Persistence.createEntityManagerFactory("mydb"); [...] EntityManager em = emf.createEntityManager(); EntityManag

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

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

EntityManagerFactory emf = Persistence.createEntityManagerFactory("mydb");
[...]
EntityManager em = emf.createEntityManager();
EntityManagerFactory emf2 = Persistence.createEntityManagerFactory("mydb2");
EntityManager em2 = emf2.createEntityManager();
我在persistence.xml中声明了“mydb”持久化单元,并通过JNDI链接到context.xml中声明的资源。直到这里一切都正常

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

EntityManagerFactory emf = Persistence.createEntityManagerFactory("mydb");
[...]
EntityManager em = emf.createEntityManager();
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验证属性设置为“none”,我的应用程序就可以正常工作,并根据需要连接到正确的db

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


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

如果使用@javax.persistence.Table注释,可以使用catalog参数区分数据库

编辑:尝试定义单独的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>

my-hibernate.cfg.xml
... 其他配置
如果您选择定义单独的orm.xml文件,那么在持久性单元管理器中,为每个实体管理器工厂定义单独的persistence.xml文件(比如db1-persistence.xml和db2..)。 在persistence.xml文件中,使用元素定义相应的orm.xml文件


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

这样我就硬编码了目录名,但在部署之前我需要更改它,因为我在生产中有多个webapp实例,每个实例连接到一对不同的数据库(我将编辑我的问题以添加此详细信息)。这当然是可能的,但我认为不是一个好的解决方案。您有两个不同的bt hibernate.cfg.xml文件吗?我没有,我只有一个persistene.xml和一个context.xml.Edited答案建议单独的hibernate-cfg.xml谢谢,但是。。。这里没有春天(我问题的第一行)。没有弹簧,这是可能的吗?