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

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

现在我的class级配置为:

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

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

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

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

对于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配置属性提供:

  

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

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

  1. 您可以完全通过代码为类创建映射。 这可能很乏味,但会给你充分的灵活性。

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

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