Java JPA(Hibernate)和自定义表前缀

Java JPA(Hibernate)和自定义表前缀,java,hibernate,jpa,Java,Hibernate,Jpa,是否可以在JPA/Hibernate中重写表名,以便为所有项目实体添加公共前缀?例如,可以通过“JBPM5_389;”前缀为所有JBPM5表添加前缀 接受答案的示例: public class JBPM5NamingStrategy extends ImprovedNamingStrategy { public String classToTableName(String className) { return StringHelper.unqualify(className)

是否可以在JPA/Hibernate中重写表名,以便为所有项目实体添加公共前缀?例如,可以通过“JBPM5_389;”前缀为所有JBPM5表添加前缀

接受答案的示例:

public class JBPM5NamingStrategy extends ImprovedNamingStrategy {
   public String classToTableName(String className) {
      return StringHelper.unqualify(className);
   }
   public String propertyToColumnName(String propertyName) {
      return propertyName;
   }
   public String tableName(String tableName) {
      return "JBPM5_" + tableName;
   }
   public String columnName(String columnName) {
      return columnName;
   }
   public String propertyToTableName(String className, String propertyName) {
      return "JBPM5_" + classToTableName(className) + '_'
         + propertyToColumnName(propertyName);
   }
}

一次重命名所有表的一种方法是实现您自己的namingStrategy(实现
org.hibernate.cfg.namingStrategy

使用的NamingStrategy在persistence.xml中由指定

<property name="hibernate.ejb.naming_strategy"
          value="com.example.MyNamingStrategy" />

使用一个。这应该正好提供您所需要的

摘自上一答案:

下面是一个示例NamingStrategy 生成表单的表名 类型1\u类型2用于联接表并添加 所有表的通用前缀:


在Hibernate 5中您仍然需要自己实现此行为。然而,现在有一种隐式和物理命名策略

这是使用Hibernate 5为表名添加前缀的示例性实现:

package my.app;

import org.hibernate.boot.model.naming.Identifier;
import org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl;
import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment;

public class PrefixPhysicalNamingStrategy extends PhysicalNamingStrategyStandardImpl {

    /**
     * TODO Make this an injectable application property
     */
    public static final String TABLE_NAME_PREFIX = "MY_PREFIX_";

    @Override
    public Identifier toPhysicalTableName(Identifier name, JdbcEnvironment context) {
        Identifier newIdentifier = new Identifier(TABLE_NAME_PREFIX + name.getText(), name.isQuoted());
        return super.toPhysicalTableName(newIdentifier, context);
    }
}
使用Spring Boot 2的此配置属性激活物理命名策略:

spring.jpa.hibernate.naming.physical-strategy: my.app.PrefixPhysicalNamingStrategy
 

你的意思是除了
@Table
注释之外?是的,除了Table注释之外。我实际上是指一个第三方项目,所以只有配置是可行的(我不能接触编译过的java源代码)。而且,在单个类+1上使用注释实现站点范围的策略是乏味和容易出错的,从来都不知道NamingStrategy,你每天都会学到新的东西!这是一种特定于冬眠的东西。它不适用于其他JPA提供商感谢他们的努力,所以回答很冗长,肖恩。但实际上,Ralph获得了关于如何通过持久性配置注入策略的信息。因此,对我来说,这是一个更完整的答案。@Michał当然,给拉尔夫打勾,但我在前面的答案中也显示了我链接到的配置。别误会,肖恩。我认为你的答复在内容上要好得多。谢谢,这对我帮助很大。但是拉尔夫的回答更充分地解决了这个问题。有人能编辑并粘贴一个例子到这个答案上吗?
spring.jpa.hibernate.naming.physical-strategy: my.app.PrefixPhysicalNamingStrategy