我正在使用Crud和Spring MVC,并且陷入了将相同代码复制到不同存储库的困境;
f.e。如果我使用客户,物品和登录名,则
public interface CustomerRepository extends CrudRepository<Customer, Long>{
}
但与Item我有相同的东西:
public interface ItemRepository extends CrudRepository<Item, Long>{
}
此外,存储库中有相同的方法,例如findAll(),findDistinctBy ...(),deleteAll()等。
据我所知,好的做法是转义代码重复,但是我应该在哪里做呢?在服务中,使用特殊的服务接口并通过特殊的类实现它,然后为每个实体专门化服务?还是我应该像我在Spring Data JPA官方参考文档spring data reference $4.3.1中所说的那样在我的自定义存储库中这样做?
我的带有服务代码的变体如下。 所有实体的通用界面
import org.springframework.data.repository.CrudRepository;
public interface MyCrudService<T>{
<S extends CrudRepository<T, Long>> Iterable<T> findAll(S s);
}
实现服务的通用类
import org.springframework.data.repository.CrudRepository;
public class MyCrudServiceImpl<T> implements MyCrudService<T>{
@Override
public <S extends CrudRepository<T, Long>> Iterable<T> findAll(S s) {
return s.findAll();
}
}
单位实体的特殊服务类别
@Service
@Transactional
@AllArgsConstructor
public class MyUnitServiceTwo{
UnitRepository unitRepository;
MyCrudServiceImpl crudService;
public List<Unit> findAll1() {
return Lists.newArrayList(crudService.findAll(unitRepository));
}
}