私のJavaアプリケーションでは、データベース操作の抽象化レイヤーを実装したいと思います。私はアプリケーションを任意の種類のデータベースにバインドしたくない(SQL、XML、文書ベース、醜いテキストファイルの束など)。DAOの設計とデータ構造
エンティティ間には多くの関係がありますが、時間のうち、関係は1対多である。
更新と免責事項:例はシンプルですが、ORM/SQLモデルに適合しない本当のチャンスを持つより複雑なモデル全体の一部に過ぎません。関係の中に正規化されたとき、およびデータの性質の変化のために10億のレコード)。ここで私は簡単な関係を実装することを求めていますが、実際にアプリケーションの唯一の問題であるとは限りません。
簡単な例は以下の通りである:
public class Vehicle {
String mark;
String model;
String registrationId;
}
public class Depot {
String name;
String address;
}
これらのエンティティのそれぞれは、独自のDAOインタフェースを有する:
public interface VehicleDAO {
List<Vehicle> getVehicles();
Vehicle getVehicleByRegistrationId(String registrationId);
}
public interface DepotDAO {
List<Depot> getDepots();
Depot getDepotByName(String name);
}
これらのDAOはわずかに分離されているいくつかの方法を示すために、同様に簡略化されます特定のエンティティ(登録IDで車両を取得するために、他のエンティティについては何も知る必要はありません)。
そして今興味深い部分が来ます。 デポと車両の関係は1対多です。ですから私はエンティティクラスとDAOメソッドの両方でこの関係を実装する必要があります。
- 場所
List<Vehicle>
プロパティクラスDepot
内側と私は(可能怠惰なフェッチ改善に)Depot
インスタンスを取得するたびに、それを移入:は、今のところ私はこのために2つのアプローチがあります。この方法でDAOインターフェイスは変更されません。
- は
Depot
とVehicle
の特別な識別子を導入し、エンティティクラスは追加の整数プロパティint id;
を取得し、DAOList<Vehicle> getVehiclesForDepot(int depotId)
にメソッドを追加します。このアプローチは、単純な整数の代わりに識別子のための特別なクラスを導入することによって強化することができます。
他の方法がありますか?エンティティとデザインの関係をモデル化する最良の方法は何ですか?DAOインターフェイスを使用すると、データベースの抽象化は使いやすく、どのタイプのデータベースにもバインドされません。私は必ずしも完全で正確な解決策を求めるのではなく、むしろ上記の問題を解決する際のいくつかの原則について尋ねています。あなたは一貫id
を使用する場合はDAOのタイプにローカライズされているメソッドを使用し、あなたの例では
これはホイールの再発明と呼ばれ、HibernateのようなORMを使用します。 –
@PetarMinchevはORMを使用して、データベースの種類にバインドされていない要件の1つに違反しています –
次に、ORMをデータベース部分のみに使用します。また、実際のプロジェクトでは、データ記憶域をデータベースから「xml」などに変更することはまだありません。 –