Oracle9i SQLJオブジェクト型を使用したJavaオブジェクト永続性の実装

Oracle9iのSQLJオブジェクト型のサポートにより、JavaとSQLのOracleデータベースへの統合が強化されています。 Java開発者はこの強力な新機能を使用してJava永続性を実装することができ、SQL開発者はデータベースに格納された 永続Javaオブジェクトに簡単にアクセスし、操作することができます。

SQLJオブジェクト型は、ANSI標準(情報テクノロジ - SQLJ ・パート2: Javaプログラミング言語を使用した SQL型 - ANSI NCITS 331.2-2000)に基づいたユーザー定義オブジェクト型のためのSQL型です。 これは、ANSI/ISO SQL標準の次のリリースのパートJに含まれる予定です。
SQLJオブジェクト型を使用すると、 既存のJavaアプリケーションは、データベースで対応するSQLオブジェクト型を 作成することによってJavaオブジェクト永続性を与えることができます。SQLJオブジェクト型は、オブジェクト表、 オブジェクト・ビュー、型の属性、または リレーショナル表の列の型として使用できます。また、オブジェクト参照によって これらの型のオブジェクトに順にアクセスすることもできます。 さらに、SQLを使用してSQLJオブジェクト型のスキーマ・オブジェクトを問い合せて操作できます。

つまり、SQLJオブジェクト型はJavaクラスにマップされるのです。拡張SQL CREATE TYPEコマンド(DDL文)によって マッピングが「登録」されると、JavaアプリケーションはOracle9iのJDBCドライバを使用してJavaオブジェクトを直接 データベースに挿入したりデータベースから選択することができます。データベースSQLエンジンは、SQL属性または データベースの列として格納されたこれらのJavaオブジェクトのデータ・フィールドにアクセスしたり、 これらのJavaオブジェクトで定義されたメソッドを呼び出すことができます。

データベースでのSQLJオブジェクト型の作成には、一般的に次の3つの手順があります。
  1. データベースによってインスタンスがアクセスされるJavaクラスを作成する。
  2. クラス定義をデータベースにロードする。
  3. Oracle9iの拡張SQL CREATE TYPEコマンドを使用してJava型を表すSQLJオブジェクト型を作成する。
SQLJオブジェクト型用Javaクラス定義の作成
SQLJオブジェクト型を機能的に使用するには、Javaクラスに次のJavaインタフェースのいずれか1つを実装する必要があります。
  • java.sql.SQLData
  • oracle.sql.ORAData(および oracle.sql.ORADataFactory)
SQLJオブジェクト型に対応するJavaクラスは、SQLDataインタフェースまたはORADataおよびORADataFactoryインタフェースを 実装します。Javaクラスは、SQLDataインタフェースを実装するクラスに対してreadSQL()およびwriteSQL()メソッドを使用する か、またはORADataインタフェースを実装するクラスに対してtoDatum()メソッドを使用することによって、 SQLとJavaの間でのデータの移動方法を提供します。

次のコードは、SQLJオブジェクト型PERSON_TのPersonクラスがSQLDataインタフェースを実装する方法を示しています。

import java.sql.*;
import java.io.*;

public class Person implements SQLData
{
 private String sql_type = "SCOTT.PERSON_T";
 public int ssn;
 public String name;
 public Address address;

 public Person () {}

 public String getSQLTypeName() throws SQLException { return sql_type; }

 public void readSQL(SQLInput stream, String typeName) throws SQLException
 {
  sql_type = typeName;
  ssn = stream.readInt();
  name = stream.readString();
  address = stream.readObject();
 }

 public void writeSQL(SQLOutput stream) throws SQLException
 {
  stream.writeInt (ssn);
  stream.writeString (name);
  stream.writeObject (address);
 }

 // other methods
 public int length () { ... }
}


データベースへのJavaクラスのロード
Javaクラスが作成されたら、次の手順ではOracle loadjavaツールを使用してJavaクラスをデータベースにロードします。 loadjavaツールは、SQL*Plusからdbms_java.loadjava ('...')プロシージャを呼び出すことによって起動できます。 次のコマンドは、Personクラスをデータベースにロードするloadjavaツールを示しています。

% loadjava -u SCOTT/TIGER -r -f -v Person.class

データベースでのSQLJオブジェクト型の作成
最後の手順では、拡張SQL CREATE TYPEコマンドを使用してOracle9iデータベースでSQLJオブジェクト型を作成します。 SQLJ型のために、CREATE TYPE文には2つの特別な要素が追加されています。
  • EXTERNAL NAME句は、各SQLJ属性およびメソッドに対応するJava属性およびメソッドと、SQLJ型そのものに対応する Javaクラスの検出に使用されます。
  • USING句は、SQLJ型をサーバーでどのように表すのかを指定するために使用されます。 USING句は、SQLJ型の読取りに使用するインタフェースと格納形式を指定します。
次のコードは、PERSON_TがSQLJオブジェクト型であり、Personがこれに対応するJavaクラスであることを示しています。

CREATE TYPE person_t AS OBJECT EXTERNAL NAME 'Person' LANGUAGE JAVA
USING SQLData
( ss_no number (9) external name 'ssn',
 name VARCHAR2(200) external name 'name',
 address Address_t external name 'address',
 member function length return number external name 'length () return int'
);

person_tが定義されたので、次に示すように、このユーザー定義型に基づいてオブジェクト型を作成することができます。

CREATE TABLE person_objtab of person_t;

これで、データベースSQLエンジンは、SQLJオブジェクト型の属性にアクセスしたりメソッドを呼び出すことができるように なります。たとえば、SQL*Plusで次の問合せを実行できます。

SQL> select p.ss_no from person_objtab p;
SQL> select p.length() from person_objtab p;

まとめると、SQLJオブジェクト型は次のような機能を提供します。
  • 拡張SQL CREATE TYPEコマンドを使用して事前に既存のJavaクラスをSQLに公開し、SQL型とJava型との間に マッピングを作成します。型マップは不要です。
  • データベース内のJavaオブジェクトにアクセスする標準的な方法を提供します。
  • Javaオブジェクトを永続的に格納する標準的な方法を提供します。
  • SQL静的機能を使用してJavaクラスの静的フィールドにアクセスし、副作用を持つSQLメンバー関数を定義します。 これは、UPDATE文で役立ちます。
 
追加情報
 Oracle9i Database マニュアル(ドキュメント) - アプリケーション開発者ガイド - Oracle9i アプリケーション開発者ガイド-オブジェクト・リレーショナル機能
 Oracle9i Database マニュアル(ドキュメント) - Java開発者ガイド - Oracle9i JDBC開発者ガイドおよびリファレンス

Oracle9i Database Daily Feature
 アーカイブ