构建Dao For Common数据库函数

时间:2011-01-18 09:09:22

标签: jpa implementation dao

我正在尝试为常见的数据库函数编写BaseDao类,如findAll,findById,insert,update,deleteById等。

我接受了BaseDao.java接口,另一个类BaseDaoAdapter.java实现了BaseDao.java。

这个Dao注入服务。因此,需要通用CRUD功能的服务类将使用此Dao,而那些需要特定功能的服务类将拥有自己的Dao。

我们这样做是为了减少Dao层的代码重复。

我写的类的代码如下。

@Repository
public class BaseDaoAdapter {
    private EntityManagerFactory emf;

    @PersistenceUnit
    public void setEntityManagerFactory(EntityManagerFactory emf) {
        this.emf = emf;
    }

    /**
     * 
     * @param tableName Name of table from which data has to be retrieved
     * @return A list of all the records in the specified table
     */
    @SuppressWarnings("unchecked")
    public List<? extends BaseEntity> list(String tableName){
        EntityManager em = emf.createEntityManager();
        Query q =em.createQuery("SELECT A FROM "+tableName+" A");
        return q.getResultList();
    }


    /**
     * 
     * @param obj An object of the entity that is to be inserted into the database.
     */
    public void add(BaseEntity obj){
        EntityManager em = emf.createEntityManager();
        em.getTransaction().begin();
        em.persist(obj);
        em.getTransaction().commit();
        em.close();
    }



    /**
     * 
     * @param obj Entity object to be deleted from the database
     */
    public void remove(BaseEntity obj){
        EntityManager em = emf.createEntityManager();
        em.getTransaction().begin();
        em.remove(obj);
        em.getTransaction().commit();
        em.close();
    }

}

这里BaseEntity是所有域类实现的接口。

当我尝试将查询返回的列表强制转换为任何特定于域的列表(例如List)时,(?extends BaseEntity)语法有时会出错。

我们这样做是因为我们只希望返回特定于域的列表。

我想在这里问两个问题。

  • 1)我们所遵循的方法是否正确?
  • 2)有没有更好的方法来实现这个BaseDaoAdapter,以便我们不会遇到类型转换问题?

1 个答案:

答案 0 :(得分:0)

我建议您仔细阅读有关Polymorphism主题的Google App Engine文档。可能尚不支持某些JDO继承关系。此外,如果您尝试使用此方法,也可以存储Key引用。

Google App Engine JDO Documentation on Polymorphism