本文讨论了hibernate提供的不同命名策略,以及命名策略从hibernate 4中的hibernate.ejb.naming_strategy到hibernate 5中的hibernate.implicit_naming_strategy和hibernate.physical_naming_strategy的转变。最后,我们将研究一下在Hibernate和配置中实施自定义命名策略以与Spring Boot应用程序一起运行。
Hibernate 4命名策略
Hibernate使用这些策略将Java实体和属性名称与相应的关系数据库和列名称进行映射。 在Hibernate4中,使用的命名策略是hibernate.ejb.naming_strategy。 该策略使用EJB3NamingStrategy , 改良的 NamingStrategy , DefaultComponentSafeNamingStrategy和DefaultNamingStrategy来映射名称。 EJB3NamingStrategy是使用的默认命名策略,它提供驼峰字段和表名。在命名外键列时,它使用undescore(_)作为分隔符。 例如,如果您有一个名称为table1且名称为id和name的表,则在table2中,外键列将被创建为table1_id,并且此EJB3NamingStrategy实现了NamingStrategy接口。
Hibernate 5命名策略
Hibernate 5发布后,由于NamingStrategy合同通常不够灵活以至于无法正确应用给定的命名“规则”,因此hibernate.ejb.naming_strategy不再适用。 取而代之的是,引入了两种新策略来提供对命名策略的深度定制,它们是ImplicitNamingStrategy和PhysicalNamingStrategy。 要使用此策略,有两个要使用的键:implicit_naming_strategy和physical_naming_strategy。Hibernate5仅提供了PhysicalNamingStrategy的一种实现– PhysicalNamingStrategyStandardImpl,但是提供了ImplicitNamingStrategy的几种实现。
当您在实体定义中未明确提供数据库名称和列名称时,将使用ImplicitNamingStrategy,因为PhysicalNamingStrategy可用于显式定义实体名称和属性名称与数据库名称和列名称的映射规则。
隐式命名策略
当实体未明确命名其映射到的数据库表时或当特定属性未明确命名其映射到的数据库列时,将使用ImplicitNamingStrategy。我们可以使用hibernate.implicit_naming_strategy配置设置指定要使用的ImplicitNamingStrategy。默认值是jpa,legacy-hbm,legacy-jpa和component-path。
物理命名策略
PhysicalNamingStrategy的想法是定义自定义命名规则,而不必通过显式名称将其硬编码到映射中。以下是PhysicalNamingStrategy的一种实现,用于定义自定义表名和列名。
package com.devglan;import java.util.LinkedList;
import java.util.List;
import java.util.Locale;import org.hibernate.boot.model.naming.Identifier;
import org.hibernate.boot.model.naming.PhysicalNamingStrategy;
import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment;import org.apache.commons.lang3.StringUtils;public class CustomPhysicalNamingStrategy implements PhysicalNamingStrategy {@Overridepublic Identifier toPhysicalCatalogName(Identifier name, JdbcEnvironment jdbcEnvironment) {return name;}@Overridepublic Identifier toPhysicalSchemaName(Identifier name, JdbcEnvironment jdbcEnvironment) {return name;}@Overridepublic Identifier toPhysicalTableName(Identifier name, JdbcEnvironment jdbcEnvironment) {final List parts = splitAndReplace( name.getText() );return jdbcEnvironment.getIdentifierHelper().toIdentifier(join( parts ),name.isQuoted());}@Overridepublic Identifier toPhysicalSequenceName(Identifier name, JdbcEnvironment jdbcEnvironment) {return name;}@Overridepublic Identifier toPhysicalColumnName(Identifier name, JdbcEnvironment jdbcEnvironment) {final List parts = splitAndReplace( name.getText() );return jdbcEnvironment.getIdentifierHelper().toIdentifier(join( parts ),name.isQuoted());}private LinkedList splitAndReplace(String name) {LinkedList result = new LinkedList<>();for ( String part : StringUtils.splitByCharacterTypeCamelCase( name ) ) {if ( part == null || part.trim().isEmpty() ) {continue;}result.add( part.toUpperCase( Locale.ROOT ) );}return result;}private String join(List parts) {boolean firstPass = true;String separator = "";StringBuilder joined = new StringBuilder();for ( String part : parts ) {joined.append( separator ).append( part );if ( firstPass ) {firstPass = false;separator = "_";}}return joined.toString();}
}
要在Hibernate状态下使用此自定义策略,请执行以下配置。
jpaProperties.put("hibernate.physical_naming_strategy", "com.devglan.config.CustomPhysicalNamingStrategy");
Spring Boot中的Hibernate命名策略
正如我们所讨论的那样,hibernate提供了两种不同的命名策略,而Spring Boot使用SpringPhysicalNamingStrategy配置物理命名策略,其中所有点都由下划线替换,并且驼峰式大写字母由下划线替换,并且所有表名均以小写形式生成。例如,USERDETAILS实体映射到user_details表。
如果要使用上面实现的自定义命名策略,则可以在application.properties中进行以下配置。
spring.jpa.hibernate.naming.physical-strategy=com.devglan.config.CustomPhysicalNamingStrategy);
结论
在本文中,我们了解了Spring Boot和Hibernate提供的不同命名策略以及实现我们自己的自定义命名策略的方法。 如果您有任何要添加或共享的内容,请在下面的评论部分中共享。
翻译自: https://www.javacodegeeks.com/2018/03/different-hibernate-naming-strategy.html