[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 メーリングリストの案内