Jon*_*nas 7 java spring design-patterns jpa spring-data-jpa
我正在使用Spring和Spring Data JPA构建一个小应用程序,我需要在服务层中使用CrudRepository方法,因此我创建了两个类:GenericService和GenericServiceImpl.但我不知道这是正确的,甚至是最好的方法.
这是一个例子:
POJO:
@Entity
public class User {
@Id
private Long id;
private String username;
}
Run Code Online (Sandbox Code Playgroud)
DAO:
public interface UserDAO extends CrudRepository<User, Long> {
User findOneByUsername(String username);
}
Run Code Online (Sandbox Code Playgroud)
通用服务
public interface GenericService<T, ID extends Serializable> {
<S extends T> S save(S entity);
}
Run Code Online (Sandbox Code Playgroud)
服务
public interface UserService extends GenericService<User, Long> {
User findOneByUsername(String username);
}
Run Code Online (Sandbox Code Playgroud)
通用服务impl.
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);
}
}
Run Code Online (Sandbox Code Playgroud)
服务Impl.
@Service
@Transactional
public class UserServiceImpl extends GenericServiceImpl<User, Long> implements UserService {
@Autowired
private UserDAO userDAO;
@Override
public User findOneByUsername(String username) {
userDAO.findOneByUsername(username);
}
}
Run Code Online (Sandbox Code Playgroud)
是的,您正在提供自己的 impl,它可以执行自定义操作,同时仍然重用来自 Spring JPA 的 CrudRepository 的派生查询。我见过很多次了。:) 如果我们想在调用 Derived 方法之前进行自己的计算,我们需要这样做。毕竟,该计算很可能是存储库的一部分,因此将该逻辑放入服务中是没有意义的。但在您的场景中,如果没有此类自定义计算,则不需要这种间接。正如评论者提到的,您应该直接使用 UserDao 接口。:)
| 归档时间: |
|
| 查看次数: |
17162 次 |
| 最近记录: |