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_strategy
hibernate.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.PhysicalNamingStrategy
org.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.