如何在JavaSpring中使用泛型类型实现存储库模式

如何在JavaSpring中使用泛型类型实现存储库模式,java,spring,hibernate,spring-data-jpa,repository-pattern,Java,Spring,Hibernate,Spring Data Jpa,Repository Pattern,我正试图找到一种方法,使用SpringBoot和泛型类型来实现存储库模式。到目前为止,我研究了这篇文章: 并尝试基于此问题的解决方案,使用泛型类型实现此解决方案: 我尝试使用JPA和Hibernate执行此操作,但对我来说,在尝试返回指定类型参数上的实体类时出现错误 以下是我使用JPA和Hibernate的用户模型: package models; import javax.persistence.*; @Entity public class User extends Model {

我正试图找到一种方法,使用SpringBoot和泛型类型来实现存储库模式。到目前为止,我研究了这篇文章:

并尝试基于此问题的解决方案,使用泛型类型实现此解决方案:

我尝试使用JPA和Hibernate执行此操作,但对我来说,在尝试返回指定类型参数上的实体类时出现错误

以下是我使用JPA和Hibernate的用户模型:

package models;

import javax.persistence.*;

@Entity
public class User extends Model {
    @Id
    @Column(name = "id", updatable = false, nullable = false)
    private String id;

    public String username;
    private String password;

    public User(String username, String password) {
        super();
        this.username = username;
        this.password = password;
    }

    public String getPassword() {
        return password;
    }

}
以下是我的基本CRUD操作界面:

package repositories;

import models.Model;

import java.util.UUID;

public interface IRepository<T> {
    void add(T entity);
    void delete(String id);
    void update(T entity);
    T get(String id);
    boolean exists(String id);
}
包存储库;
导入模型;
导入java.util.UUID;
公共接口假定{
无效添加(T实体);
作废删除(字符串id);
无效更新(T实体);
T get(字符串id);
存在布尔值(字符串id);
}
然后,我为所有存储库创建了一个抽象类,以避免对所有模型重复我自己

package repositories;

import models.Model;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;

public abstract class Repository<T> implements IRepository<T>{

    private EntityManager em;

    public Repository(EntityManager em){
        this.em = em;
    }

    @Override
    public void add(T entity) {
        em.persist(entity);
    }

    @Override
    public void delete(String id) {
        T entity = get(id);
        em.remove(entity);
    }

    @Override
    public void update(T entity) {
        em.merge(entity);
    }

    @Override
    public T get(String id) {
        return em.find(getEntityClass(), id);
    }

    public boolean exists(String id) {
        return em.contains(get(id));
    }

    // link to an explanation can be found at:https://stackoverflow.com/questions/40635734/using-generics-and-jpa-entitymanager-methods
    // when a class extends this class, all is needed is to fill out the method body of to return the class.
    public abstract Class<T> getEntityClass();
}
包存储库;
导入模型;
导入javax.persistence.EntityManager;
导入javax.persistence.EntityManagerFactory;
公共抽象类存储库实现了IRepository{
私人实体管理者;
公共存储库(EntityManager em){
this.em=em;
}
@凌驾
公共无效添加(T实体){
em.persist(实体);
}
@凌驾
公共无效删除(字符串id){
T实体=get(id);
em.remove(实体);
}
@凌驾
公共无效更新(T实体){
合并(实体);
}
@凌驾
公共T获取(字符串id){
返回em.find(getEntityClass(),id);
}
存在公共布尔值(字符串id){
返回em.contains(get(id));
}
//有关说明的链接,请访问:https://stackoverflow.com/questions/40635734/using-generics-and-jpa-entitymanager-methods
//当一个类扩展这个类时,只需填写返回该类的方法体。
公共抽象类getEntityClass();
}
抽象类用于返回属于T的类

这是用户的特定存储库:

package repositories;
import models.Model;
import models.User;

import javax.persistence.EntityManager;

public class UserRepository<User> extends Repository<User> {

    public UserRepository(EntityManager em) {
        super(em);
    }

    @Override
    public Class<User> getEntityClass() {
        return null;
    }
}
包存储库;
导入模型;
导入模型。用户;
导入javax.persistence.EntityManager;
公共类UserRepository扩展了存储库{
公共用户存储库(EntityManager em){
超级(em);
}
@凌驾
公共类getEntityClass(){
返回null;
}
}

理想情况下,对于getEntityClass方法,我希望返回User.class,但我在IDE上收到一个错误,上面写着“无法从类型变量中选择”。我在网上又看了几个问题,人们尝试的另一件事是在用户存储库中放置一个Class类型的参数或一个Class类型的成员。我尝试了两种方法,但都不起作用,有什么想法吗?

classuserrepository
应该是
classuserrepository
。否则,
User
就像
T
,一种泛型类型。不是类
用户


但你正在重新发明轮子。学习并使用SpringDataJPA,它带来了通用存储库等。

查看分页和排序存储库