【问题标题】:JPA / Hibernate : schema generation with multiple persistence unitsJPA / Hibernate:具有多个持久性单元的模式生成
【发布时间】:2015-05-22 15:23:14
【问题描述】:

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

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

我在两个 PU 中都有:

        <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生成哪个实体?

-edit:请注意,在@Table 上添加“schema”属性并不能解决问题,因为每个 PU 都会尝试在正确的 schema 中创建相同的实体,并且会出现错误,因为表已经存在.

【问题讨论】:

    标签: java hibernate jakarta-ee jpa


    【解决方案1】:

    是的,你可以这样做。您需要列出每个持久单元下的实体,并使用&lt;exclude-unlisted-classes&gt;true&lt;/exclude-unlisted-classes&gt; 明确禁用未列出实体的自动发现。

      <!--  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");
    

    以及另一个具有不同包名称的实体管理器的另一个工厂。

    【讨论】:

    • 您的答案似乎是正确的,但是,正如我所说,我不想使用 xml 中的任何脚本或配置手动指定实体。只是一些声明方式。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2021-04-19
      • 1970-01-01
      • 1970-01-01
      • 2013-02-15
      • 2018-05-11
      • 2011-04-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多