Java 如何在运行时配置JPA表名?
我有一个问题,我只有一个数据库可供使用,但我有多个服务器,我希望它们为每个服务器使用不同的表名 现在,我的类配置为:Java 如何在运行时配置JPA表名?,java,hibernate,jpa,orm,hibernate-mapping,Java,Hibernate,Jpa,Orm,Hibernate Mapping,我有一个问题,我只有一个数据库可供使用,但我有多个服务器,我希望它们为每个服务器使用不同的表名 现在,我的类配置为: @Entity @Table(name="loader_queue") class LoaderQueue 例如,我想让dev1服务器指向loader\u queue\u dev1表,而dev2服务器指向loader\u queue\u dev2表 有没有一种方法可以在使用或不使用注释的情况下实现这一点 我希望能够有一个单一的构建,然后在运行时使用系统属性之类的东西来更改表名。
@Entity
@Table(name="loader_queue")
class LoaderQueue
例如,我想让dev1服务器指向loader\u queue\u dev1表,而dev2服务器指向loader\u queue\u dev2表
有没有一种方法可以在使用或不使用注释的情况下实现这一点
我希望能够有一个单一的构建,然后在运行时使用系统属性之类的东西来更改表名。我不会这样做。这与JPA的初衷背道而驰,很可能会在未来引发问题。我宁愿在表中添加一层视图,提供应用程序使用的统一名称 但是你问了,所以你有一些想法如何工作:
对于Hibernate4.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"
/>
看看这里:最好在数据库中创建一个别名/同义词/视图,在每台服务器上都是相同的。感谢您提供的信息,我认为这是特定于hibernate的。另外,如何指定实体以使用此命名策略?现在我只有实体和表注释。我需要使用一些XML配置吗?或者它可以放在我的entity manager XML配置中的某个地方?它可以放在persistence.XML文件中,但它适用于所有实体。Hi@vladmin halcea:我们有一个用例,通过batch cmd line arg获得表后缀。我们认为我们可以尝试这种方法。这在Hibernate5中会起作用吗?现在有更好的方法吗?提前谢谢!