他のエンティティと 1 対 1 および/または 1 対多の関係を持つエンティティ クラスがいくつかあります。
私のケースを反映した非常に一般的な例を作成しようとしています...次のテーブルがDBに保存されているとしましょう(null値は許可されていません):
operations (ID, workerID, customerID, etc_etc)
workers (ID, email, password, etc_etc)
customers (ID, etc_etc)
mobilePhones (workerID, phoneNumber)
次のことは明らかです。
- 1 つの操作には1人の作業員と1人の顧客しか いません。
- 1人の顧客が少なくとも 1 つの携帯電話番号を持っています。
したがって、次のエンティティ クラスがあります。
public class Customer {
private int id;
//other fields, then constructors, getters and setters
}
public class Worker {
private int id;
//other fields
private String[] mobilePhones;
}
タイトルにも書きましたが、HibernateなどのORMが使えないので、DAOを使います。
{編集: ORM を使用できない理由を知りたがっていることを知っておくべきでした...まあ、ここのコメントに書いたように:これは課題です (ソフトウェア エンジニアリング試験のプロジェクト) . }
これで、が実際の作業者の IDに等しいすべての電話番号WorkerDAO
から選択することで、1 対多の関係を簡単に管理できる で問題が発生することはないと思います。mobilePhones
workerID
私にとっての本当の問題は、Operation
とその仲間Worker
との間の関係をどのように管理するかということCustomer
です。メモリの無駄を避けたい場合、Operation
エンティティを次のように設計する必要があります。
public class Operation { // here I have some doubts
private int id;
private int workerId;
private int customerId;
//other fields
}
または多分このように:
public class Operation { // here I have some doubts
private int id;
private Worker worker;
private Customer customer;
//other fields
}
?
後者はよりオブジェクト指向のように見えますが、些細な意味が 1 つあります。クライアントがそれらを必要としない場合でも、worker と customer のインスタンスはメモリ内にOperation
存在する必要があります。
さらに悪いことに、 OperationDAO
worker と customer を新しい Worker および Customer インスタンスとして設定すると、同じ worker/customer を参照する複数のインスタンスがメモリに保持されます(たとえば、同じ worker によって実行される 2 つの操作)。メモリの浪費に加えて、これは間違いなくデータの不整合につながる可能性があります(たとえば、1 つのインスタンスが他のインスタンスを更新せずに変更されるなど)。
これを回避するには、現在どのインスタンスがロードされているかを認識できるクラスを導入する必要があります (たとえばList<Worker>
、List<Customer>
、 などを使用)...正直なところ、これはやり過ぎのように思えます。
また、最初のリクエストでのみワーカーインスタンスを設定するなど、ある種の遅延フェッチを実装しようとすることもできると思いましたが、それでもメモリ内にあるものとクエリする必要があるものを追跡するクラスが必要です。このクラスがデータ アクセス ロジックに関連しているのか、ビジネス ロジックに関連しているのかさえわかりません(前者だと思いますが、まだわかりません)。
とにかく、私はキャッシングシステムを必要としないので、これをすべて実装する理由はまったくありません (そして、私はそれがそのように見えるように感じます)。
なにか提案を?