2011-05-13 5 views
4
public class ImprovedMappingDefaults extends PersistenceMappingDefaults { 
    @Override 
    protected void correctName(Table table, Column col) { 
     String name = col.getName(); 
     name = addUnderscores(name); 
     col.setName(dict.getValidColumnName(name, table)); 
    } 

    // taken from Hibernate's ImprovedNamingStrategy 
    private static String addUnderscores(String name) { 
     StringBuffer buf = new StringBuffer(name.replace('.', '_')); 
     for (int i = 1; i < buf.length() - 1; i++) { 
      if (Character.isLowerCase(buf.charAt(i - 1)) && Character.isUpperCase(buf.charAt(i)) && Character.isLowerCase(buf.charAt(i + 1))) { 
       buf.insert(i++, '_'); 
      } 
     } 
     return buf.toString().toLowerCase(); 
    } 
} 

にキャメルケースに変換します。しかし、em.persist()などの永続化操作では、誤ったSQLが生成されて失敗します。OpenJPAの - 拡張PersistenceMappingDefaultsは、上記のコードは、DB内の下線にキャメルケースのフィールド名を変換してOpenJPAの1.2.2に正しくDDLを生成するアンダースコア

org.apache.openjpa.lib.jdbc.ReportingSQLException: Column not found: VERSION5 in statement [INSERT INTO FOO_FILE (file_id, VERSION5, DATETIME05, FILE_NAME5, INPUT_SYSTEM5, IS_END_OF_DAY5, SEQUENCE_NUMBER5, TOTAL_AMOUNT5, TOTAL_COUNT5, MY_FILE_ID5) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)] {INSERT INTO FOO_FILE (file_id, VERSION5, DATETIME05, FILE_NAME5, INPUT_SYSTEM5, IS_END_OF_DAY5, SEQUENCE_NUMBER5, TOTAL_AMOUNT5, TOTAL_COUNT5, MY_FILE_ID5) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)} [code=-28, state=S0022] 

openjpaは各列に「5」を付加しています。これがどこから来ているかわからないFOO_FILEのためのDDLが生成されます。

CREATE TABLE FOO_FILE (file_id BIGINT NOT NULL, VERSION INTEGER, DATETIME0 TIME, FILE_NAME VARCHAR(100), INPUT_SYSTEM VARCHAR(3), IS_END_OF_DAY BIT, SEQUENCE_NUMBER BIGINT, TOTAL_AMOUNT NUMERIC, TOTAL_COUNT INTEGER, MY_FILE_ID VARCHAR(255), PRIMARY KEY (file_id)) 

ちょうど私のロジックが間違っていたかどうかを確認倍増する、私はスーパークラスのメソッド(つまり、ハンガリー語の表記を使用しています)とcorrectNameを()に置き換え。

protected void correctName(Table table, Column col) { 
    String name = col.getName(); 
    name = removeHungarianNotation(name); 
    col.setName(dict.getValidColumnName(name, table)); 
} 

これも失敗します。

誰もがPersistenceMappingDefaultsを拡張してカラム/テーブル名を変更できましたか?この点でopenjpaはHibernateに比べて複雑すぎるようです。

答えて

-1

OpenJPAの現在のバージョンで動作します。 example hereを参照してください。

0

上記のコードをテストしたところ、OpenJPA 2.2.0で動作します。

キャメルケースのフィールド名をdbのアンダースコアにマップしました。

だから、フィールドprivate String taxRate;@Column(name = 'TAX_RATE')

に注釈を付けることなく、列TAX_RATEをDBを参照persistence.xmlのが<persistence-unit>で定義する。このようにプロパティを必要としていることを忘れないでください:

<properties> 
     <property name="openjpa.jdbc.MappingDefaults" 
      value="com.myproject.ImprovedMappingDefaults"/> 
    </properties> 

それは次のようになりOpenJPAのチームはremoveHungarianNotation ...のように、オプションとしてこれをで取ることができれば素晴らしい

関連する問題