Я пытаюсь закодировать класс 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, чтобы у нас не возникало проблем приведения типов?