彩票网站建设方案,联盟营销平台,网站制作怎么报价,做微视频的网站本文讨论了hibernate提供的不同命名策略#xff0c;以及命名策略从hibernate 4中的hibernate.ejb.naming_strategy到hibernate 5中的hibernate.implicit_naming_strategy和hibernate.physical_naming_strategy的转变。最后#xff0c;我们将研究一下在休眠和配置中实施自定义… 本文讨论了hibernate提供的不同命名策略以及命名策略从hibernate 4中的hibernate.ejb.naming_strategy到hibernate 5中的hibernate.implicit_naming_strategy和hibernate.physical_naming_strategy的转变。最后我们将研究一下在休眠和配置中实施自定义命名策略以与Spring Boot应用程序一起运行。 Hibernate 4命名策略 Hibernate使用这些策略将Java实体和属性名称与相应的关系数据库和列名称进行映射。 在休眠4中使用的命名策略是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来接受默认值是jpalegacy-hbmlegacy-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();}
} 要在休眠状态下使用此自定义策略请执行以下配置。 jpaProperties.put(hibernate.physical_naming_strategy, com.devglan.config.CustomPhysicalNamingStrategy);Spring Boot中的休眠命名策略 正如我们所讨论的那样hibernate提供了两种不同的命名策略而Spring Boot使用SpringPhysicalNamingStrategy配置了物理命名策略其中所有的点都由下划线代替而驼峰的大小写由下划线代替并且所有表名均以小写形式生成。例如USERDETAILS实体映射到user_details表。 如果要使用上面实现的自定义命名策略可以在application.properties中进行以下配置。 spring.jpa.hibernate.naming.physical-strategycom.devglan.config.CustomPhysicalNamingStrategy);结论 在本文中我们了解了Spring Boot和Hibernate提供的不同命名策略以及实现我们自己的自定义命名策略的方法。 如果您有任何要添加或共享的内容请在下面的评论部分中共享。 翻译自: https://www.javacodegeeks.com/2018/03/different-hibernate-naming-strategy.html