PhysicalNamingStrategyを使った識別子の変更とは異なり、明示的に識別子を指定した場合は、このクラスは呼び出されない。また、ImplicitNamingStrategyのほうが、命名ルールを細かく設定できる。
ImplicitNamingStrategyの実装クラス
JPAの場合はデフォルト実装のImplicitNamingStrategyJpaCompliantImplを継承する。PhysicalNamingStrategyとくらべてかなり多くのメソッドが定義されているけど、テーブル名であればdeterminePrimaryTableNameをオーバライドしてあげるとよい。
サンプル実装では、テーブル名の後ろに「_TBL」を付加している。
import org.hibernate.boot.model.naming.Identifier; import org.hibernate.boot.model.naming.ImplicitEntityNameSource; import org.hibernate.boot.model.naming.ImplicitNamingStrategyJpaCompliantImpl; public class HogeImplicitNamingStrategy extends ImplicitNamingStrategyJpaCompliantImpl { @Override public Identifier determinePrimaryTableName(ImplicitEntityNameSource source) { Identifier tableName = super.determinePrimaryTableName(source); return Identifier.toIdentifier(tableName.getText() + "_TBL"); } }
persistence.xmlにImplicitNamingStrategy実装クラスを設定
hibernate.implicit_naming_strategyというプロパティに、作成したクラスのFQCNを設定する。<properties> <property name="hibernate.implicit_naming_strategy" value="sample.HogeImplicitNamingStrategy" /> </properties>
結果
テーブル名の末尾に「_TBL」が設定されているのが確認できる。usersエンティティは、@Tableアノテーションが設定されているので、「_TBL」が付加されない。Hibernate: create table Item_TBL (id bigint not null, primary key (id)) Hibernate: create table users (id bigint not null, name varchar(255), primary key (id))