1

ジェネリックを使用してDAOを構築しています。データベースは任意のデータベースである可能性があります。問題は、クラスのタイプごとに特定のクラスがあることです。例えば:

public class DAO<T> {

    public void save(T entity) {

     }
}

public class StudentDAO extends DAO<Student> {

}

1000 以上のテーブルがあると想像してみてください。このようなクラスを 1000 個持つ必要がありますか? これを設計するより良い方法はありますか?

編集

Spring MongoDB で NoSQL データベースである MongoDB を使用しています。Spring によるリポジトリの概念がありますが、それでも 1000 クラスになります。JPAまたはHibernateを使用できません。他の解決策はありますか?

4

5 に答える 5

1

はい、間違いなくもっと良い方法があります。あなたが遭遇したのは、私が「エンティティごとの DAO スケーラビリティの問題」と呼んでいるものです。そのために必要なのは、PerfectJPatternなどの再利用可能な汎用 DAO実装です。

 IGenericDao<Long, Customer> myCustomerDao = HibernateDaoFactory.getInstance().createDao(Customer.class);
 // create a Customer
 Customer myCustomer1 = new Customer(/*name=*/"Pedro"); 
 myCustomerDao.create(myCustomer1);
 // find all customers whose name is "Juan"
 List<Customer> myMatches = myCustomerDao.findByExample(new Customer(/*name=*/"Juan"));

ここで何が起こったのですか?CustomerDao新しいものを作成する必要はありませんが、一般的なものを再利用してください。基本的な CRUD に加えて、 IGenericReadOnlyDaofindByExampleを参照して、「ファインダー」のニーズの 90% をカバーすることもできます。

findByExampleがすべてのニーズをカバーしていない場合は、Spring レベルのジェネリック DAO を使用する選択肢があります。ここでは、SQL から DAO インターフェイスへの直接マッピングを提供し、実装を提供する必要はありません。

于 2012-12-11T15:40:39.367 に答える
1

DAO クラスを拡張する必要はありません。DAOコンストラクターには、どのエンティティとどのテーブルと対話する必要があるかを検出するためのパラメーターがあると思います。このようなもの:

public DAO(Class<T> type) {
    this.persistentType = type;
}

このようなコンストラクターを使用すると、 Student エンティティの DAO インスタンスが必要な場合はいつでも、次のように初期化できます。

DAO<Student> studentDao = new DAO<Student>(Student.class);
于 2012-12-11T08:37:50.953 に答える
1

あなたはそれを行うことができます。ただし、Generic Daoプロジェクトを使用することをお勧めします。ネイティブの Hibernate と JPA API の両方をサポートし、所有するすべてのエンティティに対して 1 つだけの DAO を作成できます。

于 2012-12-11T08:33:32.907 に答える
0

DAO レイヤーを生成する Spring Data を検討してください。

于 2012-12-11T08:27:02.257 に答える
0

hibernate + spring の使用を検討します

于 2012-12-11T08:33:25.683 に答える