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的初衷背道而驰,很可能会在未来引发问题。我宁愿在表中添加一层视图,提供应用程序使用的统一名称

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

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

  • 您可以实现一个NamingStrategy,它将类名转换为表名,具体取决于运行它的实例

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


  • 对于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中会起作用吗?现在有更好的方法吗?提前谢谢!