Buduję małą aplikację przy użyciu Spring i Spring Data JPA i potrzebuję użyć metod CrudRepository w warstwie service, więc zrobiłem 2 klasy: GenericService i GenericServiceImpl. Ale nie wiem, czy to jest właściwe, czy nawet najlepsze podejście.Metody Crud w warstwie usług przy użyciu Spring Data JPA
Oto przykład:
POJO:
@Entity
public class User {
@Id
private Long id;
private String username;
}
DAO:
public interface UserDAO extends CrudRepository<User, Long> {
User findOneByUsername(String username);
}
Generic serwis
public interface GenericService<T, ID extends Serializable> {
<S extends T> S save(S entity);
}
usługi
public interface UserService extends GenericService<User, Long> {
User findOneByUsername(String username);
}
Ogólna usługa imp.
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);
}
}
Serwis 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);
}
}
Dlaczego robisz wszystko z tym ręcznym delegacji zamiast korzystać bezpośrednio interfejsy repozytorium? – chrylis
Co rozumiesz przez "używanie interfejsów repozytorium direclty"? Próbowałem zrobić coś takiego [Spring i Autowiring of Generic Types] (http://www.jayway.com/2013/11/03/spring-and-autowiring-of-generic-types/) – jonas
Mam na myśli autowire Twój 'CrudRepository' bezpośrednio w kodzie, który manipuluje obiektami zamiast mieć oddzielną hierarchię usług, która tylko ją replikuje. – chrylis