【问题标题】:Java DAO GenericsJava DAO 泛型
【发布时间】:2012-12-11 08:22:15
【问题描述】:

我正在使用泛型来构建 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。还有其他解决方案吗?

【问题讨论】:

  • 1000 多个具有不同表结构的表?抱歉,我会重新考虑我的数据库设计。

标签: java spring mongodb generics dao


【解决方案1】:

你可以做到。但我建议您使用Generic Dao 项目。它支持本地 Hibernate 和 JPA API,并允许您为您拥有的所有实体创建一个且只有一个 DAO。

【讨论】:

    【解决方案2】:

    您不必扩展 DAO 类。我假设 DAO 构造函数有一个参数来检测它应该与哪个实体和哪个表交互。像这样的:

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

    有了这样的构造函数,只要你需要一个学生实体的 DAO 实例,你就可以像这样初始化它:

    DAO<Student> studentDao = new DAO<Student>(Student.class);
    

    【讨论】:

    • 既然可以从泛型类型中获取必要的信息,为什么还要添加构造函数参数?
    • @KurtDuBois 我们如何从一个泛型中获取必要的信息?
    • 代码示例:AbstractDao dao = (AbstractDao) this; ParameterizedType genericSuperclass= (ParameterizedType) dao .getClass().getGenericSuperclass(); this.entityClass = (Class) genericSuperclass .getActualTypeArguments()[0];
    • 感谢库尔特,但听起来它只有在显式扩展 AbstractDao 类时才有效,这在这种情况下是不可取的。如果没有子类扩展 AbstractDao,则无法在运行时以编程方式确定类型“T”。您提到的方法在GenericDataAccessObjects中使用。请注意,它是一个抽象类。
    【解决方案3】:

    是的,肯定有更好的方法。您遇到的是我所说的“每个实体的 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 之外,您甚至可以使用 findByExample 满足 90% 的“查找器”需求,请参阅 IGenericReadOnlyDao

    如果findByExample 不能满足您的所有需求,那么您可以选择使用 Spring 级别的通用 DAO,example here,它提供从 SQL 到您的 DAO 接口的直接映射,您不需要提供实现.

    【讨论】:

      【解决方案4】:

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

      【讨论】:

      • 感谢您的所有回复。问题是我在 Spring MongoDB 中使用了一个名为 MongoDB 的 NoSQL 数据库。 Spring Data 有存储库,但存在与上述相同的问题。通过 Spring 使用 Repository,我仍然会得到 1000 个类。还有其他解决方案吗?
      【解决方案5】:

      你考虑使用hibernate + spring

      【讨论】:

        猜你喜欢
        • 2017-08-08
        • 2015-06-29
        • 2013-07-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-10-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多