[Seasar-user:15096] Re: [S2JDBC]Enum型プロパティの場合のDBに格納される値を変更したい

Koichi Kobayashi [E-MAIL ADDRESS DELETED]
2008年 7月 18日 (金) 19:01:09 JST


小林 (koichik) です.

Date:    Fri, 18 Jul 2008 13:13:07 +0900
From:    "田山 博一たやま ひろかず" <[E-MAIL ADDRESS DELETED]>
To:      [E-MAIL ADDRESS DELETED]
Subject: [Seasar-user:15093] [S2JDBC]Enum型プロパティの場合のDBに格納される値を変更したい

> 上記のようなenum型をS2JDBCのEntityのPropertyとして
> 指定した場合、DBには「ENABLE」「DISABLE」という
> 文字列が格納されます。
> 
> このDBに格納される値を、たとえば上記例であれば「0」「1」
> (コード値)に変更したいと考えています。
> 
> 独自のValueTypeの作成と、dialectもしくはPropertyMetaFactory
> の改造で対応できることは確認できましたが、もし可能であれば、
> S2本体で対応していただけないでしょうか。

toString() の値ということだと,DB に格納した値から
Enum に復元する標準的な方法がありません.
# enum の全要素の toString() 値と比較すれば可能では
# ありますが.

toString() の位置づけも pretty print でしかないと
思っているので,enum の toString() 値を保存する方法を
標準でサポートすることには抵抗があります.

ValueTypes に setEnumValueType(Class) メソッドを
用意するので,独自に作成した enum 用のValueType を
dicon で登録するということでどうでしょうか?
例えば s2jdbc.dicon で

<component name="jdbcManager" 
    class="org.seasar.extension.jdbc.manager.JdbcManagerImpl">
  ...
  <initMethod>
    @[E-MAIL ADDRESS DELETED](
      @[E-MAIL ADDRESS DELETED]
  </initMethod>
</components>

のように記述すれば enum に対して MyEnumType が
使われるようになります.

また,今回の例のコードは enum の ordinal() 値と
(たまたま) 同じです.
ordinal() は JPA でもサポートされているので,
S2JDBC でも対応したいと思ってます.

ひとまず EnumOrdinalType は用意するので,上記の
方法で

  <initMethod>
    @[E-MAIL ADDRESS DELETED](
      @[E-MAIL ADDRESS DELETED]
  </initMethod>

を指定すれば enum の name() 値ではなく,ordinal() 値が
使われるようになります.

JPA 仕様のように,@Enumerated アノテーションも
サポートしたいと思ってますが,パラメータに渡された
enum の扱いが悩ましい...


-- 
<component name="koichik">
    <property name="fullName">"Koichi Kobayashi"</property>
    <property name="email">"[E-MAIL ADDRESS DELETED]"</property>
    <property name="blog">"http://d.hatena.ne.jp/koichik"</property>
</component>



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