【发布时间】:2014-09-11 11:32:03
【问题描述】:
我正在使用 Spring 和 Spring Data JPA 构建一个小型应用程序,我需要在服务层使用 CrudRepository 方法,所以我创建了 2 个类:GenericService 和 GenericServiceImpl。但我不知道这是否是正确的,甚至是最好的方法。
这是一个例子:
POJO:
@Entity
public class User {
@Id
private Long id;
private String username;
}
道:
public interface UserDAO extends CrudRepository<User, Long> {
User findOneByUsername(String username);
}
通用服务
public interface GenericService<T, ID extends Serializable> {
<S extends T> S save(S entity);
}
服务
public interface UserService extends GenericService<User, Long> {
User findOneByUsername(String username);
}
通用服务实现
public class GenericServiceImpl<T, ID extends Serializable> implements GenericService<T, ID> {
@Autowired
private CrudRepository<T, ID> repository;
@Override
public <S extends T> S save(S entity) {
return repository.save(entity);
}
}
服务实现
@Service
@Transactional
public class UserServiceImpl extends GenericServiceImpl<User, Long> implements UserService {
@Autowired
private UserDAO userDAO;
@Override
public User findOneByUsername(String username) {
userDAO.findOneByUsername(username);
}
}
【问题讨论】:
-
你为什么要做所有的手动委托而不是直接使用存储库接口?
-
“直接使用存储库接口”是什么意思?我试图做这样的事情Spring and Autowiring of Generic Types
-
从控制器访问UserDAO可以吗?我真的不需要我刚刚这样做的服务层,因为我认为这将是最佳实践。
-
是的,如果您的服务层没有添加更多逻辑。当服务层不仅仅做数据访问时,您将需要对较大的项目进行分离。
-
这真的有效吗?正在尝试但在我的应用程序启动期间总是出现异常:没有找到类型 [org.springframework.data.jpa.repository.JpaRepository] 的合格 bean 依赖(使用 JpaRepository 而不是 CrudRepository)
标签: java spring jpa design-patterns spring-data-jpa