不同的Hibernate命名策略
本文討論了hibernate提供的不同命名策略,以及命名策略從hibernate 4中的hibernate.ejb.naming_strategy到hibernate 5中的hibernate.implicit_naming_strategy和hibernate.physical_naming_strategy的轉(zhuǎn)變。最后,我們將研究一下在Hibernate和配置中實施自定義命名策略以與Spring Boot應(yīng)用程序一起運(yùn)行。
Hibernate 4命名策略
Hibernate使用這些策略將Java實體和屬性名稱與相應(yīng)的關(guān)系數(shù)據(jù)庫和列名稱進(jìn)行映射。 在Hibernate4中,使用的命名策略是hibernate.ejb.naming_strategy。 該策略使用EJB3NamingStrategy , 改良的 NamingStrategy , DefaultComponentSafeNamingStrategy和DefaultNamingStrategy來映射名稱。 EJB3NamingStrategy是使用的默認(rèn)命名策略,它提供駝峰字段和表名。在命名外鍵列時,它使用undescore(_)作為分隔符。 例如,如果您有一個名稱為table1且名稱為id和name的表,則在table2中,外鍵列將被創(chuàng)建為table1_id,并且此EJB3NamingStrategy實現(xiàn)了NamingStrategy接口。
Hibernate 5命名策略
Hibernate 5發(fā)布后,由于NamingStrategy合同通常不夠靈活以至于無法正確應(yīng)用給定的命名“規(guī)則”,因此hibernate.ejb.naming_strategy不再適用。 取而代之的是,引入了兩種新策略來提供對命名策略的深度定制,它們是ImplicitNamingStrategy和PhysicalNamingStrategy。 要使用此策略,有兩個要使用的鍵:implicit_naming_strategy和physical_naming_strategy。Hibernate5僅提供了PhysicalNamingStrategy的一種實現(xiàn)– PhysicalNamingStrategyStandardImpl,但是提供了ImplicitNamingStrategy的幾種實現(xiàn)。
當(dāng)您在實體定義中未明確提供數(shù)據(jù)庫名稱和列名稱時,將使用ImplicitNamingStrategy,因為PhysicalNamingStrategy可用于顯式定義實體名稱和屬性名稱與數(shù)據(jù)庫名稱和列名稱的映射規(guī)則。
隱式命名策略
當(dāng)實體未明確命名其映射到的數(shù)據(jù)庫表時或當(dāng)特定屬性未明確命名其映射到的數(shù)據(jù)庫列時,將使用ImplicitNamingStrategy。我們可以使用hibernate.implicit_naming_strategy配置設(shè)置指定要使用的ImplicitNamingStrategy。默認(rèn)值是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();} }要在Hibernate狀態(tài)下使用此自定義策略,請執(zhí)行以下配置。
jpaProperties.put("hibernate.physical_naming_strategy", "com.devglan.config.CustomPhysicalNamingStrategy");Spring Boot中的Hibernate命名策略
正如我們所討論的那樣,hibernate提供了兩種不同的命名策略,而Spring Boot使用SpringPhysicalNamingStrategy配置物理命名策略,其中所有點(diǎn)都由下劃線替換,并且駝峰式大寫字母由下劃線替換,并且所有表名均以小寫形式生成。例如,USERDETAILS實體映射到user_details表。
如果要使用上面實現(xiàn)的自定義命名策略,則可以在application.properties中進(jìn)行以下配置。
spring.jpa.hibernate.naming.physical-strategy=com.devglan.config.CustomPhysicalNamingStrategy);結(jié)論
在本文中,我們了解了Spring Boot和Hibernate提供的不同命名策略以及實現(xiàn)我們自己的自定義命名策略的方法。 如果您有任何要添加或共享的內(nèi)容,請在下面的評論部分中共享。
翻譯自: https://www.javacodegeeks.com/2018/03/different-hibernate-naming-strategy.html
總結(jié)
以上是生活随笔為你收集整理的不同的Hibernate命名策略的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 情景模式安卓版(情景模式安卓)
- 下一篇: 过滤器过滤特定的url_如何从过滤器中排