如何实现SpringDataJpa公共代码的封装
Jpa在框架层面上实现了常用的CRUD操作。我想在Controller的父类上,父类自带了普通的增删改查接口,然后子类只需要扩展额外个性化功能即可。
个人实现如下,BaseRepository 实现JpaRepository,
BaseService中,注入BaseRepository
BaseController中,注入BaseService
现在个人碰到的问题是,在User Controller调用查询的时候,service使用了SimpleJpaRepository 这个默认实现来进行查询,查询的泛型被定义为BaseEntity,BaseEntity并非一个实体 所以报错。
求教,我的想法有没有什么问题?
然后就是,我的这种想要实现的方式有没有什么已有的最佳实践?
最后,如果有大佬可以指点出我的问题,能帮我调试一下,更是感激不尽。
####现在的代码结构
####Entity
@MappedSuperclass
@Data
public abstract class BaseEntity {
@Id
@GeneratedValue(generator = "core-uuid")
@GenericGenerator(name = "core-uuid", strategy = "uuid2")
private String id;
@CreationTimestamp
private Date createTime;
@UpdateTimestamp
private Date updateTime;
}
####Repository:
BaseRepository
public interface BaseRepository<T extends BaseEntity> extends JpaRepository<T,String> {}
UserRepository
public interface UserRepository extends BaseRepository<User> {}
####Service
BaseService
public abstract class BaseService<R extends BaseRepository<T>, T extends BaseEntity> {
@Resource
public R repository;
public T selectOne(String id) {
return repository.getOne(id);
}
public List<T> selectListAll() {
System.out.println(repository.getClass());
return repository.findAll();
}
public void insert(T entity) {
repository.save(entity);
}
public void delete(T entity) {
repository.delete(entity);
}
public void deleteById(String id) {
repository.deleteById(id);
}
}
UserService
@Service
public class UserService extends BaseService<UserRepository, User> {
}
####Controller
@Slf4j
public abstract class BaseController<S extends BaseService,E extends BaseEntity> {
@Resource
protected S service;
@GetMapping
public List<E> findAll(){
return service.selectListAll();
}
}
UserController
@RestController
@RequestMapping("/user")
public class UserController extends BaseController<UserService, User> {
}