2013年10月25日金曜日

S2JDBC 列挙型を名前で使う

こんにちは。

S2JDBCでハマった事について(DBはPostgreSQL9.2)。
※ S2JDBCに特化した話題です。

■ 列挙型定義
以下の列挙型を定義します。

class enum TestEnum {
    A,B,C;
}

■ テーブル定義
データベースには以下のようなテーブルを定義します。

create table TEST (
  id serial,
  test varchar(1)
);

■ Entityクラスの作成
以下のEntityクラスを作成します。

class TestEntity {
    public id;

    @Enumerated(EnumType.STRING)
    public test;
}

■ DBにアクセスするクラスを作成

public class MainProgram {

    public void process() {
        SingletonS2ContainerFactory.init();
        JdbcManager jdbcManager = SingletonS2Container.getComponent("jdbcManager");
        List<TestEntity> result = jdbcManager.selectBySql(
                TestEntity.class,
                "select * from TEST",
                new Object[]{}
        ).getResultList();
        // omitted below - 以下、略 -
    }

    public static void main(String...args) {
        (new MainProgram()).process();
    }
}

--------
ポイントは、

  • エンティティのフィールドに列挙型を使用している
  • 列挙型を名前で扱う@アノテーションをつけている

という点です。

つまり、テーブル TEST のカラム test には、A, B, C という文字列が格納される想定です。
これを select すると、TestEntity.test を enum として取得できることを期待していました。

S2JDBCは基本的にJPA準拠なので、列挙型を名前で扱う場合、
このように「@Enumerated(EnumType.STRING)」と記載することになっているようです。

  • enum型を序数として扱いたい → EnumType.ORDINAL
  • enum型を名前として扱いたい → EnumType.STRING


ところが、このコードを実行すると、どうしても例外が発生してしまっていたのです。

例外の内容は以下。

Exception in thread "main" org.seasar.framework.exception.SQLRuntimeException: [ESSR0072]SQLで例外(SQL=[], Message=[型 int : hour で不正な値], ErrorCode=0, SQLState=22003)が発生しました

デバッグしてみると、どうやら@アノテーションで EnumType.STRING を指定してるにも関わらず、
EnumType.ORDINAL として処理していた(序数として扱っていた)が為に
[型 int : hour で不正な値]と出てしまっていたようです。


公式ドキュメントを探してみると以下のように記載されていました。

Seasar2.4.26 までは、@Enumerated アノテーションには対応していなく固定で名前が扱われるようになっていたようです。
現在の Seasar2.4.27 以降は、j2jdbc.dicon に以下の青字部分の記載を付け足す必要があったのです。

<component name="jdbcManager" class="org.seasar.extension.jdbc.manager.JdbcManagerImpl">
    <initMethod>
    @org.seasar.extension.jdbc.types.ValueTypes@setEnumDefaultValueType(
    @org.seasar.extension.jdbc.types.EnumType@class)
    </initMethod>
    ・・・略・・・
</component>


2011年8月5日金曜日

mobylet

少し前の話ですが、Seasar2で調べごとをしていたら、
リンク集に、ひときわ目を引くリンクがありました。

ここです。
http://mobylet.seasar.org/

携帯サイトならではの色々な機能を備えた
Webアプリケーションフレームワークを公開しています。
モバイルコンテンツを開発している方で知らなかったら、
一見の価値はあるのではないかと思います。

携帯キャリヤ判定
絵文字を、PCに対しては画像で表示し、携帯に対しては
それぞれのキャリヤを判別して然るべき表示形式で
クライアントに表示してくれます。
凄いのは、i-modeの絵文字をAUの絵文字でよく似ているものに
対応させて表示してくれちゃう所。

私が使ったバージョンではSoftbank, AU, docomoの
3キャリヤの絵文字を相互変換する機能が備わっていました。
そろそろスマートフォン対応とかしちゃってるのかな?

通常、携帯の絵文字をPCで見ると「=」のような記号に
書き換わって、いわゆる文字化けと呼ばれる現象が起きますが、
このフレームワークを採用していると自動的に画像に
置き換えてくれます。

他にも、Google Maps APIやGPSと連携した機能なんかも
備えています。
ちょっとしたWebアプリケーションを開発するなら
フリーで手に入るこちらをお使いになるのがお勧めかもしれません。

ちなみに、私はこのフレームワークをStrutsと組み合わせて使っていました。

このブログにあれやこれや書いても仕方ないので
気になった方は是非Webサイトをご覧あれ。