【问题标题】:How do I configure JPA table name at runtime?如何在运行时配置 JPA 表名?
【发布时间】:2015-09-08 08:24:03
【问题描述】:

我有一个问题,我只有一个数据库可以使用,但我有多个服务器,我希望它们为每个服务器使用不同的表名。

现在我的班级配置为:

@Entity
@Table(name="loader_queue")
class LoaderQueue

例如,我希望能够让 dev1 服务器指向 loader_queue_dev1 表,而 dev2 服务器指向 loader_queue_dev2 表。

有没有办法我可以使用或不使用注释来做到这一点?

我希望能够进行一次构建,然后在运行时使用系统属性之类的东西来更改表名。

【问题讨论】:

  • 看这里:link
  • 最好的办法是在数据库中创建一个别名/同义词/视图,在每台服务器上都相同。

标签: java hibernate jpa orm hibernate-mapping


【解决方案1】:

对于 Hibernate 4.x,您可以使用 custom naming strategy 在运行时动态生成表名。服务器名称可以由系统属性提供,因此您的策略可能如下所示:

public class ServerAwareNamingStrategy extends ImprovedNamingStrategy {

    @Override
    public String classToTableName(String className) {
        String tableName = super.classToTableName(className);
        return resolveServer(tableName);
    }

    private String resolveServer(String tableName) {
        StringBuilder tableNameBuilder = new StringBuilder();

        tableNameBuilder.append(tableName);
        tableNameBuilder.append("_");
        tableNameBuilder.append(System.getProperty("SERVER_NAME"));

        return tableNameBuilder.toString();
    }
}

并将命名策略作为 Hibernate 配置属性提供:

<property 
    name="hibernate.ejb.naming_strategy" 
    value="my.package.ServerAwareNamingStrategy"
/>

【讨论】:

  • 感谢您的信息,我认为这是特定于休眠的。另外,如何指定我的实体以使用此命名策略?现在我只有实体和表注释。我需要使用一些 XML 配置吗?或者它可以放在我的实体管理器 XML 配置中的某个地方吗?
  • 它可以放在persistence.xml文件中,但它适用于所有实体。
  • 嗨 @VladMihalcea:我们有一个用例,我们通过批处理 cmd 行 arg 获取表后缀。我们认为我们可以尝试这种方法。这会在 Hibernate 5 中工作吗?现在有更好的方法吗?提前谢谢..!
【解决方案2】:

我不会这样做。这与 JPA 的本质背道而驰,并且很可能会在未来引发问题。我宁愿在表中添加一层视图,以提供您的应用程序使用的统一名称。

但是你问了,所以有一些想法它是如何工作的:

  1. 您也许可以完全通过代码为您的类创建映射。这可能很乏味,但为您提供了充分的灵活性。

  2. 您可以实现一个 NamingStrategy,它将您的类名转换为表名,并取决于它所运行的实例。

  3. 您可以在构建过程中更改代码以从一个来源构建两个(或更多)工件。

【讨论】:

    猜你喜欢
    • 2013-09-26
    • 2012-05-19
    • 1970-01-01
    • 1970-01-01
    • 2010-10-28
    • 1970-01-01
    • 1970-01-01
    • 2019-03-10
    • 1970-01-01
    相关资源
    最近更新 更多