Build Dao для общих функций базы данных - PullRequest
1 голос
/ 18 января 2011

Я пытаюсь закодировать класс BaseDao для общих функций базы данных, таких как findAll, findById, вставка, обновление, deleteById и т. Д.

Я взял интерфейс BaseDao.java, а другой класс BaseDaoAdapter.java реализует BaseDao.java.

Этот Дао вводится в эксплуатацию. Таким образом, классы обслуживания, для которых требуется общая функциональность 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 - это интерфейс, который реализуют все классы домена.

Синтаксис (? Extends BaseEntity) иногда выдает ошибки, когда я пытаюсь преобразовать список, возвращенный запросом, в любой специфичный для домена список, например List.

Мы сделали это, потому что хотим вернуть только список, относящийся к домену.

Я хотел бы задать два вопроса здесь.

  • 1) Правильный ли подход, которым мы придерживаемся?
  • 2) Есть ли лучший способ реализовать этот BaseDaoAdapter, чтобы у нас не возникало проблем приведения типов?

1 Ответ

0 голосов
/ 18 января 2011

Я бы посоветовал вам очень внимательно прочитать документацию Google App Engine на тему полиморфизма.Некоторые отношения наследования JDO могут еще не поддерживаться.Кроме того, может быть хорошей идеей сохранить ссылку на ключ, если вы попытаетесь использовать этот метод.

Документация JDO Google App Engine по полиморфизму

...