[Seasar-user:15039] Re: [DBFlute]自動生成されるentityにColumnアノテーションを付加したいのですが

早川貴彦 [E-MAIL ADDRESS DELETED]
2008年 7月 16日 (水) 00:09:49 JST


早川です。

間違えた記録がそのまま残ってしまうので、
自己レスで訂正です。

>      @javax.persistence.Entity(name="${table.name}")
>      public class ${myClassName} extends ${myBaseEntityPackageName}.${myBaseObjectClassName} {


Entityに対してname= table.nameをしてしまうと

    MEMBERテーブルに対してsqlを実行したいのに
  M_E_M_B_E_R テーブルに対して sqlを実行してしまっていましたので

Tableアノテーションに指定しました。

       @javax.persistence.Entity
       @javax.persistence.Table(name="${table.name}")
       public class ${myClassName} extends
${myBaseEntityPackageName}.${myBaseObjectClassName} {

と変更し、Entityパッケージのクラスを削除後。再度の自動生成。
テストクラスが正常に動作することを確認いたしました。
お騒がせしました。



2008/07/12 1:44 早川貴彦 <[E-MAIL ADDRESS DELETED]>:
>> こちら、ExtendedEntityなので、
>> 「既にファイルが存在する場合は上書きしない」
>
> そうでした。GenerationGapパターンでしたね。
>
>
>> 継承クラスに@javax.persistence.Entityを定義してもいいか
>> ちょと不明です。(試してみる価値はあるかもです)
>
> ・・・というより(笑)
> すでにsvnにコミットされている
> https://www.seasar.org/svn/sandbox/dbflute/trunk/dbflute-s2jdbc-example/mydbflute/dbflute-0.7.3/templates/om/java/other/s2jdbc/entity/S2jdbcExtendedEntity.vm
>
> こちらにおいて、継承クラスに@javax.persistence.Entityが定義されているのです。
> ですので
>
> ・一回entityパッケージに作成されている、ユーザが編集してよいjavaファイルを削除
> ・上記テンプレートファイルに、
>      @javax.persistence.Entity(name="${table.name}")
>      public class ${myClassName} extends
> ${myBaseEntityPackageName}.${myBaseObjectClassName} {
>  と記述。
>
> ・generate.batを実行し、作成されたクラスにはEntityアノテーションでテーブル名が指定されていることを確認
>
> 以上です。解決しました。ありがとうございました。
>
> 2008/07/12 1:31 kubo <[E-MAIL ADDRESS DELETED]>:
>> 久保です。
>>
>> 早川さん、ご報告ありがとうございます!
>>
>>>      結果: 期待した変更にはならず、
>>> @javax.persistence.Entity
>>>                  の、変更前のまま
>>> →変数名の間違い?
>>
>> こちら、ExtendedEntityなので、
>> 「既にファイルが存在する場合は上書きしない」
>> ため、結果がそのままになります。
>> (Baseは毎度上書き出力で、Extended最初一回だけ出力)
>> なので、直すのはBaseEntityの方が良いのですが、
>> 継承クラスに@javax.persistence.Entityを定義してもいいか
>> ちょと不明です。(試してみる価値はあるかもです)
>>
>>>> (DBFlute for S2JDBCのご質問を頂いたのはこのMLでは初めてです)
>>> 丁度S2JDBCを使用するプロジェクトに参加し、「なんて良いツールがsandboxにあるんだ」
>>> と感動して使っています。ありがとうございます。
>>
>> とてもうれしい言葉です。
>> ありがとうございます!
>>
>> 2008/7/12 早川貴彦 <[E-MAIL ADDRESS DELETED]>:
>>> 早川です。
>>>
>>> 久保さん、早速の返信ありがとうございます。
>>>
>>>> (DBFlute for S2JDBCのご質問を頂いたのはこのMLでは初めてです)
>>> 丁度S2JDBCを使用するプロジェクトに参加し、「なんて良いツールがsandboxにあるんだ」
>>> と感動して使っています。ありがとうございます。
>>>
>>> dbflute-s2jdbc-exampleにて下記内容を試し、
>>> フィールド名については希望通りの結果が出ることを確認いたしました。
>>> (テーブル名がまだですが、下記記載のとおりもう少し試してみます)
>>>
>>> [フィールド名について](列名)
>>>
>>>https://www.seasar.org/svn/sandbox/dbflute/trunk/dbflute-s2jdbc-example/mydbflute/dbflute-0.7.3/templates/om/java/other/s2jdbc/entity/S2jdbcBaseEntity.vm
>>>>>>    @javax.persistence.Column(name="${col.name}")
>>> の一行を、フィールド名が記載されるテンプレートの一行上に記述
>>>
>>> ↓    このようにした
>>>
>>>    @javax.persistence.Column(name="${col.name}")
>>>    public ${col.javaNative} ${col.uncapitalisedJavaName};
>>>>>>    フィールド名についてはOK
>>>
>>>
>>>
>>> [クラス名] テーブル名
>>> 合わせて、テーブル名でも一つだけですが同様のものがあるので
>>> 同様の考え方で試す
>>>
>>> https://www.seasar.org/svn/sandbox/dbflute/trunk/dbflute-s2jdbc-example/mydbflute/dbflute-0.7.3/templates/om/java/other/s2jdbc/entity/S2jdbcExtendedEntity.vm
>>>
>>>
>>> @javax.persistence.Entity(name="${table.name}")
>>> public class ${myClassName} extends
>>> ${myBaseEntityPackageName}.${myBaseObjectClassName} {
>>>
>>>      結果: 期待した変更にはならず、
>>> @javax.persistence.Entity
>>>                  の、変更前のまま
>>> →変数名の間違い?
>>>
>>> Velocityテンプレートを使用したことが無い事と頭がすっきりしていないことから、
>>> 明日以降、また、月曜日に会社の環境でも確認してからにします。
>>> (テーブル名が命名規則に沿っていないものは1つだけであり、bsではなくentityパッケージに作られるため
>>> 一度手を加えるだけでも問題がないので、単に私の興味のためです)
>>>
>>> ですので問題としては解決しております。
>>> 夜中に迅速な対応をいただき、どうもありがとうございます。
>>>
>>>
>>> 2008/07/12 0:44 kubo <[E-MAIL ADDRESS DELETED]>:
>>>> 久保です。
>>>>
>>>> 早川さん、こんばんは
>>>>
>>>> DBFluteご利用ありがとうございます。
>>>> (DBFlute for S2JDBCのご質問を頂いたのはこのMLでは初めてです)
>>>>
>>>>>  DB項目名  →  JAVAフィールド名 → DB項目名
>>>>> 例1: STATUS1_1 → status11          → STATUS11
>>>>> 例2: CMD_9KETA → cmd9keta          → CMD9KETA  となってしまい、SQL実行時に例外が発生する
>>>>
>>>> なるほど、
>>>> DBFlute-Entityでは必ずColumnアノテーションを付与しているため現象は
>>>> 発生しませんが、S2JDBC-Entityの方ではpublicフィールドで
>>>> そのままカラムのマッピングを表現しているために発生するようですね。
>>>>
>>>> 現状、S2JDBC-Entityの方でColumnアノテーションを
>>>> 付与するオプションは存在しません。
>>>>
>>>>> 3.テーブルの列名を変更する
>>>> これができれば一番良いですが、
>>>> また出てきたときにキリがないですね。
>>>>
>>>> DBFluteのVelocityテンプレート「S2jdbcBaseEntity.vm」
>>>> を直接修正して、Columnアノテーションを付けてはどうでしょうか?
>>>> ${col.name}で、実際のDB上のカラム名が取得できます。
>>>>
>>>> https://www.seasar.org/svn/sandbox/dbflute/trunk/dbflute-s2jdbc-example/mydbflute/dbflute-0.7.3/templates/om/java/other/s2jdbc/entity/S2jdbcBaseEntity.vm
>>>>
>>>>
>>>>> → 一律ルールでは、今回の列名の状態に対応させることが難しい
>>>>>  (単語の末尾に数字が来ることもあれば、先頭に来ることもあり、一律で対処出来そうに無い)
>>>>
>>>> そう考えると、やはりDBFlute-Entityと同様にColumnアノテーションを
>>>> 必ず付与する仕様にした方がいいかもしれませんね。。。
>>>>
>>>>
>>>> 2008/7/12 早川貴彦 <[E-MAIL ADDRESS DELETED]>:
>>>>> 早川と申します。
>>>>>
>>>>> 現在S2JDBCを使用したプロジェクトにおいて、
>>>>> テーブルのentityをDBFlute-S2JDBCを使用して作成しているのですが、
>>>>> 下記のような課題があり、解決策を模索しております。
>>>>>
>>>>> 何らかのよいアイディアは無いでしょうか?
>>>>>
>>>>>
>>>>> [テーブルの状況]
>>>>> 約500テーブルあり
>>>>> その中の1テーブル名と、300近い列名に、
>>>>>
>>>>> STATUS1_1
>>>>> STATUS1_2
>>>>> ・・・
>>>>> のような、camel形式の規約にはそぐわない名前の物が存在する。
>>>>> そのため、
>>>>>
>>>>>  DB項目名  →  JAVAフィールド名 → DB項目名
>>>>> 例1: STATUS1_1 → status11          → STATUS11
>>>>> 例2: CMD_9KETA → cmd9keta          → CMD9KETA  となってしまい、SQL実行時に例外が発生する
>>>>>
>>>>> (テーブル名については自動生成後のentityクラスの @Entity
>>>>> に、  name=テーブル名  を付加する事で対応する予定。)
>>>>>
>>>>>
>>>>> [解決案として調査中の物]
>>>>> 1.自動生成時に何らかの設定により、@Columnアノテーションを付加する
>>>>>  →dbflute-s2jdbc-example のdbflute_exampledb/dfrop内に設定可能な.dfprop
>>>>>  ファイル・設定項目によっては実現できない。
>>>>>  (mydbflute/dbflute_0.7.3/etc/client_directory-template/fullPropertiesも確認)
>>>>> (Web等も確認したが、確認漏れ?)
>>>>>
>>>>> 2.bsではなく、entityパッケージ内のentityクラスに対して、
>>>>> 同名のフィールドを定義しoverrideさせ、@Columnアノテーションを付加する
>>>>> →自動生成によりテーブルとの整合性を取りやすくすることが目的なのに、
>>>>> その趣旨から外れてしまう。
>>>>> (+そもそも問題が発生しないか確認をとれていない)
>>>>>
>>>>> 3.テーブルの列名を変更する
>>>>> →個人的には一番望ましいのだが、他チームとの兼ね合いがあり、
>>>>> 現在交渉中
>>>>>
>>>>> 4.jdbcバッチ実行後の中間xmlファイルにおいて何らかの手を加える
>>>>> →dtdを確認する限り、そのような設定を持っていない
>>>>>
>>>>> 5.名前の変換規則を変える
>>>>> http://s2container.seasar.org/2.4/ja/s2jdbc_entity.html#カラム定義
>>>>> にある、
>>>>> >convention.diconで指定されている org.seasar.framework.convention.impl
>>>>> >       .PersistenceNamingConventionImpl のfromPropertyNameToColumnName()の実装を変える
>>>>>
>>>>> → 一律ルールでは、今回の列名の状態に対応させることが難しい
>>>>>  (単語の末尾に数字が来ることもあれば、先頭に来ることもあり、一律で対処出来そうに無い)
>>>>>
>>>>> 調査中:(パターンを完全に洗い出せば、対応可能?ただ、その場合も今後の新パターンが
>>>>> 出ないように調整が必須)
>>>>>
>>>>>
>>>>> 6.自動生成を最初の1度だけにし、今後については諦める
>>>>> →まだまだ列の追加・変更は発生しそうなため、望ましくない
>>>>>
>>>>> 見落としているWebの資料や、考え方、
>>>>> あるいは他の良い方法はないでしょうか?
>>>>> 以上です。よろしくお願いいたします。
>>>>>
>>>>>
>>>>> --
>>>>> 早川貴彦
>>>>> _______________________________________________
>>>>> Seasar-user mailing list
>>>>> [E-MAIL ADDRESS DELETED]
>>>>> https://ml.seasar.org/mailman/listinfo/seasar-user
>>>>>
>>>> _______________________________________________
>>>> Seasar-user mailing list
>>>> [E-MAIL ADDRESS DELETED]
>>>> https://ml.seasar.org/mailman/listinfo/seasar-user
>>>>
>>>
>>>
>>>
>>> --
>>> 早川貴彦
>>> _______________________________________________
>>> Seasar-user mailing list
>>> [E-MAIL ADDRESS DELETED]
>>> https://ml.seasar.org/mailman/listinfo/seasar-user
>>>
>> _______________________________________________
>> Seasar-user mailing list
>> [E-MAIL ADDRESS DELETED]
>> https://ml.seasar.org/mailman/listinfo/seasar-user
>>
>
>
>
> --
> 早川貴彦
>



-- 
早川貴彦


Seasar-user メーリングリストの案内