Hibernateのさまざまな命名戦略

こんにちは、Habr! Dhiraj Rayの記事「 Different Hibernate Naming Strategy 」の翻訳を紹介します。



この記事では、hibernateが提供するさまざまな命名戦略、およびhibernate 4のhibernate.ejb.naming_strategyからhibernate.implicit_naming_strategyおよびhibernate.physical_naming_strategyのhibernate 5への命名戦略の移行について説明します。スプリングブートを使用して起動します。



Hibernate 4の命名戦略



Hibernateはこの戦略を使用して、Javaエンティティと属性を対応するリレーショナルデータベースと列名にマッピングします。 Hibernate 4は命名戦略hibernate.ejb.naming_strategyを使用しました。 この戦略では、EJB3NamingStrategy、EnhancedNamingStrategy、DefaultComponentSafeNamingStrategy、およびDefaultNamingStrategyを使用して名前を一致させます。 EJB3NamingStrategyはデフォルトの命名戦略であり、camelCaseスタイルのフィールド名とテーブル名を提供します。 外部キー列に名前を付ける際には、区切りとしてアンダースコア(_)を使用します。 たとえば、名前がtable1で、列名がidとnameであるテーブルがある場合、2番目のテーブルでは外部キー列がtable1_idとして作成されるため、EJB3NamingStrategyはNamingStrategyインターフェースを実装します。



Hibernate 5の命名戦略



Hibernate 5のリリース後、hibernate.ejb.naming_strategyは使用されなくなりました。これは、NamingStrategyコントラクトがこの命名規則を正しく適用するのに十分な柔軟性がないことが多いためです。 代わりに、ImplicitNamingStrategyおよびPhysicalNamingStrategyと呼ばれる命名戦略を深くカスタマイズする2つの新しい戦略が導入されました。 これらの戦略を使用するには、implicit_naming_strategyおよびphysical_naming_strategyで使用される2つのキーがあります。Hibernate5は、PhysicalNamingStrategyの実装を1つだけ提供します。



ImplicitNamingStrategyは、PhysicalNamingStrategyを使用してエンティティおよび属性名をデータベースおよび列名と一致させるルールを明示的に定義できるため、エンティティ定義でデータベースおよび列名を明示的に指定しない場合に使用されます。



ImplicitNamingStrategy



ImplicitNamingStrategyは、オブジェクトがバインド先のデータベーステーブルを明示的に示していない場合、または特定の属性がマッピング先のデータベース列を明示的に示していない場合に使用されます。 デフォルト、jpa、legacy-hbm、legacy-jpa、component-pathを受け入れるhibernate.implicit_naming_strategy構成で使用するImplicitNamingStrategyを指定できます。



PhysicalNamingStrategy



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 { @Override public Identifier toPhysicalCatalogName(Identifier name, JdbcEnvironment jdbcEnvironment) { return name; } @Override public Identifier toPhysicalSchemaName(Identifier name, JdbcEnvironment jdbcEnvironment) { return name; } @Override public Identifier toPhysicalTableName(Identifier name, JdbcEnvironment jdbcEnvironment) { final List parts = splitAndReplace( name.getText() ); return jdbcEnvironment.getIdentifierHelper().toIdentifier( join( parts ), name.isQuoted() ); } @Override public Identifier toPhysicalSequenceName(Identifier name, JdbcEnvironment jdbcEnvironment) { return name; } @Override public 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 Naming Strategy



既に述べたように、hibernateは2つの異なる命名戦略を提供しますが、Spring BootはSpringPhysicalNamingStrategyを使用して物理的な命名戦略を設定します。 たとえば、USERDETAILSオブジェクトはuser_detailsテーブルにマップします。



上記で実装した独自の命名戦略を使用する場合は、application.propertiesで次の構成を実行できます。



 spring.jpa.hibernate.naming.physical-strategy=com.devglan.config.CustomPhysicalNamingStrategy);
      
      





おわりに



この記事では、Spring BootとHibernateが提供するさまざまな命名戦略と、独自の命名戦略を実装する方法について学びました。 記事を補足したり、共有したいことがある場合は、コメントセクションで気軽に行ってください。










All Articles