当前位置: 首页 > 知识库问答 >
问题:

JPA/Hibernate:使用多个持久化单元生成模式

满伟彦
2023-03-14

我有一个应用程序,它使用位于两个不同数据库中的一组JPA实体。我配置了多个持久性单元。

问题是我想使用模式生成自动生成模式,所有实体都是在两个数据库中创建的。

我在这两方面都有:

        <property name="javax.persistence.schema-generation.database.action" value="drop-and-create"/>
        <property name="javax.persistence.schema-generation.create-source" value="metadata"/>
        <property name="javax.persistence.schema-generation.drop-source" value="metadata"/>

是的,我想使用元数据自动获取实体。我不想提供手动脚本,因为我需要使它与实体保持最新。

是否有方法标记由哪个PU生成的实体?

编辑:请注意,在@Table上添加“模式”属性并不能解决问题,因为每个PU将尝试在正确的模式中创建相同的实体,并且会有错误,因为表已经存在。

共有2个答案

通宾白
2023-03-14

我找到了一种方法:我将在@Table注释中为每个实体使用“模式”属性,然后我将只启用一个PU来自动生成表。

吴镜
2023-03-14

是的,你能做到。您需要列出每个持久单元下的实体,并通过显式禁用未列出实体的自动发现。

  <!--  Unit 1 -->
  <persistence-unit name="Unit1" transaction-type="RESOURCE_LOCAL">
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
    <class>com.your.class.A</class>

    <exclude-unlisted-classes>true</exclude-unlisted-classes>
    <properties>
      <property name="javax.persistence.jdbc.username" value=""/>
      <property name="javax.persistence.jdbc.password" value=""/>
      <property name="hibernate.hbm2ddl.auto" value="update"/>
      <property name="javax.persistence.schema-generation.database.action" value="drop-and-create"/>
      <property name="javax.persistence.schema-generation.create-source" value="metadata"/>
      <property name="javax.persistence.schema-generation.drop-source" value="metadata"/>
    </properties>
  </persistence-unit>

 <!--  Unit 2 -->
  <persistence-unit name="Unit2" transaction-type="RESOURCE_LOCAL">
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
    <class>com.your.class.B</class>

    <exclude-unlisted-classes>true</exclude-unlisted-classes>
    <properties>
      <property name="javax.persistence.jdbc.username" value=""/>
      <property name="javax.persistence.jdbc.password" value=""/>
      <property name="hibernate.hbm2ddl.auto" value="update"/>
      <property name="javax.persistence.schema-generation.database.action" value="drop-and-create"/>
      <property name="javax.persistence.schema-generation.create-source" value="metadata"/>
      <property name="javax.persistence.schema-generation.drop-source" value="metadata"/>
    </properties>
  </persistence-unit>

如果您使用的是注释配置,那么

LocalContainerEntityManagerFactoryBean lef = new LocalContainerEntityManagerFactoryBean();
lef.setPackagesToScan("com.A");

另一个工厂用于另一个具有不同包名的实体管理器。

 类似资料:
  • 我一直在尝试使用JPA Hibernate和mysql整理与我的DB的连接,但出于某种原因,无论我尝试什么,在启动tomcat服务器时,我都会遇到相同的异常: 这是我的JPA配置类: } 在这一点上,我想不出还有什么可以尝试的。。任何帮助都是非常感激的 编辑:这是整个堆栈跟踪

  • 最后的修正:由于Vlad的回答,我能够更新代码以使用以下内容(只需确保您还定义了bean):

  • 谢谢 ----更新----

  • 有没有办法将quarkus security jpa与多个持久性单元一起使用?JpaIdentityProvider似乎直接注入了实体管理器工厂,这导致了“javax.persistence.EntityManagerFactory类型的不满意依赖”的异常。 可能有解决办法吗? 有什么建议吗? 谢谢文森特

  • 问题内容: 我试图在spring启动时将JSON对象存储在MySQL数据库中。我知道我做错了事,但是我无法弄清楚到底是什么原因,因为我对Spring还很陌生。 我有一个休息端点,在这里我通过HTTP PUT获取以下JSON对象,并且需要将其存储在数据库中,以便用户以后可以通过HTTP GET获取它。 请注意,在上述情况下,对象 中* 键 的 数量 可能会有所不同,由于该要求,我正在使用a 来捕获控

  • 我有一个JavaEE项目,它使用多个持久性单元。有没有办法指定特定JPA实体所属的持久性单元?一些实体位于一个数据源中,而其他实体位于我的第二个数据源中。有没有一种方法可以通过注释来区分两者?