Thanks for posting your own solution. It helps me so much to set Hibernate 5 naming strategy!
The hibernate.ejb.naming_strategy property of pre-Hibernate 5.0 seems split into two parts:
hibernate.physical_naming_strategyhibernate.implicit_naming_strategy
The values of these properties do not implement the NamingStrategy interface as did hibernate.ejb.naming_strategy. There are two new interfaces for these purposes:
org.hibernate.boot.model.naming.PhysicalNamingStrategyorg.hibernate.boot.model.naming.ImplicitNamingStrategy
Hibernate 5 provides only one implementation of PhysicalNamingStrategy (PhysicalNamingStrategyStandardImpl) that assumes physical identifier names are the same as logical ones.
There are several implementations of ImplicitNamingStrategy but I found none equivalent to the old ImprovedNamingStrategy. (See: org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyHbmImpl)
So, I implemented my own PhysicalNamingStrategy which is very simple:
public class PhysicalNamingStrategyImpl extends PhysicalNamingStrategyStandardImpl implements Serializable {
public static final PhysicalNamingStrategyImpl INSTANCE = new PhysicalNamingStrategyImpl();
@Override
public Identifier toPhysicalTableName(Identifier name, JdbcEnvironment context) {
return new Identifier(addUnderscores(name.getText()), name.isQuoted());
}
@Override
public Identifier toPhysicalColumnName(Identifier name, JdbcEnvironment context) {
return new Identifier(addUnderscores(name.getText()), name.isQuoted());
}
protected static String addUnderscores(String name) {
final StringBuilder buf = new StringBuilder( name.replace('.', '_') );
for (int i=1; i<buf.length()-1; i++) {
if (
Character.isLowerCase( buf.charAt(i-1) ) &&
Character.isUpperCase( buf.charAt(i) ) &&
Character.isLowerCase( buf.charAt(i+1) )
) {
buf.insert(i++, '_');
}
}
return buf.toString().toLowerCase(Locale.ROOT);
}
}
Note that the addUnderscores() method is from the original org.hibernate.cfg.ImprovedNamingStrategy.
Then, I set this physical strategy into the persistence.xml file :
<property name="hibernate.physical_naming_strategy" value="my.package.PhysicalNamingStrategyImpl" />
It is a trap to set Hibernate 5 naming strategy as previous version settings.