感谢您发布您自己的解决方案。它对我设置 Hibernate 5 命名策略很有帮助!
The hibernate.ejb.naming_strategy
Hibernate 5.0 之前的属性似乎分为两部分:
hibernate.physical_naming_strategy
hibernate.implicit_naming_strategy
这些属性的值没有实现NamingStrategy
界面一样hibernate.ejb.naming_strategy
。有两个用于这些目的的新接口:
org.hibernate.boot.model.naming.PhysicalNamingStrategy
org.hibernate.boot.model.naming.ImplicitNamingStrategy
Hibernate 5 只提供了一种实现PhysicalNamingStrategy
(PhysicalNamingStrategyStandardImpl
)假设物理标识符名称与逻辑标识符名称相同。
有几种实现方式ImplicitNamingStrategy
但我发现没有一个相当于旧的ImprovedNamingStrategy
. (See: org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyHbmImpl
)
所以,我实现了自己的PhysicalNamingStrategy
这很简单:
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);
}
}
请注意,addUnderscores()
方法来自于原来的org.hibernate.cfg.ImprovedNamingStrategy
.
然后,我将此物理策略设置到 persistence.xml 文件中:
<property name="hibernate.physical_naming_strategy" value="my.package.PhysicalNamingStrategyImpl" />
将 Hibernate 5 命名策略设置为以前版本的设置是一个陷阱。