【问题标题】:How to overwrite JPA entity's @Table.catalog value?如何覆盖 JPA 实体的 @Table.catalog 值?
【发布时间】:2015-08-26 12:53:00
【问题描述】:

当我使用 IntelliJ 从现有数据库模式生成持久性映射时,它会将 catalog 值作为 @Table 注释的一部分。不幸的是,数据库实例的名称中包含 dev/test/prod 环境的名称,虽然我可以用传递给EntityManagerFactory 的映射覆盖连接字符串,但在对BAR_TEST 实例执行查询时,我仍然得到Invalid object name 'BAR_DEV.dbo.FOO'

我是否可以在运行时动态覆盖catalog 值而不进行全局搜索和替换以在实体生成后手动删除它?

@Entity
@Table(name = "FOO", schema = "dbo", catalog = "BAR_DEV")
public class Foo{ /* ... */ }

【问题讨论】:

标签: java jpa intellij-idea eclipselink


【解决方案1】:

不,直接使用标准 JPA 是不可能的。

但是,我在项目中使用的解决方案是定义多个持久性单元,每个都针对特定环境。您可以覆盖 orm.xml 文件中的任何数据库映射,甚至可以为所有实体设置默认目录或架构。下一步是动态检索正确的 EntityManager - 如果您使用的是 Java EE,我建议使用 @Inject 进行注入并创建一个生产者,该生产者返回特定环境的特定 EM。

【讨论】:

    【解决方案2】:

    不可移植,仅限 Eclipselink org.eclipse.persistence.dynamic.DynamicHelper.SessionCustomizer 可以在运行时替换许多默认值。

    编辑:我还没有为你准备好代码。我用这种方式

        public void customize(Session session) throws SQLException {
            ...
        for (ClassDescriptor descriptor : session.getDescriptors().values()) {
    
                    if (!descriptor.getTables().isEmpty() && descriptor.getAlias().equalsIgnoreCase(descriptor.getTableName())) {
                tableName = TABLE_PREFIX + clazz.getSimpleName();
      descriptor.setTableName(tableName);
        }
        }
    

    【讨论】:

      猜你喜欢
      • 2013-08-02
      • 2011-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-22
      • 2013-06-05
      • 2017-11-29
      相关资源
      最近更新 更多