如何在运行时配置 JPA table 名称?

How do I configure JPA table name at runtime?

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

现在我的 class 配置为:

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

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

有没有办法在使用或不使用注释的情况下做到这一点?

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

我不会这样做。它非常违背 JPA 的原则,很可能会在以后引起问题。我宁愿在 table 中添加一层视图,以提供供您的应用程序使用的统一名称。

但是你问了,所以想知道它是如何工作的:

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

  2. 您可以实施一个 NamingStrategy,将您的 class 名称转换为 table 名称,并取决于它所在的实例 运行。

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

对于 Hibernate 4.x,您可以使用在运行时动态生成 table 名称的 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"
/>