1

我正在使用泛型来构建 DAO。数据库可以是任何数据库。问题是对于每种类型的类都有一个特定的类。例如:

public class DAO<T> {

    public void save(T entity) {

     }
}

public class StudentDAO extends DAO<Student> {

}

想象一下我有 1000 张或更多桌子。我需要有 1000 个这样的课程吗?有没有更好的方法来设计这个?

编辑

我正在使用 MongoDB 和 Spring MongoDB 的 NoSQL 数据库。它通过 Spring 具有 Repository 概念,但我仍然会得到 1000 个类。我不能使用 JPA 或 Hibernate。还有其他解决方案吗?

4

5 回答 5

1

是的,肯定有更好的方法。您遇到的是我所说的“每个实体的 DAO 可扩展性问题”。你需要的是一个可重用的通用 DAO实现,例如PerfectJPattern

 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 之外,您甚至可以使用 IGenericReadOnlyDao 来满足 90% 的“查找器findByExample需求

如果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,并允许您为您拥有的所有实体创建一个且只有一个 DAO。

于 2012-12-11T08:33:32.907 回答
0

考虑 Spring Data ,它将为您生成 DAO 层。

于 2012-12-11T08:27:02.257 回答
0

你考虑使用hibernate + spring

于 2012-12-11T08:33:25.683 回答