一尘不染

如何在运行时配置JPA表名?

hibernate

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

现在,我的班级配置为:

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

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

有没有可以使用注释或不使用注释的方法?

我希望能够拥有一个单一的构建,然后在运行时使用诸如系统属性之类的东西来更改该表名。


阅读 452

收藏
2020-06-20

共1个答案

一尘不染

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

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"
/>
2020-06-20