冬眠与春 - 道 ,服务

2022-09-04 02:52:43

我一直在阅读一些教程,我可以看到大多数MVC实现

基于:

1)一个道接口,例如“IUserDao”

2)该接口的一个道 impl - “mySimpleUserDaoImpl”

3)持久化的服务接口:“IUserService”

4) 和一个 impl - “UserServiceImpl”

这是最佳做法吗?我的意思是,我问这个问题的原因是,拥有30个带有getXById(),deleteX(x),createX(x)方法的服务似乎是多余的,这些方法或多或少地做了同样的事情。

请注意,我正在使用spring 3和hibernate 4,我决定在我开始用代码猛击键盘之前问这个问题

谢谢。


答案 1

如果您刚刚开始开发,请查看Spring JPA。服务应该是一对多存储库 (DAO)。但我也不会再手动创建所有这些样板代码了。Spring JPA消除了基本的CRUD和搜索功能以及分页。

这是一个视频,它介绍了Spring,JPA,Hibernate的所有配置,并以Spring Data JPA结束,向您展示了所有已消除的样板代码。

要使用Spring Data JPA,您的存储库界面最终为:

package com.mysampleapp.repository;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import com.wcfgroup.model.Employee;

@Repository("employeeRepository")
public interface EmployeeRepository extends JpaRepository<Employee, Long> {
    Employee findBySsn(String ssn);
}

然后XML配置使用Spring Data JPA:

<jpa:repositories base-package="com.mysampleapp.repository"/>

现在,所有样板代码都已为您处理。您不再需要使用查找方法和基本 CRUD 函数创建基本存储库类。该界面提供了许多不错的功能,您无需为实现做任何事情。JpaRepository


答案 2

每个模型都需要有 dao、daoImpl、service、serviceImpl。

  • 用户道
  • UserDaoImpl
  • 用户服务
  • 用户服务简介

您可以使用泛型类 EntityDaoImpl anf inteface EntityDao,如下所示:

实体道:

public interface EntityDao<E> {

void persist(E e) throws Exception;

void remove(Object id) throws Exception;

E findById(Object id) throws Exception;
}

EntityDaoImpl:

public class EntityDaoImpl<E>  implements EntityDao<E> {

@PersistenceContext(unitName="UnitPersistenceName")
protected EntityManager entityManager;

protected E instance;
private Class<E> entityClass;

@Transactional
public void persist(E e) throws HibernateException{     
    getEntityManager().persist(e);
}
    @Transactional
public void remove(Object id) throws Exception{     
    getEntityManager().remove((E)getEntityManager().find(getEntityClass(), id));
}

public E findById(Object id) throws Exception {     
    return (E)getEntityManager().find(getEntityClass(), id);    
}
    public EntityManager getEntityManager() {
    return entityManager;
}
public void setEntityManager(EntityManager entityManager) throws Exception{
    this.entityManager = entityManager;
}

    public Class<E> getEntityClass() throws Exception{      
   if (entityClass == null) {
            Type type = getClass().getGenericSuperclass();
          if (type instanceof  ParameterizedType) 
          {
              ParameterizedType paramType = (ParameterizedType) type;
              if (paramType.getActualTypeArguments().length == 2) {
                    if (paramType.getActualTypeArguments()[1] instanceof  TypeVariable) {
                       throw new IllegalArgumentException(
                          "Can't find class using reflection");
                   }
                    else {
                       entityClass = (Class<E>) paramType.getActualTypeArguments()[1];
                  }
               } else {
                  entityClass = (Class<E>) paramType.getActualTypeArguments()[0];
                }
           } else {
              throw new Exception("Can't find class using reflection");
          }
        }
       return entityClass;
   }
}

你可以像这样使用:

public interface UserDao extends EntityDao<User> {

}

public class UserDaoImpl extends EntityDaoImpl<User> implements UserDao{

}

推荐