Что сработало для меня, так это вызов метода в конфигурации (вместо вставки свойства),
configuration.setPhysicalNamingStrategy(new ReallyCoolNamingStrategy());
а также собственность:
hibernate.globally_quoted_identifiers: true
Для веб-сервера DropWizard + Hibernate:
Следуйте инструкциям по установке для DropWizard
Установите необходимые параметры в вашей конфигурации:
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
Обновите инициализацию вашего комплекта 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,
};
}
- Дважды проверьте свою стратегию:
- Убедитесь, что возвращают нули для нулей.
- Убедитесь, что передан параметр
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)