如何在运行时配置 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 中添加一层视图,以提供供您的应用程序使用的统一名称。
但是你问了,所以想知道它是如何工作的:
您可以完全通过代码为 classes 创建映射。这可能很乏味,但为您提供了充分的灵活性。
您可以实施一个 NamingStrategy,将您的 class 名称转换为 table 名称,并取决于它所在的实例 运行。
您可以在构建过程中更改代码以从一个来源构建两个(或更多)工件。
对于 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"
/>
我有一个问题,我只有一个数据库可以使用,但我有多个服务器,我希望它们为每个服务器使用不同的 table 名称。
现在我的 class 配置为:
@Entity
@Table(name="loader_queue")
class LoaderQueue
例如,我希望能够让 dev1 服务器指向 loader_queue_dev1 table,而 dev2 服务器指向 loader_queue_dev2 table。
有没有办法在使用或不使用注释的情况下做到这一点?
我希望能够进行一次构建,然后在运行时使用系统 属性 之类的东西来更改 table 名称。
我不会这样做。它非常违背 JPA 的原则,很可能会在以后引起问题。我宁愿在 table 中添加一层视图,以提供供您的应用程序使用的统一名称。
但是你问了,所以想知道它是如何工作的:
您可以完全通过代码为 classes 创建映射。这可能很乏味,但为您提供了充分的灵活性。
您可以实施一个 NamingStrategy,将您的 class 名称转换为 table 名称,并取决于它所在的实例 运行。
您可以在构建过程中更改代码以从一个来源构建两个(或更多)工件。
对于 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"
/>