SnakeCasePhysicalNamingStrategy.java

package nl.b3p.brmo.persistence;

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

public class SnakeCasePhysicalNamingStrategy extends PhysicalNamingStrategyStandardImpl {

  @Override
  public Identifier toPhysicalCatalogName(Identifier name, JdbcEnvironment context) {
    return super.toPhysicalCatalogName(toSnakeCase(name), context);
  }

  @Override
  public Identifier toPhysicalColumnName(Identifier name, JdbcEnvironment context) {
    return super.toPhysicalColumnName(toSnakeCase(name), context);
  }

  @Override
  public Identifier toPhysicalSchemaName(Identifier name, JdbcEnvironment context) {
    return super.toPhysicalSchemaName(toSnakeCase(name), context);
  }

  @Override
  public Identifier toPhysicalSequenceName(Identifier name, JdbcEnvironment context) {
    return super.toPhysicalSequenceName(toSnakeCase(name), context);
  }

  @Override
  public Identifier toPhysicalTableName(Identifier name, JdbcEnvironment context) {
    return super.toPhysicalTableName(toSnakeCase(name), context);
  }

  private Identifier toSnakeCase(Identifier id) {
    if (id == null) return id;

    String name = id.getText();
    String snakeName = name.replaceAll("([a-z]+)([A-Z]+)", "$1\\_$2").toLowerCase();
    if (!snakeName.equals(name)) return new Identifier(snakeName, id.isQuoted());
    else return id;
  }
}