Design patterns 如何将factory设计模式与GenericDAO结合使用?

Design patterns 如何将factory设计模式与GenericDAO结合使用?,design-patterns,generics,factory-pattern,genericdao,Design Patterns,Generics,Factory Pattern,Genericdao,我想为我的DAO层应用一个通用设计模式,这样我就可以在第三方ORM(Hibernate、JPA等)之间轻松切换。显然,我们有一些适用于所有DAO的通用方法,如: 公共无效创建(T实体) 公共无效更新(T实体) 公共作废删除(对象主键) 公共T读取(对象pk) 公共列表readAll() 所有DAO都必须继承这些方法以及特定于每个DAO的其他方法,我发现以下设计模式适合我,但我不知道如何使用它,以便使所有常用方法和专用方法都出现在同一DAO引用中: 首先,我们将为所有常用方法创建一个接口: 公

我想为我的DAO层应用一个通用设计模式,这样我就可以在第三方ORM(Hibernate、JPA等)之间轻松切换。显然,我们有一些适用于所有DAO的通用方法,如:

  • 公共无效创建(T实体)
  • 公共无效更新(T实体)
  • 公共作废删除(对象主键)
  • 公共T读取(对象pk)
  • 公共列表readAll()
所有DAO都必须继承这些方法以及特定于每个DAO的其他方法,我发现以下设计模式适合我,但我不知道如何使用它,以便使所有常用方法和专用方法都出现在同一DAO引用中:

首先,我们将为所有常用方法创建一个接口:

公共接口通用DAOINT{
公共无效创建(T实体);
公共无效更新(T实体);
公共作废删除(对象主键);
公共T读取(对象pk);
公共列表readAll();
}
我们将创建一个实现该接口的抽象类:

公共抽象类GenericDAOHibernate实现GenericDAOINT{
私有类persistentClass;
非公开会议;
私有静态SessionFactory SessionFactory;
私有静态记录器=Logger.getLogger(“InfoLogging”);
公共GenericDAOHibernate(T类){
this.persistentClass=(Class)类;
session=sessionFactory.openSession();
}
公共类getPersistentClass(){
返回persistentClass;
}
public void setPersistentClass(类persistentClass){
this.persistentClass=persistentClass;
}
静止的{
sessionFactory=new Configuration().configure(“hibernate.cfg.xml”)
.buildSessionFactory();
}
公共会话getSession(){
返回会议;
}
公共无效创建(T实体){
//实施
}
公共无效更新(T实体){}
公共无效删除(对象主键){}
公共T读(对象pk){}
公共列表readAll(){}
}
之后,我们将制作一个DAO工厂,使我能够在不同的ORM之间顺利切换:

公共抽象类{
公共静态DAOFactory getInstance(类工厂){
试一试{
return(DAOFactory)factory.newInstance();
}捕获(例外e){
抛出新的RuntimeException(“无法创建DAOFactory:+factory”);
}
}
//返回对任何所需dao的引用,以便调用专用方法
公共抽象区域主页getRegionDAO();
公共抽象服务名称getServicesDAO();
公共抽象StatusHome getStatusDAO();
}
接下来,我们将为hibernate或任何其他可插拔的ORM制作一个DAOFactory:

公共类DAOFactoryHibernate扩展了DAOFactory{
公共GenericDAOHibernate实例化AO(类daoClass)
{
尝试
{
GenericDAOHibernate dao=(GenericDAOHibernate)daoClass.newInstance();//此处引发异常
返回道;
}捕获(例外e){
System.out.println(例如toString());
抛出新的RuntimeException(“无法实例化DAO:+daoClass,e”);
}
}
@凌驾
公共区域主页getRegionDAO(){
//TODO自动生成的方法存根
返回null;
}
@凌驾
公共服务名称getServicesDAO(){
//TODO自动生成的方法存根
返回null;
}
@凌驾
public StatusHome getStatusDAO(){
//TODO自动生成的方法存根
返回null;
}
}
为了向每个DAO添加专门化,我们将为每个DAO创建一个接口,该接口将扩展
GenericDAOINT
,以包括服务的每个DAO中的常用方法。我们将执行以下操作:

public interface ServicesDAO扩展了GenericDAOINT{
public void specializedMethod();
}
最后,我们将为特定于Hibernate的ServicesDAO创建一个具体的类,如下所示:

公共类ServicesDAOHibernate扩展了GenericDAOHibernate实现ServicesDAO{
公共服务-自由党(阶级){
超级(类);
//TODO自动生成的构造函数存根
}
@凌驾
公共void specializedMethod(){
系统错误打印(“专用方法”);
}
}
我认为这些模式有助于在ORM之间轻松灵活地切换,但我告诉过您的另一方面是,我想为每个DAO调用同一引用上的所有方法(通用+专用),我尝试了以下客户端代码:

公共类测试{
公共静态void main(字符串参数[]){
DAOFactoryHibernate DFH=(DAOFactoryHibernate)DAOFactory.getInstance(DAOFactoryHibernate.class);
ServicesDAOHibernate serviceObjectDAO=(ServicesDAOHibernate)DFH.instantiateDAO(ServicesDAOHibernate.class);
serviceObjectDAO.specializedMethod();
}
但我有以下例外:

线程“main”java.lang.RuntimeException中的异常:无法实例化DAO:class ServicesDAOHibernate 原因:java.lang.InstanceException:ServicesDAOHibernate 位于java.lang.Class.newInstance0(Class.java:340) 位于java.lang.Class.newInstance(Class.java:308) 在DAOFactoryHibernate.instancedao(DAOFactoryHibernate.java:9)
我想知道如何像前面的客户机代码一样在同一引用上调用所有方法(通用+专用)。

我希望您能够发布完整的堆栈跟踪(您缺少一个导致问题的根本原因的原因).但是从您的代码来看,您的问题似乎是您正在通过
Class.newInstance()
调用
ServicesDAOHibernate
上的无参数构造函数,而该类没有无参数构造函数。是否要使用

return (GenericDAOHibernate<?>) daoClass.getConstructor(Class.class)
  .newInstance(daoClass);
return(GenericDAOHibernate)daoClass.getConstructor(Class.Class