2010-11-30 19 views
7

JPA/Hibernateでテーブル名をオーバーライドして、すべてのプロジェクトエンティティに共通のプレフィックスを追加することはできますか?たとえば、すべてのJBPM 5テーブルに接頭辞「JBPM5_」を付けることができます。受け入れ答えのためのJPA(Hibernate)とカスタムテーブルプレフィックス

例:一度にすべてのテーブルの名前を変更する

public class JBPM5NamingStrategy extends ImprovedNamingStrategy { 
    public String classToTableName(String className) { 
     return StringHelper.unqualify(className); 
    } 
    public String propertyToColumnName(String propertyName) { 
     return propertyName; 
    } 
    public String tableName(String tableName) { 
     return "JBPM5_" + tableName; 
    } 
    public String columnName(String columnName) { 
     return columnName; 
    } 
    public String propertyToTableName(String className, String propertyName) { 
     return "JBPM5_" + classToTableName(className) + '_' 
     + propertyToColumnName(propertyName); 
    } 
} 
+0

あなたは '@ Table'アノテーションから離れていますか? –

+0

はい、表の注釈は別です。私は実際にサードパーティのプロジェクトを意味していたので、設定だけが実行可能です(私はコンパイルされたJavaソースに触れることはできません)。 –

+2

また、個々のクラスのアノテーションを使用してサイト全体のポリシーを実装するのは面倒でエラーが発生しやすい –

答えて

25

一つの方法は、あなた自身のNamingStrategyを(org.hibernate.cfg.NamingStrategyの実装)を実装することです。

NamingStrategyをは

<property name="hibernate.ejb.naming_strategy" 
      value="com.example.MyNamingStrategy" /> 
+5

誰かがこの回答に例を編集して貼り付けてもらえますか? –

18

NamingStrategyを使用することによってpersistence.xmlの中で指定されて使用されます。このprevious answer of mineは、必要なものを正確に提供する必要があります。前の回答からコピー

:ここ

は が参加したテーブルの形 TYPE1_TYPE2のテーブル名を構築し、すべてのテーブルに 共通のプレフィックスを追加することをサンプルNamingStrategyを次のとおりです。

public class CustomNamingStrategy extends ImprovedNamingStrategy { 

    private static final long serialVersionUID = 1L; 
    private static final String PREFIX = "PFX_"; 

    @Override 
    public String classToTableName(final String className) { 
     return this.addPrefix(super.classToTableName(className)); 
    } 

    @Override 
    public String collectionTableName(final String ownerEntity, 
      final String ownerEntityTable, final String associatedEntity, 
      final String associatedEntityTable, final String propertyName) { 
     return this.addPrefix(super.collectionTableName(ownerEntity, 
       ownerEntityTable, associatedEntity, associatedEntityTable, 
       propertyName)); 
    } 

    @Override 
    public String logicalCollectionTableName(final String tableName, 
      final String ownerEntityTable, final String associatedEntityTable, 
      final String propertyName) { 
     return this.addPrefix(super.logicalCollectionTableName(tableName, 
       ownerEntityTable, associatedEntityTable, propertyName)); 
    } 

    private String addPrefix(final String composedTableName) { 

     return PREFIX 
       + composedTableName.toUpperCase().replace("_", ""); 

    } 

} 
+0

+1へのリンク – Ralph

+0

+1、決してNamingStrategyについて知りませんでした。あなたは毎日何か新しいことを学びます! – Qwerky

+4

これは休止状態の特定のことです。他のJPAプロバイダとは動作しません –