不同的休眠命名策略
本文討論了hibernate提供的不同命名策略,以及命名策略從hibernate 4中的hibernate.ejb.naming_strategy到hibernate 5中的hibernate.implicit_naming_strategy和hibernate.physical_naming_strategy的轉變。最后,我們將研究一下在休眠和配置中實施自定義命名策略以與Spring Boot應用程序一起運行。
Hibernate 4命名策略
Hibernate使用這些策略將Java實體和屬性名稱與相應的關系數(shù)據(jù)庫和列名稱進行映射。 在休眠4中,使用的命名策略是hibernate.ejb.naming_strategy。 該策略使用EJB3NamingStrategy , 改良的 NamingStrategy , DefaultComponentSafeNamingStrategy和DefaultNamingStrategy來映射名稱。 EJB3NamingStrategy是使用的默認命名策略,它提供駝峰字段和表名。在命名外鍵列時,它使用undescore(_)作為分隔符。 例如,如果您有一個名稱為table1且表名分別為id和name的表,那么在table2中,外鍵列將被創(chuàng)建為table1_id,并且此EJB3NamingStrategy實現(xiàn)了NamingStrategy接口。
Hibernate 5命名策略
Hibernate 5發(fā)布后,由于NamingStrategy合同通常不夠靈活以至于無法正確應用給定的命名“規(guī)則”,因此hibernate.ejb.naming_strategy不再適用。 取而代之的是,引入了兩種新策略來提供命名策略的深度自定義,它們是ImplicitNamingStrategy和PhysicalNamingStrategy。 要使用此策略,有兩個密鑰需要使用implicit_naming_strategy和physical_naming_strategy。Hibernate5僅提供了PhysicalNamingStrategy的一種實現(xiàn)– PhysicalNamingStrategyStandardImpl,但是提供了ImplicitNamingStrategy的幾種實現(xiàn)。
當您在實體定義中未明確提供數(shù)據(jù)庫名稱和列名稱時,將使用ImplicitNamingStrategy,因為PhysicalNamingStrategy可以用于顯式定義實體名稱和屬性名稱與數(shù)據(jù)庫和列名稱的映射規(guī)則。
隱式命名策略
當實體未明確命名其映射到的數(shù)據(jù)庫表時或當特定屬性未明確命名其映射到的數(shù)據(jù)庫列時,將使用ImplicitNamingStrategy。我們可以使用hibernate.implicit_naming_strategy配置設置指定要使用的ImplicitNamingStrategy來接受默認值是jpa,legacy-hbm,legacy-jpa和component-path。
物理命名策略
PhysicalNamingStrategy的思想是定義自定義命名規(guī)則,而不必通過顯式名稱將其硬編碼到映射中。以下是PhysicalNamingStrategy的一種實現(xiàn),用于定義自定義表名和列名。
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();} }要在休眠狀態(tài)下使用此自定義策略,請執(zhí)行以下配置。
jpaProperties.put("hibernate.physical_naming_strategy", "com.devglan.config.CustomPhysicalNamingStrategy");Spring Boot中的休眠命名策略
正如我們所討論的那樣,hibernate提供了兩種不同的命名策略,而Spring Boot使用SpringPhysicalNamingStrategy配置了物理命名策略,其中所有的點都由下劃線代替,而駝峰的大小寫由下劃線代替,并且所有表名均以小寫形式生成。例如,USERDETAILS實體映射到user_details表。
如果要使用上面實現(xiàn)的自定義命名策略,可以在application.properties中進行以下配置。
spring.jpa.hibernate.naming.physical-strategy=com.devglan.config.CustomPhysicalNamingStrategy);結論
在本文中,我們了解了Spring Boot和Hibernate提供的不同命名策略以及實現(xiàn)我們自己的自定義命名策略的方法。 如果您有任何要添加或共享的內容,請在下面的評論部分中共享。
翻譯自: https://www.javacodegeeks.com/2018/03/different-hibernate-naming-strategy.html
總結
- 上一篇: @async方法不调用了_在Spring
- 下一篇: 诺基亚n79报价(新诺基亚n97价格)