2015年12月7日月曜日

HibernateのImplicitNamingStrategyを使って識別子に任意のプレフィックス等を付加する

Hibernateでテーブル名やカラム名などに一律任意のサフィックスやプレフィックスを追加するには、ImplicitNamingStrategyを実装したクラスを作成し設定を追加しするだけでよい。
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))