Физическая стратегия именования регистрируется, но не запускается при сохранении - PullRequest
0 голосов
/ 22 января 2019

Физическая стратегия именования регистрируется, но не срабатывает во время сохранения.

Я пытаюсь настроить стратегию PhysicalNaming для своего спящего комплекта dropwizard

public abstract class CustomHibernateBundle<T extends io.dropwizard.Configuration> extends ScanningHibernateBundle<T> {

protected CustomHibernateBundle(String pckg) {
    this(pckg, new SessionFactoryFactory());
}

protected CustomHibernateBundle(String pckg, SessionFactoryFactory sessionFactoryFactory) {
    this(new String[]{pckg}, sessionFactoryFactory);
}

protected CustomHibernateBundle(String[] pckgs, SessionFactoryFactory sessionFactoryFactory) {
    super(pckgs, sessionFactoryFactory);
}

public void configure(Configuration configuration) {
    super.configure(configuration);
    configuration.setPhysicalNamingStrategy(new CustomNamingStrategy());
}
}



public class CustomNamingStrategy implements PhysicalNamingStrategy {
private String tableName(Identifier identifier) {
 if (identifier == null)
        return null;
    String newName = identifier.getText();
    String customID = (String) MDC.get("CUSTOM-ID");
    if (!StringUtils.isEmpty(customID) && taint.equalsIgnoreCase("custom_id"))
        newName = newName + "_custom";
    return newName;
}

@Override
public Identifier toPhysicalCatalogName(Identifier identifier, JdbcEnvironment jdbcEnvironment) {
    return identifier;
}

@Override
public Identifier toPhysicalSchemaName(Identifier identifier, JdbcEnvironment jdbcEnvironment) {
    return identifier;
}

@Override
public Identifier toPhysicalTableName(Identifier identifier, JdbcEnvironment jdbcEnvironment) {
    return jdbcEnvironment.getIdentifierHelper().toIdentifier(tableName(identifier));
}

@Override
public Identifier toPhysicalSequenceName(Identifier identifier, JdbcEnvironment jdbcEnvironment) {
    return identifier;
}

@Override
public Identifier toPhysicalColumnName(Identifier identifier, JdbcEnvironment jdbcEnvironment) {
    return identifier;
}
}

Во время загрузки класс стратегии именования регистрируется правильно. Но когда я пытаюсь упорствовать, стратегия именования не срабатывает.

Я также пытался использовать

hibernate.naming.physical_strategy: com.someorg.CustomStrategy

в моем файле YAML, но безрезультатно.

1 Ответ

0 голосов
/ 25 июля 2019

Что сработало для меня, так это вызов метода в конфигурации (вместо вставки свойства),

configuration.setPhysicalNamingStrategy(new ReallyCoolNamingStrategy());

а также собственность:

hibernate.globally_quoted_identifiers: true

Для веб-сервера DropWizard + Hibernate:

  1. Следуйте инструкциям по установке для DropWizard

  2. Установите необходимые параметры в вашей конфигурации:

    • В этом фрагменте я добавил стратегию именования.

    • Для PostgreSQL у меня есть globally quoted identifiers как false

database:
  driverClass: org.postgresql.Driver
  url: jdbc:postgresql://localhost:5432/mule?currentSchema=public
  user: mule-admin
  password:
  properties:
    hibernate.dialect: org.hibernate.dialect.PostgreSQL10Dialect
    hibernate.physical_naming_strategy: net.sf.zoftwhere.hibernate.SnakeCaseNamingStrategy
    hibernate.globally_quoted_identifiers: false
    hibernate.hbm2ddl.auto: update
    hibernate.show_sql: false
    hibernate.format_sql: false
  1. Обновите инициализацию вашего комплекта Hibernate:

    • Здесь хранимое свойство используется для жестко закодированных стратегий.
  public static <T extends DatabaseConfiguration> HibernateBundle<T> getHibernateBundle() {
    return new HibernateBundle<>(AbstractEntity.class, persistenceEntities()) {
      @Override
      public DataSourceFactory getDataSourceFactory(T configuration) {
        return configuration.getDataSourceFactory();
      }

      @Override
      protected void configure(org.hibernate.cfg.Configuration configuration) {
        final String namingStrategy = configuration.getProperty("hibernate.physical_naming_strategy");

        if (SnakeCaseNamingStrategy.class.getName().equals(namingStrategy)) {
          configuration.setPhysicalNamingStrategy(new SnakeCaseNamingStrategy());
        } else if (MacroCaseNamingStrategy.class.getName().equals(namingStrategy)) {
          configuration.setPhysicalNamingStrategy(new MacroCaseNamingStrategy());
        }
      }
    };
  }

  public static Class<?>[] persistenceEntities() {
    return new Class<?>[]{
        Account.class,
        AccessToken.class,
        ShellSession.class,
    };
  }
  1. Дважды проверьте свою стратегию:
    • Убедитесь, что возвращают нули для нулей.
    • Убедитесь, что передан параметр isQuoted.
...

  @Override
  public Identifier toPhysicalTableName(final Identifier identifier, final JdbcEnvironment jdbcEnv) {
    return convertToSnakeCase(identifier);
  }

  protected Identifier convertToSnakeCase(final Identifier identifier) {
    if (identifier == null) {
      return null;
    }

    return Identifier.toIdentifier(snakeCase(identifier.getText()), identifier.isQuoted());
  }

  protected String snakeCase(String input) {
    return input.replaceAll("([a-z])([A-Z])", "$1_$2")
        .replaceAll("([A-Z])([A-Z][a-z])", "$1_$2")
        .toLowerCase();
  }

...

Надеюсь, это поможет.

DropWizard 1.3.13 Hibernate 5.4.3.Final Java 11.0.2 (Oracle)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...