【问题标题】:OpenJPA schema configurationOpenJPA 模式配置
【发布时间】:2011-01-14 20:52:58
【问题描述】:

我在带有 DB2 的 WebSphere 上使用 OpenJPA 1.2.3。 有没有办法构建和捆绑我的应用程序,允许同一个应用程序 (EAR) 根据环境(DEV、ACPT、PROD 等)更改架构名称。

我的 PU 设置为容器管理,如下所示:

<persistence>
    <persistence-unit name="My_PU" transaction-type="JTA">
            <jta-data-source>jdbc/DataSource</jta-data-source>
            ...
            <properties>
                    <property name="openjpa.jdbc.Schema" value="MYSCHEMA"/>
                    <property name="openjpa.TransactionMode" value="managed"/>
                    <property name="openjpa.ConnectionFactoryMode" value="managed"/>
            </properties>
    </persistence-unit>
</persistence>

我已经考虑将它放在 ORM.xml 中,但这仍然是模式的静态值,并且不会将设置外部化;此外,它似乎不起作用(我已经看到很多讨论这个问题的线程)。我也考虑过将此配置放入 WebSphere 数据源;这似乎也不起作用。

--基思

【问题讨论】:

    标签: jpa openjpa


    【解决方案1】:

    我不熟悉 OpenJPA,但我猜 openjpa.jdbc.Schema 属性是可选的。数据源(即jdbc/DataSource 的数据源)将指示使用的默认架构。

    您是否尝试过不使用该属性?

    【讨论】:

    • @Keith:好的,发生了什么?帮帮我,在这里。
    【解决方案2】:

    你可以使用maven。

    1-在项目 pom 文件或 maven 设置中为每个构建场景定义配置文件。

        <profiles>
            <profile>
                <id>DEV Profile</id>
                <activation>
                    <activeByDefault>true</activeByDefault>
                </activation>
                <propertis>
                    <db-schema>DEVSCHEMA</db-schema>
                </propertis>
            </profile>
    
            <profile>
                <id>PROD Profile</id>
                <activation>
                    <activeByDefault>false</activeByDefault>
                </activation>
                <propertis>
                    <db-schema>PRODSCHEMA</db-schema>
                </propertis>
            </profile>
        </profiles>
    

    2- 更改您的 persistence.xml 如下:

        <persistence>
            <persistence-unit name="persistent-unit" transaction-type="JTA">
                    <jta-data-source>jdbc/DataSource</jta-data-source>
                    ...
                    <properties>
                            <property name="openjpa.jdbc.Schema" value="${db-schema}"/>
                            <property name="openjpa.TransactionMode" value="managed"/>
                            <property name="openjpa.ConnectionFactoryMode" value="managed"/>
                    </properties>
            </persistence-unit>
        </persistence>
    

    3- 将以下行放入项目 pom 文件中。

        <build>        
            <resources>
                <resource>
                    <directory>src/main/resources/META-INF</directory>
                    <filtering>true</filtering>
                    <targetPath>/META-INF</targetPath>
                </resource>
            </resources>
        </build>
    

    【讨论】:

      【解决方案3】:

      我只是创建单独的 &lt;persistence-unit&gt; 元素,然后动态选择要绑定的元素。
      例如:

      <persistence>
          <persistence-unit name="DEV_PU" transaction-type="JTA">
                  <jta-data-source>jdbc/DataSource</jta-data-source>
                  ...
                  <properties>
                          <property name="openjpa.jdbc.Schema" value="DEVSCHEMA"/>
                          <property name="openjpa.TransactionMode" value="managed"/>
                          <property name="openjpa.ConnectionFactoryMode" value="managed"/>
                  </properties>
          </persistence-unit>
          <persistence-unit name="PROD_PU" transaction-type="JTA">
                  <jta-data-source>jdbc/DataSource</jta-data-source>
                  ...
                  <properties>
                          <property name="openjpa.jdbc.Schema" value="PRODSCHEMA"/>
                          <property name="openjpa.TransactionMode" value="managed"/>
                          <property name="openjpa.ConnectionFactoryMode" value="managed"/>
                  </properties>
          </persistence-unit>
      </persistence>
      

      【讨论】:

        【解决方案4】:

        您可以像这样在代码中动态设置架构名称:

        @Entity
        @Table(name = "ITEM", schema=Item.SCHEMA)
        public class Item implements Serializable {
        
            public static final String SCHEMA = System.getProperty("env.schema");
        
            @Id
            @Column (name = "ITEM_ID")
            private String id;
        
            @Column (name = "ITEM_NAME")
            private String name;
        }
        

        【讨论】:

        • 我认为这行不通,属性值必须是常量:(
        猜你喜欢
        • 2012-01-16
        • 2017-03-01
        • 2012-05-02
        • 1970-01-01
        • 2015-01-27
        • 2018-06-04
        • 1970-01-01
        • 2023-04-09
        • 2012-05-30
        相关资源
        最近更新 更多