[Seasar-user:18223] [Kuina+S2TopLink] BLOBデータの読み込みが失敗する

新田 雅浩 [E-MAIL ADDRESS DELETED]
2009年 8月 7日 (金) 18:11:02 JST


新田と申します。
はじめて投稿させていただきます。

Teeda 1.0.13-sp7
Kuina-Dao 1.0.3
S2TopLink-JPA 1.0.1
Dolteng 0.37.0

で開発を行っております。DBはH2です。

現在、画面から画像データなどの添付ファイルをアップロードし、DBに格納する
処理の実装を行っています。
テーブルにBLOB型のフィールドを定義し、そのカラムにデータを格納しようとし
ています。
ところが、BLOB型のフィールドの読み込みがエラーになってしまっています。
その解決策について質問させてください。

作成したテーブルは、次のようなものです。

-- 添付ファイルテーブル
CREATE TABLE ATTACH_FILE (
    ATTACH_FILE_NO    INT PRIMARY KEY,  -- 添付ファイルNo.
    TITLE             VARCHAR(50),      -- タイトル
    CONTENT           BLOB              -- ファイルの中身
);

このテーブルに対応するエンティティクラス AttachFile と、AttachFileDaoを
Doltengで生成しました。
BLOB型のCONTENTに対応するフィールドとして、次のフィールドとgetter/setter
を定義しました。

    @Lob
    private byte[] content;

    public byte[] getContent() {
        return content;
    }

    public void setContent(byte[] content) {
        this.content = content;
    }

AttachFileDaoをテストするために、AttachFileDaoTestクラスを作成しました。
テストケースは次の2つです。

Test1. 書き込みテスト
画像ファイル(C:\Temp\image1.gif)を読み込んで添付ファイルテーブルに格納す
る。

Test2. 読み込みテスト
添付ファイルテーブルに登録済みのレコードを読み込む。

Test1は成功しますが、Test2がエラーになります。
エラーが発生している箇所は、AttachFileDaoのfindメソッドです。
    public AttachFileDao attachFileDao;

    AttachFile af = attachFileDao.find(1);

コンソールには、次のログが出力されています。

------------------------------------------------------------------------
(前略)
2009-08-07 17:09:10,091 [main] DEBUG org.seasar.framework.container.util.S2ContainerUtil - クラス(jp.co.bitfarm.test.dao.AttachFileDao[attachFileDao])のコンポーネント定義を登録します
2009-08-07 17:09:20,059 [main] DEBUG org.seasar.framework.aop.interceptors.TraceInterceptor - BEGIN jp.co.bitfarm.test.dao.AttachFileDao#find(1)
2009-08-07 17:09:20,095 [main] DEBUG org.seasar.extension.jta.TransactionImpl - トランザクションを開始しました。tx=[FormatId=4360, GlobalId=1249632547674/1, BranchId=]
2009-08-07 17:09:20,165 [main] DEBUG org.seasar.extension.jta.TransactionImpl - トランザクションをコミットしました。tx=[FormatId=4360, GlobalId=1249632547674/1, BranchId=]
2009-08-07 17:09:20,166 [main] DEBUG org.seasar.extension.jta.TransactionImpl - トランザクションを開始しました。tx=[FormatId=4360, GlobalId=1249632547674/2, BranchId=]
2009-08-07 17:09:20,169 [main] DEBUG org.seasar.extension.jta.TransactionImpl - トランザクションをコミットしました。tx=[FormatId=4360, GlobalId=1249632547674/2, BranchId=]
2009-08-07 17:09:20,170 [main] DEBUG org.seasar.extension.jta.TransactionImpl - トランザクションを開始しました。tx=[FormatId=4360, GlobalId=1249632547674/3, BranchId=]
2009-08-07 17:09:20,172 [main] DEBUG org.seasar.extension.jta.TransactionImpl - トランザクションをコミットしました。tx=[FormatId=4360, GlobalId=1249632547674/3, BranchId=]
2009-08-07 17:09:20,187 [main] DEBUG org.seasar.kuina.dao.internal.metadata.DaoMetadataImpl - クラス(interface jp.co.bitfarm.test.dao.AttachFileDao)のメソッド(public abstract jp.co.bitfarm.test.entity.AttachFile jp.co.bitfarm.test.dao.AttachFileDao.find(java.lang.Integer))には(org.seasar.kuina.dao.internal.command.FindCommand)コマンドが適用されます
2009-08-07 17:09:20,254 [main] DEBUG org.seasar.extension.dbcp.impl.ConnectionPoolImpl - 物理的なコネクションを取得しました
2009-08-07 17:09:20,254 [main] DEBUG org.seasar.extension.dbcp.impl.ConnectionPoolImpl - 論理的なコネクションを取得しました。tx=null
[TopLink Fine]: 2009.08.07 05:09:20.254--ServerSession(32219102)--Connection(4702512)--Thread(Thread[main,5,main])--SELECT ATTACH_FILE_NO, TITLE, CONTENT FROM ATTACH_FILE WHERE (ATTACH_FILE_NO = ?)
	bind => [1]
2009-08-07 17:09:20,314 [main] DEBUG org.seasar.extension.dbcp.impl.ConnectionWrapperImpl - 論理的なコネクションを閉じました。tx=null
[TopLink Warning]: 2009.08.07 05:09:20.318--UnitOfWork(29187880)--Thread(Thread[main,5,main])--Exception [TOPLINK-3001] (Oracle TopLink Essentials - 2.0.1 (Build 09d (12/06/2007))): oracle.toplink.essentials.exceptions.ConversionException
Exception Description: The object [[E-MAIL ADDRESS DELETED]], of class [class java.io.ByteArrayInputStream], could not be converted to [class [B].
2009-08-07 17:09:20,335 [main] DEBUG org.seasar.framework.aop.interceptors.TraceInterceptor - END jp.co.bitfarm.test.dao.AttachFileDao#find(1) Throwable:Exception [TOPLINK-3001] (Oracle TopLink Essentials - 2.0.1 (Build 09d (12/06/2007))): oracle.toplink.essentials.exceptions.ConversionException
Exception Description: The object [[E-MAIL ADDRESS DELETED]], of class [class java.io.ByteArrayInputStream], could not be converted to [class [B].
2009-08-07 17:09:44,767 [main] DEBUG org.seasar.extension.dbcp.impl.ConnectionWrapperImpl - 物理的なコネクションを閉じました
------------------------------------------------------------------------

SQLは発行されていますが、java.io.ByteArrayInputStreamでエラーが出ている
ので、BLOBの読み込みがうまくいっていないのではないかと思います。
プログラムに何か問題があるでしょうか?

よろしくお願いいたします。

----------------------
有限会社ビットファーム
新田 雅浩



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