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

问题描述 投票:0回答:1

我正在尝试找到一种方法,可以使用带有常规类型的spring boot实施存储库模式。到目前为止,我研究了这篇文章:

https://thoughts-on-java.org/implementing-the-repository-pattern-with-jpa-and-hibernate/

并尝试根据此问题的解决方案使用通用类型来实现此解决方案:

Using generics and jpa EntityManager methods

[我尝试使用JPA和Hibernate这样做,但是对我来说,当我尝试在指定的type参数上返回实体的类时,会出现错误。

以下是我的使用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);
}

然后,我为所有存储库创建了一个抽象类,以避免为所有模型重复我自己。

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();
}

我有抽象类返回属于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;
    }
}

[理想情况下,对于getEntityClass方法,我想返回User.class,但是在IDE上收到错误消息,提示“无法从类型变量中选择”。我在线上看了一些其他问题,人们尝试的另一件事是在User存储库中放入Class类型的参数或Class类型的成员。我尝试了两种方法,但没有用,有什么想法吗?

java spring hibernate spring-data-jpa repository-pattern
1个回答
0
投票

class UserRepository<User>应该只是class UserRepository。否则,User就像通用类型T一样。不是班级User

但是您正在重新发明轮子。学习和使用带有通用存储库的Spring Data JPA等。

© www.soinside.com 2019 - 2024. All rights reserved.