JPA (Hibernate) и пользовательские префиксы таблиц - PullRequest
11 голосов
/ 30 ноября 2010

Можно ли переопределить имена таблиц в JPA / Hibernate, чтобы добавить общий префикс для всех объектов проекта?Например, чтобы иметь возможность префиксом всех таблиц JBPM 5 префиксом «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);
   }
}

Ответы [ 3 ]

25 голосов
/ 30 ноября 2010

Одним из способов переименования всех таблиц одновременно является реализация собственного namingStrategy (реализация org.hibernate.cfg.NamingStrategy).

Используемая NamingStrategy указана в файле persistence.xml

<property name="hibernate.ejb.naming_strategy"
          value="com.example.MyNamingStrategy" />
21 голосов
/ 30 ноября 2010

Используйте NamingStrategy . Этот мой предыдущий ответ должен предоставить именно то, что вам нужно.

Скопировано из предыдущего ответа:

Вот пример NamingStrategy, который строит имена таблиц в форме TYPE1_TYPE2 для соединительных таблиц и добавляет общий префикс для всех таблиц:

public class CustomNamingStrategy extends ImprovedNamingStrategy {

    private static final long serialVersionUID = 1L;
    private static final String PREFIX = "PFX_";

    @Override
    public String classToTableName(final String className) {
        return this.addPrefix(super.classToTableName(className));
    }

    @Override
    public String collectionTableName(final String ownerEntity,
            final String ownerEntityTable, final String associatedEntity,
            final String associatedEntityTable, final String propertyName) {
        return this.addPrefix(super.collectionTableName(ownerEntity,
                ownerEntityTable, associatedEntity, associatedEntityTable,
                propertyName));
    }

    @Override
    public String logicalCollectionTableName(final String tableName,
            final String ownerEntityTable, final String associatedEntityTable,
            final String propertyName) {
        return this.addPrefix(super.logicalCollectionTableName(tableName,
                ownerEntityTable, associatedEntityTable, propertyName));
    }

    private String addPrefix(final String composedTableName) {

        return PREFIX
                + composedTableName.toUpperCase().replace("_", "");

    }

}
7 голосов
/ 12 октября 2018

В 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...