The Apache DB ProjectObJectRelationalBridge

Jakarta OJB

ダウンロード

チュートリアル

ユーザ ドキュメント

システム ドキュメント

開発

日本語訳 (Translations)

オリジナル

JDBC TypeからJava Typeへのマッピング

OJBは、JDBC Type/Java Type 間のマッピング規則をJDBC2.0の定義に基づいて実装しています。
以下の表をご覧下さい:

JDBC Type Java Type
CHAR String
VARCHAR String
LONGVARCHAR String
NUMERIC java.math.BigDecimal
DECIMAL java.math.BigDecimal
BIT boolean
TINYINT byte
SMALLINT short
INTEGER int
BIGINT long
REAL float
FLOAT double
DOUBLE double
BINARY byte[]
VARBINARY byte[]
LONGVARBINARY byte[]
DATE java.sql.Date
TIME java.sql.Time
TIMESTAMP java.sql.Timestamp
CLOB Clob
BLOB Blob
ARRAY Array
DISTINCT mapping of underlying type
STRUCT Struct
REF Ref
JAVA_OBJECT underlying Java class
defining type- and value conversions
introduction

O/Rツールの典型的な問題は、データ型のミスマッチにあります: ドメインモデルのクラスには、ブール値の属性がありますが、対応するデータベーステーブルでは、この属性をbit型あるいはint型として格納します。

以下の例では、適切な型変換と値変換を行うConversionStrategyインタフェースをOJBがどのようにどのように規定するかを説明します。

以下の例のソースコードは、OJBの配布版に含まれており、test.ojb.brokerパッケージ内に置かれています。

the problem

test.ojb.broker.Articleクラスは、ブール型であるisSelloutArticleの属性を含んでいるとします:

public class Article implements InterfaceArticle
{
    protected int articleId;
    protected String articleName;

    /** maps to db-column Auslaufartikel of type int */
    protected boolean isSelloutArticle;

    ...
}

対応するテーブルは、この属性を格納するためAuslaufartikelフィールドを使用します:

CREATE TABLE Artikel (
    Artikel_Nr         INT PRIMARY KEY,
    Artikelname        CHAR(60),
    Lieferanten_Nr     INT,
    Kategorie_Nr       INT,
    Liefereinheit      CHAR(30),
    Einzelpreis        DECIMAL,
    Lagerbestand       INT,
    BestellteEinheiten INT,
    MindestBestand     INT,
    Auslaufartikel     INT
  )
the solution

適切なマッピングを可能とする為、OJBでは、ConversionStrategyという インタフェースをImplementしたクラスを定義することが可能です。 上で示した問題に対処する為、以下のArticleConversionStrategyクラスを 定義する事にします。 ArticleConversionStrategyクラスは、ojb.broker.ConversionStrategyインターフェースを 実装しており、2つのメソッドが用意されているものとします:javaToSql 及び sqlToJava.

sqlToJavaメソッドは、JDBCのResultSetからオブジェクトの属性を読み込む際に、OJBのブローカ内でコールバックをします。ConversionStrategyは、クラス毎に定義されます。 Thus we have to implement behaviour for all persistent attributes of the class. In this case I just implement special behaviour for the attribute isSelloutArticle, for all other attributes the input value is returned unmodified.

But if this method is called for the attribute isSelloutArticle it maps the incoming (from the JDBC resultset) Integer values to the corresponding Boolean values. The mapping from Boolean values to the attributes primitive type boolean is done by the OJB broker internally by means of Java reflection.

javaToSqlメソッドは、新規あるいは更新されたオブジェクトの、SQL上の挿入(insert)・更新(update)といった逆変換を記述するのに使われます。

public class ArticleConversionStrategy implements ojb.broker.ConversionStrategy
{

    private Integer i_true  = new Integer(1);
    private Integer i_false = new Integer(0);

    private Boolean b_true = new Boolean(true);
    private Boolean b_false = new Boolean(false);



    public Object javaToSql(Object source, FieldDescriptor fld)
    {
        if (fld.getPersistentField().getName().equals("isSelloutArticle"))
        {
            if (source.equals(b_true)) return i_true;
            else return i_false;
        }
        else return source;
    }

    public Object sqlToJava(Object source, FieldDescriptor fld)
    {
        if (fld.getPersistentField().getName().equals("isSelloutArticle"))
        {
            if (source.equals(i_true)) return b_true;
            else return b_false;
        }
        else return source;
    }
}

あと一つだけ、まだやらなければならない事が残っています: ConversionStrategyをArticleクラスが使用する、ということをOJBに伝えなければなりません。XMLレポジトリでこの作業ができます。 ClassDescriptorにて、Strategyクラスの完全修飾名で宣言する<conversionStrategy>要素を規定することが出来ます。

<!-- Definitions for test.ojb.broker.Article -->
   <ClassDescriptor id="1">
      <class.name>test.ojb.broker.Article</class.name>
      <class.proxy>test.ojb.broker.ArticleProxy</class.proxy>
      <class.extent>test.ojb.broker.BookArticle</class.extent>
      <class.extent>test.ojb.broker.CdArticle</class.extent>
      <table.name>Artikel</table.name>
      <conversionStrategy>test.ojb.broker.ArticleConversionStrategy</conversionStrategy>
      ...

      <FieldDescriptor id="10">
         <field.name>isSelloutArticle</field.name>
         <column.name>Auslaufartikel</column.name>
         <jdbc_type>INT</jdbc_type>
      </FieldDescriptor>
      ...

   </ClassDescriptor>

Copyright © 1999-2007, Apache Software Foundation
Translated into Japanese by Tetsuya Kitahata, powered by Terra-International, Inc.
Original English Page would be found from HERE     --    ApacheNews    ASF プロジェクト一覧
Terra-International, Inc. -- テラ・インターナショナル
Special Thanks -- 【お問い合わせ/テキスト広告】