(57)【特許請求の範囲】
【請求項１】
リレーショナル・データベース管理システムを用いて永続オブジェクトを管理する永続オブジェクト管理装置であって，
関連あるオブジェクトをグループとして管理するための，各オブジェクトとグループの対応関係を示すグループ構成データおよびグループの状態を示すグループ状態データを有するグループ管理情報を生成するオブジェクト・グループ管理情報生成装置と，
前記オブジェクト・グループ管理情報生成装置が生成したグループ管理情報をもとに，関連あるオブジェクトをまとめてリレーショナル・データベース管理システムから取り出すオブジェクト・グループ管理装置とを備え，
前記オブジェクト・グループ管理情報生成装置は，
指定されたオブジェクトに，個々のオブジェクトを識別するユニークなＩＤ値をオブジェクトＩＤとして割り当てるオブジェクトＩＤ割当て手段と，
指定されたオブジェクトに対応するリレーショナル・データベースのテーブル中に，前記オブジェクトＩＤの格納領域を追加するオブジェクトＩＤデータ領域生成手段と，
新しいグループに，個々のグループを識別するためのユニークなＩＤ値をグループＩＤとして割り当て，グループＩＤと１つ以上のオブジェクトＩＤとの対応情報からなる前記グループ構成データおよびグループＩＤとその状態情報の組からなる前記グループ状態データとを生成するグループデータ生成手段と，
オブジェクトのグループを登録する際に呼び出され，アプリケーション・プログラムまたは管理用ユーザ・インタフェースからグループ指定された１つ以上のオブジェクトが入力されると，入力されたオブジェクトがオブジェクトＩＤを持っているかどうかを調べ，オブジェクトＩＤを持っていない場合には，前記オブジェクトＩＤ割当て手段によって，前記オブジェクトＩＤの割り当てを行い，入力されたオブジェクトに対応するリレーショナル・データベースのテーブル中に，オブジェクトＩＤの格納領域がない場合には，前記ＩＤデータ領域生成手段によってその格納領域を当該テーブル中に追加し，前記オブジェクトＩＤを当該テーブル中の前記格納領域に設定し，前記グループデータ生成手段に前記グループ構成データと前記グループ状態データとを生成させるオブジェクト・グループ構成データ登録手段とを備える
ことを特徴とする永続オブジェクト管理装置。
【請求項２】
請求項１記載の永続オブジェクト管理装置において，
前記オブジェクト・グループ管理装置は，グループ内のオブジェクトをリレーショナル・データベース管理システムから取り出すと，前記グループ構成データをもとに同じグループに属する他のオブジェクトも自動的にまとめてリレーショナル・データベース管理システムから取り出す手段を備える
ことを特徴とする永続オブジェクト管理装置。
【請求項３】
請求項１記載の永続オブジェクト管理装置において，
前記オブジェクト・グループ管理装置は，前記グループ構成データをもとに関連のあるオブジェクトをまとめてリレーショナル・データベース管理システムに保存する手段を備える
ことを特徴とする永続オブジェクト管理装置。
【請求項４】
請求項１記載の永続オブジェクト管理装置において，
前記オブジェクト・グループ管理装置は，グループ内のオブジェクトをリレーショナル・データベース管理システムに保存すると，前記グループ構成データをもとに同じグループに属する他のオブジェクトも自動的にまとめてリレーショナル・データベース管理システムに保存する手段を備える
ことを特徴とする永続オブジェクト管理装置。
【請求項５】
請求項１記載の永続オブジェクト管理装置において，
前記オブジェクト・グループ管理装置は，オブジェクトのグループを単位としてロックを設定する手段およびロックを解除する手段を備え，
グループごとのロック状態の情報を前記グループ状態データとして記憶し，ロック状態のグループのオブジェクトに対する書き込みまたは読み出しのアクセスを禁止することにより，オブジェクト間の一貫性を保つ
ことを特徴とする永続オブジェクト管理装置。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は，オブジェクト指向で記述されたソフトウェアにおいて，オブジェクトの永続性をリレーショナル・データベース管理システム（以下，ＲＤＢＭＳという）で実現する場合に，オブジェクトのグループ単位でＲＤＢＭＳとのアクセス（取り出し，保存，ロック，ロック解除等）を行う永続オブジェクト管理装置に関し，これにより，関連する永続オブジェクト間の一貫性を保持することを可能にしたものである。
【０００２】
【従来の技術】
永続オブジェクトとは，一時的に生成，消滅するオブジェクトではなく，データベース管理システム等により永続的に管理されるオブジェクトである。従来の永続オブジェクトの管理では，例えばＲＤＢＭＳを直接利用して，オブジェクトのデータをデータベース中に保存することにより，オブジェクトの永続性を実現していた。しかし，従来，任意のオブジェクトのグループ単位でのＲＤＢＭＳからのデータの取り出しや，ＲＤＢＭＳへのデータの保存を行う手段がなく，また，オブジェクトのグループ単位でのロックやロック解除を行う手段がないため，関連する１オブジェクトごとに取り出しやロック／ロック解除を行う必要があった。
【０００３】
【発明が解決しようとする課題】
あるオブジェクトを取り出し更新する場合，すなわち，データベース中に格納されたオブジェクトのデータを取り出し，更新する場合などには，そのオブジェクトと関連するオブジェクトもまとめてデータの取り出し，保存，ロック／ロック解除等を行わないと，オブジェクト間のデータの一貫性を保持することができなくなる。
【０００４】
しかし，従来のＲＤＢＭＳを直接利用する方法では，任意のオブジェクトのグループ単位でのＲＤＢＭＳのデータの取り出しや保存，オブジェクトのグループ単位でのロック／ロック解除を行う手段がないため，関連オブジェクト間の一貫性を保つことが困難であり，アプリケーション・プログラム等の開発負担が大きく，また，開発されたプログラムのメンテナンスも困難であるという問題があった。
【０００５】
本発明は上記問題点の解決を図り，任意のオブジェクトのグループ単位で，ＲＤＢＭＳとのアクセスを可能とする手段を提供することにより，関連オブジェクト間の一貫性を簡単に保つことができるようにすることを目的とする。
【０００６】
【課題を解決するための手段】
図１は，本発明の原理説明図である。図中，１０はオブジェクト・グループ管理情報生成装置，２０はオブジェクト・グループ管理装置，３０はリレーショナル・データベース管理システム（ＲＤＢＭＳ），４０はリレーショナル・データベースを表す。
【０００７】
オブジェクト・グループ管理情報生成装置１０は，個々のオブジェクトとそれを含むグループとを対応づけ，グループの状態を保持するために必要なデータをＲＤＢＭＳ３０内に自動生成する装置である。
【０００８】
オブジェクト・グループ管理装置２０は，指定されたグループのオブジェクトをまとめてＲＤＢＭＳ３０から取り出す手段，あるオブジェクトをＲＤＢＭＳ３０から取り出すと同じグループ内のオブジェクトも自動的にまとめてＲＤＢＭＳ３０から取り出す手段，オブジェクトのグループにロックをかける手段，オブジェクトのグループにかけたロックを解除する手段，指定されたグループのオブジェクトをまとめてＲＤＢＭＳ３０へ保存する手段，あるオブジェクトをＲＤＢＭＳ３０へ保存すると同じグループ内のオブジェクトも自動的にまとめてＲＤＢＭＳ３０へ保存する手段等を持つ装置である。
【０００９】
ＲＤＢＭＳ３０は，リレーショナル・データベース４０を管理し，リレーショナル・データベース４０に対する入出力を実行する装置であり，従来用いられているリレーショナル・データベース管理システムと同様のものである。
【００１０】
オブジェクト・グループ管理情報生成装置１０およびオブジェクト・グループ管理装置２０は，例えばオブジェクト指向のソフトウェア（オブジェクト）として，実現することができる。
【００１１】
本発明の作用は以下のとおりである。
オブジェクト・グループ管理情報生成装置１０は，オブジェクトのグループが指定されると，指定されたオブジェクトとグループの対応関係を示すデータ（グループ構成データ）およびグループの状態を示すデータ（グループ状態データ）をＲＤＢＭＳ３０内に自動的に生成する。
【００１２】
例えば，アプリケーションの起動時，オブジェクトの更新時，検索時等においてオブジェクトを取り出す場合には，取り出したいオブジェクトのグループを指定すると，オブジェクト・グループ管理装置２０は，オブジェクト・グループ管理情報生成装置１０が生成したグループ構成データを用いて，グループ内のオブジェクトを全て検索し，それらをまとめてＲＤＢＭＳ３０から取り出す。
【００１３】
また，取り出したいオブジェクトを指定すると，オブジェクト・グループ管理装置２０は，オブジェクト・グループ管理情報生成装置１０が生成したグループ構成データを用いて，先ずそのオブジェクトが属するグループを特定し，次にそのグループ内のオブジェクトを全て検索し，まとめてＲＤＢＭＳ３０から取り出す。
【００１４】
あるグループに対するアクセスをロック／ロック解除したい場合には，オブジェクト・グループ管理装置２０は，オブジェクト・グループ管理情報生成装置１０が生成したグループ構成データを用いて，そのグループを単位としてロック／ロック解除を行い，オブジェクト・グループ管理情報生成装置１０が生成したグループ状態データのロック／ロック解除の状態を書き換え，指定されたオブジェクトのグループがロックされた状態にあるかどうかを示す。あるグループがロックされた状態にある場合には，オブジェクト・グループ管理装置２０は，そのグループまたはそのグループに属するオブジェクトに対する更新を受け付けないようにする。
【００１５】
保存したいグループを指定すると，オブジェクト・グループ管理装置２０は，オブジェクト・グループ管理情報生成装置１０が生成したグループ構成データを用いて，グループ内の全オブジェクトをＲＤＢＭＳ３０へ保存する。
【００１６】
保存したいオブジェクトを指定すると，オブジェクト・グループ管理装置２０は，オブジェクト・グループ管理情報生成装置１０が生成したグループ構成データを用いて，まずオブジェクトが属するグループを特定し，次にそのグループ内のオブジェクトを全て検索し，まとめてＲＤＢＭＳ３０へ保存する。
【００１７】
【発明の実施の形態】
図２は，本発明の実施の一形態における構成例を示す図である。
図２中，１０はオブジェクト・グループ管理情報生成装置，１１はオブジェクト・グループ構成データ登録部，１２はオブジェクトＩＤ割当て部，１３はオブジェクトＩＤデータ領域生成部，１４はグループデータ生成部，２０はオブジェクト・グループ管理装置，２１はグループ取出し部，２２はオブジェクト・グループ取出し部，２３はグループ・ロック設定部，２４はグループ・ロック解除部，２５はグループ更新部，２６はグループ・ロック状態チェック部，２７はオブジェクト・グループ更新部，３０はリレーショナル・データベース管理システム（ＲＤＢＭＳ），４０はリレーショナル・データベース，５０はアプリケーション・プログラムまたは管理用ユーザ・インタフェースを表す。
【００１８】
図３は，本実施の形態における管理テーブルの構成例を示す図である。
図３（ａ）はリレーショナル・データベース４０に保存される各オブジェクトに対応するテーブル６０，図３（ｂ）はオブジェクトとグループの対応関係を記憶するオブジェクト・グループ構成テーブル６１，図３（ｃ）はグループの状態を記憶するグループ状態テーブル６２を示す。
【００１９】
〔１〕オブジェクトのグループを登録する場合
アプリケーション・プログラムまたは管理用ユーザ・インタフェース５０からグループ指定された１つ以上のオブジェクトが入力されると，オブジェクト・グループ構成データ登録部１１は，入力されたオブジェクトがＩＤを持っているかどうかを調べ，ＩＤを持っていない場合には，オブジェクトＩＤ割当て部１２にそのオブジェクトを入力する。
【００２０】
オブジェクトＩＤ割当て部１２は，入力されたオブジェクトに新たにユニークなＩＤ値を割り当て，そのオブジェクトに対応するテーブル６０のｏｂｊｅｃｔ＿ｉｄ列の値を更新する。
【００２１】
入力されたオブジェクトのテーブル６０にｏｂｊｅｃｔ＿ｉｄ列がない場合には，オブジェクト・グループ構成データ登録部１１は，オブジェクトＩＤデータ領域生成部１３にそのオブジェクト名を入力し，対応するテーブル６０にｏｂｊｅｃｔ＿ｉｄ列を新たに追加する。この処理は，既存プログラムのオブジェクトを流用した場合にも，本発明を利用することができるようにすることを考慮したものである。
【００２２】
入力されたオブジェクトにｏｂｊｅｃｔ＿ｉｄが割り当てられている場合には，オブジェクト・グループ構成データ登録部１１は，グループデータ生成部１４にオブジェクトを入力する。
【００２３】
グループデータ生成部１４は，新しいグループのＩＤ値を割り当て，オブジェクト・グループ構成テーブル６１にそのグループのＩＤとそれに属するオブジェクトのＩＤを持つ新しい行を追加する。また，グループ状態テーブル６２に，新しいグループのＩＤを持つ行を追加する。
【００２４】
図３は，３つのオブジェクトが１つのグループとして登録される場合の例を示しており，図３（ａ）に示す各オブジェクトに対応するテーブル６０Ａ，６０Ｂ，６０Ｃのｏｂｊｅｃｔ＿ｉｄ列には，それぞれのオブジェクトのＩＤ値として，１，２，３が割り当てられている。
【００２５】
オブジェクト・グループ構成テーブル６１には，図３（ｂ）に示すように，ｇｒｏｕｐ＿ｉｄ列に新たなグループのＩＤ値の１と，ｏｂｊｅｃｔ＿ｉｄ列にグループを構成するオブジェクトのＩＤ値の１，２，３との組からなる行が追加される。
【００２６】
さらに，図３（ｃ）のグループ状態テーブル６２には，新たに登録されるグループの状態がｓｔａｔｕｓ列に設定される。このｓｔａｔｕｓ列には，例えばグループ（ｇｒｏｕｐ＿ｉｄ＝１）がロックされた状態である場合にはｌｏｃｋｅｄ，ロックされていない状態である場合にはｕｎｌｏｃｋｅｄの旨が設定される。
【００２７】
図４は，新しいオブジェクトのグループのデータを生成する処理のフローを示している。
ステップＳ１では，グループ指定された１つ以上のオブジェクトが入力される。
【００２８】
ステップＳ２では，入力されたオブジェクトを順に調べる。
ステップＳ３では，入力されたオブジェクトがＩＤ値を持つかどうかを判定する。オブジェクトがＩＤ値を持つときはステップＳ７へ進み，ＩＤ値を持たないときはステップＳ４へ進む。
【００２９】
ステップＳ４では，オブジェクトに対応するテーブル６０が，ｏｂｊｅｃｔ＿ｉｄ列を持つかどうかを判定する。テーブル６０がｏｂｊｅｃｔ＿ｉｄ列を持つときはステップＳ６へ進み，ｏｂｊｅｃｔ＿ｉｄ列を持たないときはステップＳ５の処理を行う。
【００３０】
ステップＳ５では，オブジェクトに対応するテーブル６０にｏｂｊｅｃｔ＿ｉｄ列を追加する。
ステップＳ６では，オブジェクトにＩＤ値を割り当て，そのオブジェクトに対応する行のｏｂｊｅｃｔ＿ｉｄ列を，割り当てられたＩＤ値で更新する。
【００３１】
ステップＳ７では，グループ指定された全てのオブジェクトについて調べたかどうかを判定し，全てのオブジェクトについて調べたときはステップＳ８へ進み，全てのオブジェクトについて調べていないときはステップＳ２の処理へ戻って同様に処理を繰り返す。
【００３２】
ステップＳ８では，新しいグループのＩＤ値を割り当てる。
ステップＳ９では，オブジェクト・グループ構成テーブル６１に，グループ指定されたオブジェクト毎に新しい行を追加する。新しい行のｇｒｏｕｐ＿ｉｄ列には新しいグループのＩＤ値を，ｏｂｊｅｃｔ＿ｉｄ列には各オブジェクトのＩＤ値を格納する。
【００３３】
ステップＳ１０では，グループ状態テーブル６２に，ｇｒｏｕｐ＿ｉｄが新しいグループのＩＤ値である新しい行を追加する。
〔２〕グループを指定して全てのオブジェクトを取り出す場合
アプリケーション・プログラムまたは管理用ユーザ・インタフェース５０から，取り出すグループのグループＩＤがグループ取出し部２１に入力される。
【００３４】
グループ取出し部２１は，オブジェクト・グループ構成テーブル６１を検索し，入力されたグループＩＤに対応するオブジェクトのＩＤを得る。次に，オブジェクトに対応する全てのテーブル６０を検索し，オブジェクトのＩＤに一致する行を得て，この行のデータからオブジェクトを生成する。
【００３５】
図５は，グループを指定してオブジェクトをまとめて取り出す処理のフローを示している。
ステップＳ１１では，グループ取出し部２１にグループのＩＤ値が入力される。
【００３６】
ステップＳ１２では，グループ取出し部２１は，オブジェクト・グループ構成テーブル６１を検索し，ｇｒｏｕｐ＿ｉｄの値が入力されたＩＤ値と一致する行からオブジェクトのＩＤを得る。
【００３７】
ステップＳ１３では，ステップＳ１２の処理で得たオブジェクトのＩＤで，各オブジェクトに対応する全てのテーブル６０を検索する。
ステップＳ１４では，検索の結果得られた行のデータからオブジェクトを生成する。
【００３８】
〔３〕あるオブジェクトを指定して，そのオブジェクトが属するグループ全てのオブジェクトを取り出す場合
取り出すオブジェクトのＩＤ値が，アプリケーション・プログラムまたは管理用ユーザ・インタフェース５０からオブジェクト・グループ取出し部２２に入力される。
【００３９】
オブジェクト・グループ取出し部２２は，オブジェクト・グループ構成テーブル６１を検索し，オブジェクトのＩＤと対応するグループのＩＤを得て，この値をグループ取出し部２１に入力する。以降は，前項〔２〕において説明した処理と同様である。
【００４０】
図６は，あるオブジェクトを指定して，そのオブジェクトが属するグループの全てのオブジェクトを取り出す処理のフローを示している。
ステップＳ１５では，オブジェクト・グループ取出し部２２にオブジェクトのＩＤ値が入力される。
【００４１】
ステップＳ１６では，オブジェクト・グループ取出し部２２は，オブジェクト・グループ構成テーブル６１を検索し，ｏｂｊｅｃｔ＿ｉｄの値が，入力されたＩＤ値と一致する行からグループのＩＤを得る。
【００４２】
ステップＳ１７では，ステップＳ１６の処理で得たグループＩＤをグループ取出し部２１に入力する。以降，グループ取出し部２１により，図５に示すステップＳ１１〜Ｓ１４の処理が行われる。
【００４３】
〔４〕グループにロック設定／ロック解除の処理の場合
以下では，説明を簡単にするために，ロックの種類はアクセス禁止の１種類として説明するが，グループに対するロックとして，例えば書き換え禁止や，読み出し禁止等の複数のレベルのロックを行ってもよい。
【００４４】
アプリケーション・プログラムまたは管理用ユーザ・インタフェース５０から，ロックをかけたいグループのＩＤが，グループ・ロック設定部２３に入力される。グループ・ロック設定部２３は，グループ状態テーブル６２のグループＩＤに対する行のｓｔａｔｕｓ列のデータをｌｏｃｋｅｄ（ロック状態）に書き換える。
【００４５】
図７は，グループにロックをかける処理のフローを示している。
ステップＳ２１では，グループ・ロック設定部２３にグループのＩＤ値が入力される。
【００４６】
ステップＳ２２では，グループ状態テーブル６２を検索し，ｇｒｏｕｐ＿ｉｄの値が入力されたＩＤ値と一致する行のｓｔａｔｕｓ列の値をｌｏｃｋｅｄ（ロック状態）に書き換える。
【００４７】
反対にグループのロックを解除する場合には，アプリケーション・プログラムまたは管理用ユーザ・インタフェース５０からロックを解除したいグループのＩＤが，グループ・ロック解除部２４に入力される。グループ・ロック解除部２４は，グループ状態テーブル６２のグループＩＤに対する行のｓｔａｔｕｓ列の値をロック解除状態に書き換える。
【００４８】
図８は，グループのロックを解除する処理のフローを示している。
ステップＳ２３では，グループ・ロック解除部２４にグループのＩＤ値が入力される。
【００４９】
ステップＳ２４では，グループ状態テーブル６２を検索し，ｇｒｏｕｐ＿ｉｄの値が入力されたＩＤ値と一致する行のｓｔａｔｕｓ列の値をロック解除状態に書き換える。
【００５０】
〔５〕グループを指定してオブジェクトをまとめて更新する場合
アプリケーション・プログラムまたは管理用ユーザ・インタフェース５０から，更新するグループのＩＤがグループ更新部２５に入力される。
【００５１】
グループ更新部２５は，グループ・ロック状態チェック部２６にグループＩＤを入力する。
グループ・ロック状態チェック部２６は，グループ状態テーブル６２を検索し，入力されたグループＩＤに対応するｓｔａｔｕｓ列の値がロック状態であれば，更新できない旨のメッセージを出して処理を終了する。ここで，入力されたグループＩＤに対応するｓｔａｔｕｓ列の値がロック状態でなければ，オブジェクト・グループ構成テーブル６１を検索し，入力されたグループＩＤに対応するオブジェクトのＩＤを得る。次に，このオブジェクトＩＤに対応する全ての行のデータをまとめて更新する。
【００５２】
図９は，グループを指定してオブジェクトをまとめて更新する処理のフローを示している。
ステップＳ３１では，グループ更新部２５に，更新対象とするグループのＩＤ値が入力される。
【００５３】
ステップＳ３２では，グループ状態テーブル６２を検索し，グループがロック状態であるかどうかを調べる。
ステップＳ３３では，グループがロック状態であるかどうかの判定を行い，ロック状態であればステップＳ３６の処理を行い，ロック状態でなければステップＳ３４へ進む。
【００５４】
ステップＳ３４では，オブジェクト・グループ構成テーブル６１を検索し，ｇｒｏｕｐ＿ｉｄの値が入力されたＩＤ値と一致する行からオブジェクトのＩＤを得る。
【００５５】
ステップＳ３５では，ステップＳ３４で得たオブジェクトのＩＤに対応する全ての行のデータを更新する。
ステップＳ３６では，更新できない旨のメッセージを出す。
【００５６】
〔６〕あるオブジェクトを指定して，そのオブジェクトが属するグループの全てのオブジェクトをまとめて更新する場合
アプリケーション・プログラムまたは管理用ユーザ・インタフェース５０から，更新するグループに属するオブジェクトのＩＤがオブジェクト・グループ更新部２７に入力される。
【００５７】
オブジェクト・グループ更新部２７は，オブジェクト・グループ構成テーブル６１を検索し，オブジェクトのＩＤと対応するグループのＩＤを得る。この値をグループ更新部２５に入力する。以降の処理は，前項〔５〕において説明した処理と同様である。
【００５８】
図１０は，あるオブジェクトを指定して，そのオブジェクトが属するグループの全てのオブジェクトを更新する処理のフローを示している。
ステップＳ４１では，オブジェクト・グループ更新部２７にオブジェクトのＩＤ値が入力される。
【００５９】
ステップＳ４２では，オブジェクト・グループ構成テーブル６１を検索し，ｏｂｊｅｃｔ＿ｉｄの値が入力されたＩＤ値と一致する行からグループのＩＤを得る。
【００６０】
ステップＳ４３では，グループＩＤがあるかどうかを判定する。グループＩＤがあるときはステップＳ４４の処理を行い，グループＩＤがないときはステップＳ４５の処理を行う。
【００６１】
ステップＳ４４では，グループＩＤをグループ更新部２５に入力する。以降は図９に示す処理が行われる。
ステップＳ４５では，指定されたＩＤのオブジェクトのみを更新する。
【００６２】
【実施例】
次に，本発明の一実施例として，宿泊予約業務プログラムを，オブジェクト指向ソフトウェアで実現した場合の例を説明する。
【００６３】
図１１は，実施例におけるオブジェクト指向ソフトウェア言語で表わした各処理部の構成例を示している。
図２に示すオブジェクト・グループ管理情報生成装置１０は，オブジェクト・グループ管理情報生成オブジェクト〔オブジェクト名：ＯＧＧｅｎｅｒａｔｏｒ（図中，ＯＧＧｎｒと表す）〕１１０により実現され，オブジェクト・グループ管理装置２０は，オブジェクト・グループ管理オブジェクト〔オブジェクト名：ＯＧＭａｎａｇｅｒ（図中，ＯＧＭｎｇと表す）〕１２０により実現される。
【００６４】
図２に示すオブジェクト・グループ管理情報生成装置１０の持つ各手段は，ＯＧＧｅｎｅｒａｔｏｒ１１０のオブジェクト・グループ構成データ登録部〔ｉｎｔ  ＯＧＧｅｎｅｒａｔｏｒ：：ｅｎｔｅｒ（ＰＯｂｊＧｒｏｕｐ  ＊ｐｏｇ）〕１１１，オブジェクトＩＤ割当て部〔ｉｎｔ  ＯＧＧｅｎｅｒａｔｏｒ：：ａｓｓｉｇｎ＿ｏｉｄ（）〕１１２，グループデータ生成部〔ｉｎｔ  ＯＧＧｅｎｅｒａｔｏｒ：：ｃｒｅａｔｅ＿ｇｒｏｕｐ（ＰＯｂｊＧｒｏｕｐ  ＊ｐｏｇ）〕１１３，グループＩＤ割当て部〔ｉｎｔ  ＯＧＧｅｎｅｔａｔｏｒ：：ａｓｓｉｇｎ＿ｇｉｄ（）〕１１４により実現される。
【００６５】
同様に，図２のオブジェクト・グループ管理装置２０の持つ各手段は，ＯＧＭａｎａｇｅｒ１２０のグループ取出し部〔ＰＯｂｊＧｒｏｕｐ＊  ＯＧＭａｎａｇｅｒ：：ｒｅｔｒｉｅｖｅ＿ｇｒｏｕｐ（ｉｎｔ  ｇｉｄ）〕１２１，オブジェクト・グループ取出し部〔ＰＯｂｊ＊  ＯＧＭａｎａｇｅｒ：：ｒｅｔｒｉｖｅ＿ｏｇ（ｉｎｔ  ｏｉｄ）〕１２２，グループ・ロック設定部〔ｉｎｔ  ＯＧＭａｎａｇｅｒ：：ｌｏｃｋ＿ｇｒｏｕｐ（ｉｎｔ  ｇｉｄ，ｉｎｔ  ｓｔａｔｕｓ）〕１２３，グループ・ロック解除部〔ｖｏｉｄ  ＯＧＭａｎａｇｅｒ：：ｕｎｌｏｃｋ＿ｇｒｏｕｐ（ｉｎｔ  ｇｉｄ，ｉｎｔ  ｋｅｙ）〕１２４，グループ更新部〔ｖｏｉｄ  ＯＧＭａｎａｇｅｒ：：ｕｐｄａｔｅ＿ｇｒｏｕｐ（ＰＯｂｊＧｒｏｕｐ  ＊ｐｏｇ，ｉｎｔ  ｋｅｙ）〕１２５，グループ・ロック状態チェック部〔ｉｎｔ  ＯＧＭａｎａｇｅｒ：：ｃｈｅｃｋ＿ｌｏｃｋ＿ｓｔａｔｕｓ（ｉｎｔ  ｇｉｄ，ｉｎｔ  ｋｅｙ）〕１２６，オブジェクト・グループ更新部〔ｖｏｉｄ  ＯＧＭａｎａｇｅｒ：ｕｐｄａｔｅ＿ｏｇ（Ｐｏｂｊ  ＊ｏｇ，ｉｎｔ  ｋｅｙ）〕１２７，オブジェクト生成指示部〔ＰＯｂｊ＊  ＯＧＭａｎａｇｅｒ：：ｌｏａｄ＿ｏｂｊ（ｉｎｔ  ｏｉｄ，ｉｎｔ  ｃｉｄ）〕１２８により実現される。
【００６６】
ここで，例えばオブジェクト・グループ構成データ登録部１１１の〔ｉｎｔＯＧＧｅｎｅｒａｔｏｒ：：ｅｎｔｅｒ（ＰＯｂｊＧｒｏｕｐ  ＊ｐｏｇ）〕におけるｅｎｔｅｒは操作名を表し，「ｉｎｔ」は返す値の型を，「ＯＧＧｅｎｅｒａｔｏｒ：：」は，この操作名が属するオブジェクト・クラスを，「（ＰＯｂｊＧｒｏｕｐ  ＊ｐｏｇ）」は，ｅｎｔｅｒの操作の引数が，クラスＰＯｂｊＧｒｏｕｐの変数名＊ｐｏｇ（＊はポインタ型の変数）であることを表す。他の操作についても同様な表記である。これらの表記は，オブジェクト指向言語として周知のＣ＋＋言語等により知られている表記と同様であるので，これ以上の詳細な説明は省略する。
【００６７】
図１２は，実施例における，アプリケーションプログラム１５０の永続オブジェクトグループクラス（ＰＯｂｊＧｒｏｕｐ）１５１，永続オブジェクトクラス（ＰＯｂｊ）１５２，永続オブジェクト・データ格納クラス（ＰＯｂｊＤＳ）１５３の内容の例を示す図である。
【００６８】
永続オブジェクトグループクラス（ＰＯｂｊＧｒｏｕｐ）１５１において，＄ｐｓｅｕｄｏ＿ｇｉｄ＿ｃｏｕｎｔｅｒ：ｉｎｔ，ｇｒｏｕｐ＿ｉｄ：ｉｎｔ，ｓｔａｔｅ：ｉｎｔ，ｋｅｙ：ｉｎｔは属性名であり，＄ｆｉｎｄ（ｇｉｄ：ｉｎｔ）：ＰＯｂｊＧｒｏｕｐ，ｅｎｔｅｒ（），ｓｔｏｒｅ（），ｌｏｃｋ（），ｗｒｉｔｅ（），ｆｉｘ＿ｇｉｄ（ｇｉｄ：ｉｎｔ），ｇｅｔ＿ｐｏｂｊｓ（）：Ｓｅｔ＊，ｇｅｔ＿ｐｏ（ｏｉｄ：ｉｎｔ）：ＰＯｂｊ，ｒｅｖｉｖｅ＿ｌｉｎｋｓ（）は操作名である。
【００６９】
また，永続オブジェクトクラス（ＰＯｂｊ）１５２において，＄ｃｌａｓｓ＿ｉｄ：ｉｎｔ，ｏｂｊｅｃｔ＿ｉｄ：ｉｎｔ，ｇｒｏｕｐ＿ｉｄ：ｉｎｔ，ｃａｎ＿Ｉ＿ｌｏｃｋ：ｉｎｔ，ｓｔａｔｅ：ｉｎｔは属性名であり，＄ｃｒｅａｔｅ（），ｓｔｏｒｅ＿ｇｒｏｕｐ（），ｌｏｃｋ＿ｇｒｏｕｐ（），ｓｔｏｒｅ＿ｍｅ（），ｓｅｔ＿ａｌｌ＿ｌｉｎｋｉｄ（），ｇｅｔ＿ｐｏｇ（）：ＰＯｂｊＧｒｏｕｐ＊，ｇｅｔ＿ｋｅｙ（）：ｉｎｔは操作名である。
【００７０】
永続オブジェクト・データ格納クラス（ＰＯｂｊＤＳ）１５３において，＄ｔａｂｌｅ＿ｎａｍｅ：ｃｈａｒ＊，＄ｐｒｉｍａｒｙ＿ｋｅｙ：ｃｈａｒ＊は属性名であり，＄ｉｎｓｔａｎｃｅ（）：ＰＯｂｊＤＳ＊，ｌｏａｄ（ｏｉｄ：ｉｎｔ）：ＰＯｂｊ＊，ｉｎｓｅｒｔ（ｐｏ：ＰＯｂｊ＊），ｕｐｄａｔｅ（ｐｏ：ＰＯｂｊ＊），ｄｅｌｅｔｅ（ｐｏ：ＰＯｂｊ＊）は操作名である。
【００７１】
永続オブジェクトグループクラス（ＰＯｂｊＧｒｏｕｐ）１５１と永続オブジェクトクラス（ＰＯｂｊ）１５２とは，「ｈａｓ＿ａ」の関係（図中，◇で示す）にある。すなわち，永続オブジェクトグループクラス（ＰＯｂｊＧｒｏｕｐ）１５１が，０個以上（図中，＊で示す）の永続オブジェクトクラス（ＰＯｂｊ）１５２と関係を持つことを意味する。
【００７２】
図１３は，実施例におけるアプリケーションのクラス定義の例を，ＯＭＴ（Ｕｎｉｆｉｅｄ＿Ｍｅｔｈｏｄ）表記法により示す図である。
図１３（ａ）に示すように，永続オブジェクトクラス（ＰＯｂｊ）１５２のサブクラスとして，「顧客」，「宿泊予約」，「宿泊予約明細」，「客室予約」，「客室タイプ」の各クラスが存在する。ここで，「顧客」からみて「宿泊予約」は１つであり（図中，１で示す），「宿泊予約」からみて「顧客」は０個以上ある（図中，＊で示す）という関係にある。また，「宿泊予約」からみて，「宿泊予約」が持つ「宿泊予約明細」は１以上あり（図中，１．．で示す），「宿泊予約明細」からみると「客室予約」も１以上あるという関係にある。
【００７３】
また，図１３（ｂ）に示すように，永続オブジェクト・データ格納クラス（ＰＯｂｊＤＳ）１５３のサブクラスとして，「顧客ＤＳ」，「宿泊予約ＤＳ」，「宿泊予約明細ＤＳ」，「客室予約ＤＳ」，「客室タイプＤＳ」の各クラスが存在する。
【００７４】
図１４は，宿泊予約業務アプリケーションで，実際に生成されるオブジェクトの例を示す図である。
図１４中に示す，顧客オブジェクト，宿泊予約オブジェクト，宿泊予約明細オブジェクト，客室予約オブジェクト，客室タイプオブジェクトは，宿泊予約業務プログラムに用いるために，ＲＤＢＭＳから同時に取り出す１のグループを構成する。顧客オブジェクト，宿泊予約オブジェクト，宿泊予約明細オブジェクト，客室予約オブジェクトは，更新の際にデータの一貫性を保持する必要があるため，ロックをかけるオブジェクトである。
【００７５】
図１５および図１６は，実施例における管理テーブルの例を示す図である。図１５（ａ）は，オブジェクト・グループ構成テーブル１６１，図１５（ｂ）はグループ状態テーブル１６２，図１５（ｃ）はリンクテーブル１６３の例を示している。これらのテーブルにより，オブジェクトのグループ構成とグループの状態についてのデータを保持する。図１６は，各オブジェクトに対応するテーブル１７０〜１７４の例であって，図１６（ａ）は顧客オブジェクトのテーブル１７０，図１６（ｂ）は宿泊予約オブジェクトのテーブル１７１，図１６（ｃ）は宿泊予約明細オブジェクトのテーブル１７２，図１６（ｄ）は客室予約オブジェクトのテーブル１７３，図１６（ｅ）は客室タイプオブジェクトのテーブル１７４である。
【００７６】
図１７〜図２３は，実施例における動作のフローを示す図である。
図１７は，新しいオブジェクトのグループのデータを生成する場合の動作のフローを示す図である。
【００７７】
図１１に示すオブジェクト・グループ管理情報生成オブジェクトＯＧＧｅｎｅｒａｔｏｒ１１０に，グループを指定するポインタｐｏｇを引数とする操作ｅｎｔｅｒの指示が送られ，これによってオブジェクト・グループ構成データ登録部１１１が動作し，Ｃｕｓｔｏｍｅｒ（顧客），Ｒｅｓｅｒｖａｔｉｏｎ（宿泊予約），Ｒｓｖ＿ｆｏｒ＿ｎｉｇｈｔ（宿泊予約明細），Ｒｓｖ＿ｆｏｒ＿ｒｏｏｍ（客室予約），Ｒｏｏｍ＿ｔｙｐｅ（客室予約）のオブジェクトが入力される（ステップＳ５１）。
【００７８】
オブジェクト・グループ構成データ登録部１１１は，入力されたこれらのオブジェクトを順に調べ（ステップＳ５２），各オブジェクトがＩＤ値を持つかどうかを判定する（ステップＳ５３）。ここで，オブジェクトがＩＤ値を持っていないときは，「ｉｎｔ  ＯＧＧｅｎｅｒａｔｏｒ：：ａｓｓｉｇｎ＿ｏｉｄ（）」の指示により，オブジェクトＩＤ割当て部１１２が起動され，オブジェクトにＩＤ値が割り当てられる（ステップＳ５４）。
【００７９】
各オブジェクトに対して同様に処理した後（ステップＳ５５），「ｉｎｔ  ＯＧＧｅｎｅｒａｔｏｒ：：ａｓｓｉｇｎ＿ｇｉｄ（）」の指示により，グループＩＤ割当て部１１４を動作させ，新しいグループのＩＤ値を割り当てる（ステップＳ５６）。
【００８０】
次に，「ｉｎｔ  ＯＧＧｅｎｅｒａｔｏｒ：：ｃｒｅａｔｅ＿ｇｒｏｕｐ（ＰＯｂｊＧｒｏｕｐ  ＊ｐｏｇ）」の指示により，グループデータ生成部１１３を動作させ，オブジェクト・グループ構成テーブル１６１に新しいグループのＩＤ値を各オブジェクトのＩＤ値と組み合わせて格納する（ステップＳ５７）。また，グループ状態テーブル１６２に，新しいグループのＩＤ値である新しい行を追加する（ステップＳ５８）。
【００８１】
図１８は，グループを指定してオブジェクトをまとめて取り出す場合の動作のフローを示す図である。
図１１に示すオブジェクト・グループ管理オブジェクトＯＧＭａｎａｇｅｒ１２０に，グループのＩＤ値を引数とする操作ｒｅｔｒｉｅｖｅ＿ｇｒｏｕｐの指示が送られ，これによってグループ取出し部１２１が動作する（ステップＳ６１）。
【００８２】
グループ取出し部１２１は，オブジェクト・グループ構成テーブル１６１を検索して，ｇｒｏｕｐ＿ｉｄの値が入力されたＩＤ値と一致する行から，オブジェクトのＩＤ（ｏｂｊｅｃｔ＿ｉｄ）とクラスＩＤ（ｃｌａｓｓ＿ｉｄ）とを得る（ステップＳ６２）。また，オブジェクト・グループ構成テーブル１６１とグループ状態テーブル１６２とを参照し，抽出した行のｌｏｃｋの値を調べる（ステップＳ６３，ステップＳ６４）。
【００８３】
他のグループにも属しているｌｏｃｋがｙｅｓのオブジェクトで，ｒｅａｄｌｏｃｋされているものがあれば，オブジェクトを取り出せない旨のメッセージを出し（ステップＳ６７），処理を終了する。
【００８４】
ｌｏｃｋがかけられていなければ，「ＰＯｂｊ＊  ＯＧＭａｎａｇｅｒ：：ｌｏａｄ＿ｏｂｊ（ｉｎｔ  ｏｉｄ，ｉｎｔ  ｃｉｄ）」の指示により，オブジェクト生成指示部１２８を動作させ，オブジェクト・グループ構成テーブル１６１のｃｌａｓｓ＿ｉｄからそのオブジェクトを処理する責任を持つオブジェクトを特定して，そのオブジェクトに対し，ｏｂｊｅｃｔ＿ｉｄに対応するオブジェクトを生成するよう要求する（ステップＳ６５）。
【００８５】
これによって，「ＰＯｂｊ＊  ＰＯｂｊＤＳ：：ｌｏａｄ（ｉｎｔ  ｏｉｄ，ｉｎｔ  ｃｉｄ）」の指示が出され，オブジェクト生成部（図示省略）が動作し，オブジェクト生成部は，オブジェクトのＩＤ（ｏｂｊｅｃｔ＿ｉｄ）を用いて，ＲＤＢＭＳ１３０からオブジェクトの生成に必要なデータを取り出して，オブジェクトを生成する（ステップＳ６６）。
【００８６】
図１９は，あるオブジェクトを指定して，そのオブジェクトが属するグループの全てのオブジェクトを取り出す場合の動作のフローを示す図である。
「ＰＯｂｊ＊  ＯＧＭａｎａｇｅｒ：：ｒｅｔｒｉｅｖｅ＿ｏｇ（ｉｎｔ  ｏｉｄ）」の指示により，オブジェクト・グループ管理オブジェクト１２０のオブジェクト・グループ取出し部１２２に，オブジェクトのＩＤ値が入力される（ステップＳ６８）。オブジェクト・グループ取出し部１２２は，オブジェクト・グループ構成テーブル１６１を検索し，入力されたＩＤ値と一致する行からグループのＩＤを得る（ステップＳ６９）。
【００８７】
次に，「ＰＯｂｊＧｒｏｕｐ＊  ＯＧＭａｎａｇｅｒ：：ｒｅｔｒｉｅｖｅ＿ｇｒｏｕｐ（ｉｎｔ  ｇｉｄ）」の指示により，グループ取出し部１２１を呼び出し，グループ取出し部１２１にグループＩＤを入力する（ステップＳ７０）。これにより，指定されたオブジェクトと同じグループの全オブジェクトが取り出されることになる。
【００８８】
図２０は，グループにロックをかける場合の動作のフローを示す図である。
「ｉｎｔ  ＯＧＭａｎａｇｅｒ：：ｌｏｃｋ＿ｇｒｏｕｐ（ｉｎｔ  ｇｉｄ，ｉｎｔ  ｓｔａｔｕｓ）」の指示により，グループ・ロック設定部１２３が動作し，グループのＩＤ値と，ロックの種類（ｒｅａｄ／ｗｒｉｔｅ）が入力される（ステップＳ７１）。
【００８９】
グループ・ロック設定部１２３は，グループ状態テーブル１６２を検索して，ｇｒｏｕｐ＿ｉｄ列の値が入力されたＩＤ値と一致する行のｓｔａｔｕｓ列の値を，入力されたロックの種類に書き換える（ステップＳ７２）。次にロックをかけたデータを更新したり，ロックを解除したりするためのキーとなる値を，グループに渡す（ステップＳ７３）。
【００９０】
図２１はグループのロックを解除する場合の動作のフローを示す図である。
「ｖｏｉｄ  ＯＧＭａｎａｇｅｒ：：ｕｎｌｏｃｋ＿ｇｒｏｕｐ（ｉｎｔ  ｇｉｄ，ｉｎｔ  ｋｅｙ）」の指示により，グループ・ロック解除部１２４が動作し，グループのＩＤ値とロック設定時に割り当てられたキーが入力される（ステップＳ７４）。グループ・ロック解除部１２４は，グループ状態テーブル１６２を検索し，テーブル内のｋｅｙ列の値と入力されたキーの値が一致し，またｇｒｏｕｐ＿ｉｄの値が入力されたＩＤ値と一致する行のｓｔａｔｕｓ列の値をロック解除状態に書き換える（ステップＳ７５〜Ｓ７７）。キーの値が一致しない場合，ロックが解除できない旨のメッセージを出す（ステップＳ７８）。
【００９１】
図２２は，グループを指定してオブジェクトをまとめて更新する場合の動作のフローを示す図である。
「ｖｏｉｄ  ＯＧＭａｎａｇｅｒ：：ｕｐｄａｔｅ＿ｇｒｏｕｐ（ＰＯｂｊＧｒｏｕｐ  ＊ｐｏｇ，ｉｎｔ  ｋｅｙ）」の指示により，グループ更新部１２５が動作し，更新したいグループが入力される（Ｓ８１）。次に，「ｉｎｔ  ＯＧＭａｎａｇｅｒ：：ｃｈｅｃｋ＿ｌｏｃｋ＿ｓｔａｔｕｓ（ｉｎｔ  ｇｉｄ，ｉｎｔ  ｋｅｙ）」の指示により，グループ・ロック状態チェック部１２６を呼び出し，グループが更新可能かどうかを調べる（ステップＳ８２，Ｓ８３）。
【００９２】
更新可能であれば，オブジェクト・グループ構成テーブル１６１を検索し，ｇｒｏｕｐ＿ｉｄの値が入力されたＩＤ値と一致する行で，かつｌｏｃｋがｙｅｓになっている行オブジェクトのＩＤとクラスのＩＤを得る（ステップＳ８４）。そして，そのオブジェクトＩＤに対応するオブジェクトに対し，データを格納するように指示する（ステップＳ８５）。「ｖｏｉｄ  ＰＯｂｊ：：ｓｔｏｒｅ＿ｍｅ（）」の指示によって，オブジェクトのＩＤに対応するデータが更新される（ステップＳ８６）。更新しようとするグループがロック状態のため，更新できない場合には，更新できない旨のメッセージを出力し，処理を終了する（ステップＳ８７）。
【００９３】
図２３は，あるオブジェクトを指定して，そのオブジェクトが属するグループの全てのオブジェクトを更新する場合の動作のフローを示す図である。
「ｖｏｉｄ  ＯＧＭａｎａｇｅｒ：：ｕｐｄａｔｅ＿ｏｇ（ＰＯｂｊ  ＊ｏｇ，ｉｎｔ  ｋｅｙ）」の指示により，オブジェクト・グループ更新部１２７が動作し，更新したいオブジェクトが入力される（ステップＳ９１）。オブジェクト・グループ更新部１２７は，入力されたオブジェクトからそのオブジェクトが属するグループ（オブジェクト）を得る（ステップＳ９２）。次に，「ｖｏｉｄＯＧＭａｎａｇｅｒ：：ｕｐｄａｔｅ＿ｇｒｏｕｐ（ＰＯｂｊＧｒｏｕｐ  ＊ｐｏｇ，ｉｎｔ  ｋｅｙ）」の指示により，グループをグループ更新部１２５に入力し，グループをまとめて更新する（ステップＳ９３）。
【００９４】
【発明の効果】
あるオブジェクトを更新する場合，それと関連するオブジェクトもまとめてデータの取り出し，保存，ロック／ロック解除等を行わないと，オブジェクト間のデータの一貫性が保持できなくなる。
【００９５】
本発明によれば，任意のオブジェクトのグループ単位でＲＤＢＭＳのデータの取り出し，保存，ロック／ロック解除等を行うことにより，関連するオブジェクト間のデータの一貫性を保持することができるようになる。特に，種々のオブジェクト指向言語プロセッサに対して，外付けの機能として本発明の機構を付加することができるため，リレーショナル・データベース管理システムを用いる既存のオブジェクト指向言語に対しても本発明を容易に適用することが可能であるという効果がある。
【図面の簡単な説明】
【図１】本発明の原理説明図である。
【図２】実施の一形態における構成例を示す図である。
【図３】管理テーブルの構成例を示す図である。
【図４】グループのデータを生成する処理のフローを示す図である。
【図５】グループを指定してオブジェクトをまとめて取り出す処理のフローを示す図である。
【図６】あるオブジェクトを指定して，そのオブジェクトが属するグループの全てのオブジェクトを取り出す処理のフローを示す図である。
【図７】グループにロックをかける処理のフローを示す図である。
【図８】グループのロックを解除する処理のフローを示す図である。
【図９】グループを指定してオブジェクトをまとめて更新する処理のフローを示す図である。
【図１０】あるオブジェクトを指定して，そのオブジェクトが属するグループの全てのオブジェクトを更新する処理のフローを示す図である。
【図１１】本発明の実施例の構成を示す図である。
【図１２】実施例における永続オブジェクトの例を示す図である。
【図１３】実施例におけるアプリケーションのクラス定義の例を示す図である。
【図１４】実施例におけるオブジェクトの例を示す図である。
【図１５】実施例におけるテーブルの例を示す図である。
【図１６】実施例におけるテーブルの例を示す図である。
【図１７】グループのデータを生成する場合の動作のフローを示す図である。
【図１８】グループを指定してオブジェクトをまとめて取り出す場合の動作のフローを示す図である。
【図１９】あるオブジェクトを指定して，そのオブジェクトが属するグループの全てのオブジェクトを取り出す場合の動作のフローを示す図である。
【図２０】グループにロックをかける場合の動作のフローを示す図である。
【図２１】グループのロックを解除する場合の動作のフローを示す図である。
【図２２】グループを指定してオブジェクトをまとめて更新する場合の動作のフローを示す図である。
【図２３】あるオブジェクトを指定して，そのオブジェクトが属するグループの全てのオブジェクトを更新する場合の動作のフローを示す図である。
【符号の説明】
１０  オブジェクト・グループ管理情報生成装置
２０  オブジェクト・グループ管理装置
３０  リレーショナル・データベース管理システム（ＲＤＢＭＳ）
４０  リレーショナル・データベース
【図１】
0003857749.tif 000002
【図２】
0003857749.tif 000003
【図３】
0003857749.tif 000004
【図４】
0003857749.tif 000005
【図５】
0003857749.tif 000006
【図６】
0003857749.tif 000007
【図７】
0003857749.tif 000008
【図８】
0003857749.tif 000009
【図９】
0003857749.tif 000010
【図１０】
0003857749.tif 000011
【図１１】
0003857749.tif 000012
【図１２】
0003857749.tif 000013
【図１３】
0003857749.tif 000014
【図１４】
0003857749.tif 000015
【図１５】
0003857749.tif 000016
【図１６】
0003857749.tif 000017
【図１７】
0003857749.tif 000018
【図１８】
0003857749.tif 000019
【図１９】
0003857749.tif 000020
【図２０】
0003857749.tif 000021
【図２１】
0003857749.tif 000022
【図２２】
0003857749.tif 000023
【図２３】
0003857749.tif 000024