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

时间:2015-06-22 18:45:12

标签: java hibernate jpa orm hibernate-mapping

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

现在我的课程配置为:

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

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

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

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

2 个答案:

答案 0 :(得分:5)

对于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"
/>

答案 1 :(得分:2)

我不会这样做。它非常违反JPA的要求,很可能会引发问题。我宁愿在表中添加一层视图,提供应用程序使用的统一名称。

但是你问了,所以想一想它是如何运作的:

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

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

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