不同的Hibernate命名策略
本文討論了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
總結
以上是生活随笔為你收集整理的不同的Hibernate命名策略的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 情景模式安卓版(情景模式安卓)
- 下一篇: 备案担保书(备案担保)