このためにライブラリを使用していないが、データベース テーブルに出入りするデータ フローを管理するために独自のオブジェクトを作成しているすべての皆さんにお願いしています。レコードセット オブジェクトはありますか? データの行ごとに 1 つのオブジェクト? 両方?ない?提案や経験は大歓迎です。ORM やその他のツールキットを使用するように言わないでください。それは私のプロジェクトにとってやり過ぎですが、それは今の問題ではありませんよね?
5 に答える
データ モデルは、ドメイン エンティティ (現実世界のもの) によって支配されます。実世界のものは、データベース内の単一の行にマップされることがあります。1 つのエンティティは 1 つのオブジェクトであり、1 つのリレーショナル行です。ほとんどの場合。
実際のエンティティは非常に複雑で、複数のデータベース行にまたがる場合があります。これが「集計」の問題です。オブジェクトは集合体にすることができます。リレーショナル行は、通常の形式のルールをすべて破ることなく簡単に集計することはできません。
クラスの継承が原因で、オブジェクトをデータベース行にマップする方法に困惑することがあります。継承階層のレイヤーごとに 1 行ですか? それとも、すべてのレイヤーが各サブクラス テーブルの列にフラット化されていますか?
さらに、物のコレクションが必要です (データベースは物のコレクションのコレクションです)。
これらの「コレクション」または「レコード セット」または「マネージャー」または「データ アクセス オブジェクト」は、永続性 (SQL?) とドメイン エンティティとの間を仲介します。レコード セットは、アクセスできるあらゆる SQL 要素からドメイン オブジェクトを構築します。同様に、レコード セットはドメイン オブジェクトを SQL のものに巻き戻します。
ORM はこれを処理する 1 つの方法です。ORM フレームワークはこれらのクラス定義を提供します。ORM が「やり過ぎ」の場合は、設計パターンを借用します。iBatis API を読んでください。[そうしているうちに、ORM にとって小さすぎるものは何もないことに気付くかもしれません。]
要するに、「レコードセット オブジェクト」と「データの行ごとに 1 つのオブジェクト」の両方です。
独自のレコード セット コレクションを作成する必要がある場合は、単純なシリアル化を使用してオブジェクトを永続化することができます。集計とサブクラスの関係をシリアル化しようとすると、複雑さが積み重なっていきます。なんで?オブジェクトは相互に直接参照しています。SQL データベースは、これを主キーと外部キーでエミュレートする必要があります。
マーティン・ファウラーのエンタープライズ・アプリケーション・アーキテクチャーのパターンを取り上げることを強くお勧めします。それは、知っておくと役立つ多くのデータベース・パターンを説明しており、ORM ライブラリーでパターンが完全に進化するというアイデアを与えてくれます。
興味のある特定のパターン:
これらの基本的なパターンは、オブジェクトを構造化する方法のアイデアを提供し、より高度なパターン (アクティブ レコード/データ マッパーなど) では、それらが現在のニーズを超えて問題のドメインにどのように関連するかを確認できます。
これは、データベース設計によってオブジェクトの設計を推進するか、またはドメイン モデルによってデータベースの設計を推進するかによって異なります。
最初のシナリオでは、テーブルごとに 1 つのクラスを作成します。すぐにわかるように、2 つのテーブルを結合するオブジェクトが必要な場合があるため、その例外を処理するシナリオが必要になります。
2 番目のシナリオでは、オブジェクトの ID マップを作成し、何らかの方法でクラスの関係をテーブルにマップする必要があります。この場合、オブジェクトとテーブルの 1 対 1 の関係がない場合があります。
ツールの処方箋が必要ないことは承知していますが、SubSonicは、データベース構造からコードを生成するのに役立つ非常に単純で安定したツール キットであり、テーブルごとに 1 つのクラスを持つシナリオに適しています。30 分以内にコードをインストールして生成を開始できます。一見の価値があります。
プロジェクトのサイズに関係なく、ORM を使用することをお勧めします:-P
しかし.....
ORM ライブラリがなかった時代には、Java レコードセット オブジェクトからすべてのフィールドを手動で取り出し、それらを実際の Java クラスにプラグインしていました。
挿入と削除には逆が適用されます (どちらが発生するかを示すフラグを使用)
通常、複数の行が List に詰め込まれていました。
(ORM を使用せずに) データベースに出入りする実際のデータを管理するには、Jakarta Commons DbUtils を確認する必要があります。
ResultSet を Bean のリストに自動的に変換するなど、クエリと更新を実行するための非常に軽量なヘルパーを提供します。