【问题标题】:JPA using multiple database schemas使用多个数据库模式的 JPA
【发布时间】:2010-11-21 01:05:43
【问题描述】:

我在使用 JPA/Spring 的一个特定问题上遇到了一些麻烦:

如何将架构动态分配给实体?

我们有属于架构 AD 的 TABLE1 和属于 BD 的 TABLE2。

@Entity
@Table(name = "TABLE1", schema="S1D")
...

@Entity
@Table(name = "TABLE2", schema="S2D")
...

模式可能不会硬编码在注释属性中,因为它取决于环境(Dev/Acc/Prd)。 (接受的模式是 S1A 和 S2A)

我怎样才能做到这一点?是否可以像这样指定某种占位符:

@Entity
@Table(name = "TABLE1", schema="${schema1}")
...

@Entity
@Table(name = "TABLE2", schema="${schema2}")
...

以便根据驻留在环境中的属性文件替换架构?

干杯

【问题讨论】:

    标签: java database spring jpa schema


    【解决方案1】:

    我遇到了同样的问题,我用persistence.xml解决了这个问题,我在其中引用了我声明的db shema中所需的orm.xml文件

    <persistence
    xmlns="http://java.sun.com/xml/ns/persistence"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
    version="2.0" >
    <persistence-unit name="schemaOne">
        . . .
        <mapping-file>ormOne.xml</mapping-file>
        . . .
    </persistence-unit>
    
    <persistence-unit name="schemaTwo">
        . . .
        <mapping-file>ormTwo.xml</mapping-file>
        . . .
     </persistence-unit>
    </persistence>
    

    现在您可以为您的特殊架构创建一个 EntityManagerFactory

    EntityManagerFactory emf = Persistence.createEntityManagerFactory("schemaOne");
    

    【讨论】:

    • 如果 ormOne 和 OrmTwo 之间有关系呢?
    【解决方案2】:

    如果您知道部署时可以做的一件事是拥有 2 个 orm.xml 文件。一个用于 schema1,一个用于 schema2,然后在 persistence.xml 中定义了 2 个持久性单元。如果需要更改架构等内容,则添加注释是一种反模式

    【讨论】:

      【解决方案3】:

      尝试以下操作:

      puplic class MyClass {
        public static final String S1D="S1D";
        public static final String S2D="S2D";
      }
      
      @Entity
      @Table(name = "TABLE1", schema=MyClass.S1D)
      ...
      
      @Entity
      @Table(name = "TABLE2", schema=MyClass.S2D)
      ...
      

      【讨论】:

      • 我可以知道随着每个环境中架构名称的变化,该解决方案将如何适用于不同的环境吗?
      【解决方案4】:

      您可以在 context.xml 中有两个 DataSource 声明(每个模式一个),并使用此数据源定义两个持久性单元。不同环境的应用服务器上的 context.xml 可能会有所不同。

      【讨论】:

        【解决方案5】:

        当您创建数据源时,您可以初始化连接以使用不同的架构

        例如对于网络逻辑

        Specify default schema for JDBC pool in weblogic/oracle

        【讨论】:

          【解决方案6】:

          注解参数必须是最终的,因此不能在运行时更改。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-10-27
            • 2021-08-04
            • 1970-01-01
            • 2012-04-11
            • 1970-01-01
            • 2018-11-18
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多