这是很有可能的!我可能很晚才参加派对。但这肯定会在未来帮助某人。这是一个完整的解决方案,就像一个魅力!
为实体创建类,如下所示:BaseEntity
@MappedSuperclass
public class AbstractBaseEntity implements Serializable{
    @Id @GeneratedValue
    private Long id;
    @Version
    private int version;
    private LocalDateTime createdAt;
    private LocalDateTime updatedAt;
    public AbstractBaseEntity() {
        this.createdAt = LocalDateTime.now();
        this.updatedAt = LocalDateTime.now();
    }
    // getters and setters      
}
为 DAO 持久性创建一个通用的 JPA 存储库接口,如下所示:注意。请记住放置,以便 JPA 不会尝试查找存储库的实现!@NoRepositoryBean
@NoRepositoryBean
public interface AbstractBaseRepository<T extends AbstractBaseEntity, ID extends Serializable>
extends JpaRepository<T, ID>{
    
}
创建一个使用上述基本 JPA 存储库的基本服务类。这是您域中的其他服务接口将简单地扩展的接口,如下所示:
public interface AbstractBaseService<T extends AbstractBaseEntity, ID extends Serializable>{
    public abstract T save(T entity);
    public abstract List<T> findAll(); // you might want a generic Collection if u prefer
    public abstract Optional<T> findById(ID entityId);
    public abstract T update(T entity);
    public abstract T updateById(T entity, ID entityId);   
    public abstract void delete(T entity);
    public abstract void deleteById(ID entityId);
    // other methods u might need to be generic
    
}
然后为基本JPA存储库创建一个抽象实现,基本CRUD方法也将提供其实现,如下所示:
@Service
@Transactional
public abstract class AbstractBaseRepositoryImpl<T extends AbstractBaseEntity, ID extends Serializable>
        implements AbstractBaseService<T, ID>{
    
    private AbstractBaseRepository<T, ID> abstractBaseRepository;
    
    @Autowired
    public AbstractBaseRepositoryImpl(AbstractBaseRepository<T, ID> abstractBaseRepository) {
        this.abstractBaseRepository = abstractBaseRepository;
    }
    
    @Override
    public T save(T entity) {
        return (T) abstractBaseRepository.save(entity);
    }
    @Override
    public List<T> findAll() {
        return abstractBaseRepository.findAll();
    }
    @Override
    public Optional<T> findById(ID entityId) {
        return abstractBaseRepository.findById(entityId);
    }
    @Override
    public T update(T entity) {
        return (T) abstractBaseRepository.save(entity);
    }
    @Override
    public T updateById(T entity, ID entityId) {
        Optional<T> optional = abstractBaseRepository.findById(entityId);
        if(optional.isPresent()){
            return (T) abstractBaseRepository.save(entity);
        }else{
            return null;
        }
    }
    @Override
    public void delete(T entity) {
        abstractBaseRepository.delete(entity);
    }
    @Override
    public void deleteById(ID entityId) {
        abstractBaseRepository.deleteById(entityId);
    }
}
如何使用上面的摘要 、 、 和 :entityservicerepositoryimplementation
此处的示例将是一个实体。创建一个域实体,该实体扩展了以下内容:NB。、 、 、 等 将自动包含在实体中MyDomainAbstractBaseEntityIDcreatedAtupdatedAtversionMyDomainAbstractBaseEntity
@Entity
public class MyDomain extends AbstractBaseEntity{
    private String attribute1;
    private String attribute2;
    // getters and setters
}
然后为实体创建一个扩展,如下所示:repositoryMyDomainAbstractBaseRepository
@Repository
public interface MyDomainRepository extends AbstractBaseRepository<MyDomain, Long>{
}
此外,为实体创建一个接口,如下所示:serviceMyDomain
public interface MyDomainService extends AbstractBaseService<MyDomain, Long>{
}
然后为扩展实现的实体提供实现,如下所示:MyDomainAbstractBaseRepositoryImpl
@Service
@Transactional
public class MyDomainServiceImpl extends AbstractBaseRepositoryImpl<MyDomain, Long> 
        implements MyDomainService{
    private MyDomainRepository myDomainRepository;
    public MyDomainServiceImpl(MyDomainRepository myDomainRepository) {
        super(myDomainRepository);
    }
    // other specialized methods from the MyDomainService interface
}
Now use your `MyDomainService` service in your controller as follows: 
@RestController // or @Controller
@CrossOrigin
@RequestMapping(value = "/")
public class MyDomainController {
    
    private final MyDomainService myDomainService;
    @Autowired
    public MyDomainController(MyDomainService myDomainService) {
        this.myDomainService = myDomainService;
    }
   
    @GetMapping
    public List<MyDomain> getMyDomains(){
        return myDomainService.findAll();
    }   
    // other controller methods
}
铌。确保 用 进行注释,这样就不会尝试查找 Bean 的实现。此外,必须标记为抽象,否则JPA将尝试自动连接类构造函数中的所有子 daos,从而导致 a,因为在创建 bean 时将注入超过 1 个 daos(存储库)!现在,您的 、 和 更易于重用。我们都讨厌样板!AbstractBaseRepository@NoRepositoryBeanJPAAbstractBaseServiceImplAbstractBaseRepositoryNoUniqueBeanDefinitionExceptionservicerepositoryimplementations
希望这有助于某人。