Java DAO工厂动态返回对象类型

时间:2011-07-21 09:28:38

标签: java generics dao genericdao

我正在尝试编写简单的DAO,它将根据存储在String字段中的类型创建实体对象。如何返回动态更改的类型? UserDAO类的方法findById()应返回User类对象。 ProductDAO的相同方法应返回Product。 我不想在扩展DAO的每个类中实现findById,它应该自动完成。

示例代码:

class DAO {
   protected String entityClass = "";
   public (???) findById(int id) {
      // some DB query
      return (???)EntityFromDatabase; // how to do this?
   }
}
class UserDAO extends DAO {
   protected String entityClass = "User";
}
class ProductDAO extends DAO {
   protected String entityClass = "Product";
}
class User extends Entity {
   public int id;
   public String name;
}

4 个答案:

答案 0 :(得分:2)

将其修改为

class DAO<T> {
   //   protected String entityClass = "";
   public T findById(int id) {

      return (T)EntityFromDatabase; // how to do this?
   }
}
class UserDAO extends DAO<User> {
   //protected String entityClass = "User";
}
class ProductDAO extends DAO<Product> {
   //protected String entityClass = "Product";
}
class User extends Entity {
   public int id;
   public String name;
}

答案 1 :(得分:2)

使用Generics in java。在这里找一个例子。

public interface GenericDAO<T,PK extends Serializable> {

  PK create(T entity);
  T read(PK id);
  void update(T entity);
  void delete(T entity);
}
public class GenericDAOImpl<T,PK extends Serializable>  implements GenericDAO<T,PK>{
    private Class<T> entityType;
    public GenericDAOImpl(Class<T> entityType){
          this.entityType = entityType; 
    }
     //Other impl methods here...
}

答案 2 :(得分:0)

首先,不要使用String,而是使用该类。接下来,使用entityManager(请参阅docs

class DAO<T> {
   private Class<T> entityClass;

   // How you get one of these depends on the framework.
   private EntityManager entityManager;

   public T findById(int id) {
       return em.find(entityClass, id);
   }
}

现在,您可以根据类型使用不同的DAO,例如

DAO<User> userDAO = new DAO<User>();
DAO<Product> userDAO = new DAO<Product>();

答案 3 :(得分:0)

我强烈推荐你这篇文章Don't Repeat the DAO。我必须说,你的想法并不是很糟糕。