JPA使用多个数据库模式

时间:2009-08-19 17:18:50

标签: java database spring jpa schema

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

如何动态地将模式分配给实体?

我们有TABLE1属于架构AD,而TABLE2属于BD。

@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}")
...

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

干杯

6 个答案:

答案 0 :(得分:10)

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

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

答案 1 :(得分:2)

如果您在部署时知道要做的事情就是拥有2个orm.xml文件。一个用于schema1,另一个用于schema2,然后在persistence.xml中定义了2个持久性单元。如果需要更改模式

之类的东西,那么放置注释是一种反模式

答案 2 :(得分:2)

请尝试以下操作:

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)
...

答案 3 :(得分:1)

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

答案 4 :(得分:1)

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

e.g。对于weblogic

Specify default schema for JDBC pool in weblogic/oracle

答案 5 :(得分:0)

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