Hibernate: CRUD Generic DAO

后端 未结 5 1874
清酒与你
清酒与你 2020-12-02 06:46

My web application has got a lot of service tables/entities, such as payment_methods, tax_codes, province_codes, etc.

Each time

5条回答
  •  伪装坚强ぢ
    2020-12-02 07:16

    you can use Generic DAO as leverage for other Domain specific DAO classes. Suppose you have an Employee Domain class as:

      @Entity
      @Table(name="employee")
      public class Employee {
    
        @Id
        @Column(name="id")
        @GeneratedValue(strategy=GenerationType.AUTO)
        private Long id;
    
        @Column(name="emp_name")
        private String empName;
    
        @Column(name="emp_designation")
        private String empDesignation;
    
        @Column(name="emp_salary")
        private Float empSalary;
    
        public Long getId() {
            return id;
        }
    
        public void setId(Long id) {
            this.id = id;
        }
    
        public String getEmpName() {
            return empName;
        }
    
        public void setEmpName(String empName) {
            this.empName = empName;
        }
    
        public String getEmpDesignation() {
            return empDesignation;
        }
    
        public void setEmpDesignation(String empDesignation) {
            this.empDesignation = empDesignation;
        }
    
        public Float getEmpSalary() {
            return empSalary;
        }
    
        public void setEmpSalary(Float empSalary) {
            this.empSalary = empSalary;
        }
    
    
    }
    

    then the required generic DAO would look something like this:

    Generic DAO Interface:

     public interface GenericRepositoryInterface {
    
        public T save(T emp);
        public Boolean delete(T emp);
        public T edit(T emp);
        public T find(Long empId);
    }
    

    Generic DAO implementation:

    @Repository
    public class GenericRepositoryImplementation implements GenericRepositoryInterface {
    
    protected EntityManager entityManager;
    private Class type;
    
    public GenericRepositoryImplementation() {
        // TODO Auto-generated constructor stub
    
    }
    
    public GenericRepositoryImplementation(Class type) {
        // TODO Auto-generated constructor stub
    
        this.type = type;
    }
    
    public EntityManager getEntityManager() {
        return entityManager;
    }
    
    @PersistenceContext
    public void setEntityManager(EntityManager entityManager) {
        this.entityManager = entityManager;
    }
    @Override
    public T save(T emp) {
        // TODO Auto-generated method stub
        entityManager.persist(emp);
        entityManager.flush();
        return emp;
    }
    
    @Override
    public Boolean delete(T emp) {
        // TODO Auto-generated method stub
        try {
             entityManager.remove(emp);
        } catch (Exception ex) {
            return false;
        }
        return true;
    }
    
    @Override
    public T edit(T emp) {
        // TODO Auto-generated method stub
        try{
           return entityManager.merge(emp);
        } catch(Exception ex) {
            return null;
        }
    }
    
    @Override
    public T find(Long empId) {
        // TODO Auto-generated method stub
        return (T) entityManager.find(Employee.class, empId);
    }
    } 
    

    This generic DAO class then needs to be extended by every Domain specific DAO class. The Domain specific DAO class may even implement another interface for operations that are not common in general. And prefer sending type information using constructor.

提交回复
热议问题