Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java DAO泛型_Java_Spring_Mongodb_Generics_Dao - Fatal编程技术网

Java DAO泛型

Java DAO泛型,java,spring,mongodb,generics,dao,Java,Spring,Mongodb,Generics,Dao,我正在使用泛型来构建DAO。数据库可以是任何数据库。问题是每种类型的类都有一个特定的类。例如: public class DAO<T> { public void save(T entity) { } } public class StudentDAO extends DAO<Student> { } 公共类DAO{ 公共作废保存(T实体){ } } 公共类学生DAO扩展DAO{ } 想象一下我有1000张桌子或更多。我需要上1000节这样的

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

public class DAO<T> {

    public void save(T entity) {

     }
}

public class StudentDAO extends DAO<Student> {

}
公共类DAO{
公共作废保存(T实体){
}
}
公共类学生DAO扩展DAO{
}
想象一下我有1000张桌子或更多。我需要上1000节这样的课吗?有更好的设计方法吗

编辑


我正在使用MongoDB和Spring MongoDB的NoSQL数据库。它在春季就有了存储库的概念,但我最终还是会有1000个类。我不能使用JPA或Hibernate。还有其他的解决方案吗?< /P> < P>考虑Spring数据,它将为你生成DAO层。

< P>你考虑使用Hibernate +Spring < /P> < P>你可以做到。但我建议您使用project。它支持本机Hibernate和JPAAPI,并允许您为所有实体创建一个且仅一个DAO

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

public DAO(Class<T> type) {
    this.persistentType = type;
}
DAO<Student> studentDao = new DAO<Student>(Student.class);
公共DAO(类类型){
this.persistentType=type;
}
有了这样的构造函数,无论您在何处需要学生实体的DAO实例,您都可以这样初始化它:

public DAO(Class<T> type) {
    this.persistentType = type;
}
DAO<Student> studentDao = new DAO<Student>(Student.class);
DAO studentDao=新的DAO(Student.class);

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

IGenericDao myCustomerDao=hibernatedofactory.getInstance().createDao(Customer.class);
//创建客户
客户myCustomer1=新客户(/*名称=*/“Pedro”);
myCustomerDao.create(myCustomer1);
//查找名为“Juan”的所有客户
List myMatches=myCustomerDao.findByExample(新客户(/*name=*/“Juan”);
刚才发生了什么事?您不需要创建新的
CustomerDao
,而是重用通用的
CustomerDao。除了基本的CRUD之外,您甚至可以使用
findByExample
查看来满足90%的“查找器”需求


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

1000+个具有不同表结构的表?抱歉,但我会重新考虑我的数据库设计。当您可以从泛型类型中获取必要的信息时,为什么要添加构造函数参数?@KurtDuBois我们如何仅从泛型中获取必要的信息?代码示例:AbstractDao=(AbstractDao)this;ParameteredType genericSuperclass=(ParameteredType)dao.getClass().getGenericSuperclass();this.entityClass=(类)genericSuperclass.getActualTypeArguments()[0];谢谢Kurt,但听起来只有当一个AbstractDao类被显式扩展时它才起作用,这在本例中是不可取的。如果没有子类extend AbstractDao,则无法在运行时通过编程确定类型“T”。您提到的方法在中使用。请注意,这是一个抽象类。感谢您的回复。问题是我在SpringMongoDB中使用了一个名为MongoDB的NoSQL数据库。Spring数据具有存储库,但存在与上述相同的问题。通过Spring使用Repository,我最终仍然会得到1000个类。还有其他解决办法吗?