Java 如何拥有Springboot JPA的通用存储库
这是我的模型:-Java 如何拥有Springboot JPA的通用存储库,java,spring,spring-boot,hibernate,spring-data-jpa,Java,Spring,Spring Boot,Hibernate,Spring Data Jpa,这是我的模型:- @MappedSuperclass public class IdCommon { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "id") private Long id; @Version private Long version; @CreatedBy @Column(name =
@MappedSuperclass
public class IdCommon {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;
@Version
private Long version;
@CreatedBy
@Column(name = "created_by")
private String createdBy;
@CreatedDate
private Instant created;
@LastModifiedBy
@Column(name = "updated_by")
private String updatedBy;
@LastModifiedDate
private Instant updated;
}
@Entity
@Table(name="TBL_EMPLOYEES")
public class EmployeeEntity extends IdCommon {
@Column(name="first_name")
private String firstName;
@Column(name="last_name")
private String lastName;
@Column(name="email", nullable=false, length=200)
private String email;
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
@Override
public String toString() {
return "EmployeeEntity [id=" + 0 + ", firstName=" + firstName +
", lastName=" + lastName + ", email=" + email + "]";
}
}
我的存储库和服务:-
@Repository
public interface CommonRepository<E extends IdCommon> extends JpaRepository<E, Long>,
JpaSpecificationExecutor<E> {
}
@Service
public class EmployeeService {
//@Autowired
EmployeeRepository repository;
//@Autowired
CommonRepository<EmployeeEntity> commonRepository;
@Autowired
public EmployeeService(EmployeeRepository repository, CommonRepository<EmployeeEntity> commonRepository) {
this.repository = repository;
this.commonRepository = commonRepository;
}
public Page<EmployeeEntity> getAll(Pageable pageable){
Specification<EmployeeEntity> specification = (Specification<EmployeeEntity>) (root, query, builder) -> null;
return commonRepository.findAll(specification, pageable);
}
}
@存储库
公共接口CommonRepository扩展了JpaRepository,
JpaSpecificationExecutor{
}
@服务
公营雇员服务{
//@自动连线
雇员安置库;
//@自动连线
公共知识库公共知识库;
@自动连线
公共EmployeeService(EmployeeRepository存储库、CommonRepository CommonRepository){
this.repository=存储库;
this.commonRepository=commonRepository;
}
公共页getAll(可分页可分页){
规范规范=(规范)(根、查询、生成器)->null;
返回commonRepository.findAll(规范,可分页);
}
}
控制器:-
@RestController
@RequestMapping(path = "/employee")
public class EmployeeController2 {
@Autowired
private EmployeeService employeeService;
@GetMapping(path = "/all")
@ApiImplicitParams({
@ApiImplicitParam(name = "page", dataType = "integer", paramType = "query",
value = "page number"),
@ApiImplicitParam(name = "size", dataType = "integer", paramType = "query",
value = "Number of records per page."),
})
public Page<EmployeeEntity> getAll(@RequestParam(value = "sortBy", required = false, defaultValue = "created") String sortBy,
@ApiIgnore Pageable pageable,
@ApiParam(value = "sortDirection (desc/asc)")
@RequestParam(value = "sortDirection", required = false, defaultValue = "asc") String sortDirection){
if (sortDirection.equals("desc")) {
pageable = PageRequest.of(pageable.getPageNumber(), pageable.getPageSize(), Sort.by(sortBy).descending());
} else {
pageable = PageRequest.of(pageable.getPageNumber(), pageable.getPageSize(), Sort.by(sortBy).ascending());
}
return employeeService.getAll(pageable);
}
}
@RestController
@请求映射(路径=“/employee”)
公共类EmployeeController2{
@自动连线
私人雇员服务;
@GetMapping(path=“/all”)
@ApitParams({
@apimplicitparam(name=“page”,dataType=“integer”,paramType=“query”,
value=“页码”),
@apimplicitparam(name=“size”、dataType=“integer”、paramType=“query”,
value=“每页记录数。”),
})
公共页面getAll(@RequestParam(value=“sortBy”,required=false,defaultValue=“created”)字符串sortBy,
@APIGNORE Pageable Pageable,
@ApiParam(value=“sortDirection(desc/asc)”)
@RequestParam(value=“sortDirection”,required=false,defaultValue=“asc”)字符串sortDirection){
if(sortDirection.equals(“desc”)){
pageable=PageRequest.of(pageable.getPageNumber(),pageable.getPageSize(),Sort.by(sortBy.descending());
}否则{
pageable=PageRequest.of(pageable.getPageNumber(),pageable.getPageSize(),Sort.by(sortBy.ascending());
}
返回employeeService.getAll(可分页);
}
}
我得到了这个错误:-
:Servlet.service(),用于具有的上下文中的Servlet[dispatcherServlet]
路径[]引发异常[请求处理失败;嵌套异常
是org.springframework.dao.InvalidDataAccessApiUsageException:不是
实体:类com.howtodoinjava.demo.model.IdCommon;嵌套异常
是java.lang.IllegalArgumentException:不是实体:类
com.howtodoinjava.demo.model.IdCommon]及其根本原因
java.lang.IllegalArgumentException:不是实体:类
com.howtodoinjava.demo.model.IdCommon
如上错误所述,它不是en实体。所以我在IdCommon中添加了@Entity注释。然后我得到了新的错误:-
org.springframework.beans.factory.BeanCreationException:错误
创建在类路径中定义了名为“entityManagerFactory”的bean
资源
[org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]:
调用init方法失败;嵌套异常是
org.hibernate.AnnotationException:不能使用注释对实体进行注释
@Entity和@MappedSuperclass:
com.howtodoinjava.demo.model.IdCommon
我如何做到这一点?我的需求是具有通用存储库类型。我将有许多类似的实体。为了避免很多代码,我应该使用泛型。现在已经有一段时间了,我希望您已经有了解决方案。但是,对于其他面临同样问题的人,我将尝试找出你的解决方案不起作用的原因 首先,您的存储库必须用
@NoRepositoryBean
注释如下:
@NoRepositoryBean
public interface CommonRepository<E extends IdCommon> extends JpaRepository<E, Long>, JpaSpecificationExecutor<E> {}
服务类别大致相同:
@Service
public class EmployeeService {
private EmployeeRepository empRepository;
public EmployeeService(EmployeeRepository repository) {
this.empRepository = repository;
}
public void saveEmployee(EmployeeEntity entity) {//I added this for a test
empRepository.save(entity);
}
public Page<EmployeeEntity> getAll(Pageable pageable) {
Specification<EmployeeEntity> specification = (Specification<EmployeeEntity>) (root, query, builder) -> null;
return empRepository.findAll(specification, pageable);
}
}
这可能会有所帮助:我遇到此错误:*******************************************应用程序无法启动*******************************说明:com.test.service.RevisionService中构造函数的参数0需要找不到类型为“com.test.service.RevisionRepository”的bean。操作:考虑在配置中定义一个类型为“COM.Test.Services,RealixRealStand”的bean。我遵循的配置与您的示例几乎相同。问题似乎是包扫描问题,请检查您是否正在扫描所有必要的包。在您的情况下,至少要扫描
com.test.service
,看起来如果我将@NoRepositoryBean更改为@Repository,它就可以启动应用程序了。但它不能满足我的重新装备。你试过扫描所有的软件包吗?在同一个软件包中,我有其他的存储库,除了这个带有@NoRepositoryBean的新存储库外,其他的都可以正常工作。所以扫描不是这里的问题。如前所述,如果我改为@Repository,它就会启动,但最终它无法为我的改装服务。
@Service
public class EmployeeService {
private EmployeeRepository empRepository;
public EmployeeService(EmployeeRepository repository) {
this.empRepository = repository;
}
public void saveEmployee(EmployeeEntity entity) {//I added this for a test
empRepository.save(entity);
}
public Page<EmployeeEntity> getAll(Pageable pageable) {
Specification<EmployeeEntity> specification = (Specification<EmployeeEntity>) (root, query, builder) -> null;
return empRepository.findAll(specification, pageable);
}
}
@SpringBootApplication
public class DemoApplication implements CommandLineRunner {
@Autowired
private EmployeeService service;
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
@Override
public void run(String... args) throws Exception {
EmployeeEntity entity = new EmployeeEntity();
entity.setEmail("aa@so.com");
entity.setFirstName("First name");
entity.setLastName("Last name");
service.saveEmployee(entity);
Page<EmployeeEntity> page = service.getAll(PageRequest.of(0, 1));
page.getContent().stream().forEach(System.out::println); //output: EmployeeEntity [id=0, firstName=First name, lastName=Last name, email=aa@so.com]
}
}