【问题标题】:JPA using variable Schema name in annotationsJPA 在注释中使用变量模式名称
【发布时间】:2014-10-27 19:50:09
【问题描述】:

我正在使用 Java Persistence API 来描述我将在我的代码中操作的数据库中的表。

但是,使用的 schema 并不相同,具体取决于我的项目的安装位置。所以,当我使用注释时,我希望 SCHEMA 字段是一个变量,但我做不到:

@Entity
@Table(name = "TABLE_NAME", schema = schemaVariable, catalog = "")

我怎样才能做到这一点? persistence.xml 文件可以吗?

【问题讨论】:

    标签: java hibernate jpa database-schema


    【解决方案1】:

    不,这是不可能的。您只能在注解中使用编译时常量(它们都是原语和String)。

    你可以使用 final 变量:

    public class DatabaseMetadata {
        public static final SCHEMA = "MySchema";
    }
    

    然后在注解中使用:

    @Table(name = "TABLE_NAME", schema = DatabaseMetadata.SCHEMA, catalog = "")
    

    但我认为这不是你想要的。

    PS。另一方面,可以找到在注释中使用即 Spring EL 的示例(请参阅@Value 注释),但这需要自定义注释处理器。 AFAIK 没有一个JPA 提供者给你这样的能力。

    【讨论】:

      【解决方案2】:

      恕我直言,任何时候将模式信息(如表、列、模式名称)放在 java 类中都是一个坏主意(如果您想在其他地方部署,则强制重新编译)。您可以将该信息放在orm.xml 中,然后根据您的部署要求部署不同的orm.xml

      至于persistence.xml,您将依赖于具有定义默认模式/目录的持久性属性的 JPA 提供程序。我知道 DataNucleus JPA(我使用的)有这个,但不知道 Hibernate

      【讨论】:

        【解决方案3】:

        如果您知道您将使用不同的架构,我建议使用 2 个映射文件并定义

        <entity-mappings> 
            <persistence-unit-metadata> 
               <persistence-unit-defaults> 
                  <schema>HR</schema> 
               </persistence-unit-defaults> 
            </persistence-unit-metadata> 
        ... 
        </entity-mappings> 
        

        通过这种方式,您将能够轻松更改架构,而无需更改应用程序代码。

        【讨论】:

        • 我应该在哪个文件中添加这个 xml ?以及如何将其与我的 persistence.xml 文件链接?
        • @SamyOmar 您在orm.xml 文件中定义它,该文件应与persistence.xml 位于同一文件夹(META-INF)中。如果要使用非默认名称,则需要通过mapping-file 元素将其注册到persistence.xml。有关详细信息,请参阅here
        猜你喜欢
        • 1970-01-01
        • 2012-06-26
        • 2011-04-22
        • 2016-04-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多