微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Spring JPA数据存储库:如何创建通用存储库?

如何解决Spring JPA数据存储库:如何创建通用存储库?

我一直在寻找一种方法来做,但是找不到。

基本上,我想创建一个通用存储库,可以在任何地方注入。我在这个项目中需要做很多工作,他们几乎都是一样的。

我只是尝试做

@Service
public class MyService<T> {
   
   @Autowired
   CrudRepository<T,Long> myRepository;

}

但是那没用(它说找不到那个bean)。

所以接下来我试图定义一个通用的CrudRepository接口,例如

@Repository
public interface MyRepository<T> extends CrudRepository<T,Long> {
}

然后像这样再次感染

@Service
public class MyService<T> {
   
   @Autowired
   MyRepository<T> myRepository;

}

但是那也不起作用。我收到以下错误

原因:org.springframework.data.mapping.MappingException:找不到类型类java.lang.Object的PersistentEntity!

接下来的工作我有点茫然。任何帮助将不胜感激。

解决方法

我在这里尝试执行的操作遇到很多问题。记住,Spring初始化时将查找您声明要注入的类型的bean。为此,它必须是可解析的类型,请参见https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/core/ResolvableType.html

spring data jpa存储库已经是通用的,您可以对此进行扩展

public interface MyRepository<T> extends CrudRepository<T,Long>{}

public interface TheirRepository<T> extends MyRepository<T>{}

public interface AnotherRepository<T> extends TheirRepository<T>{}

根据您的需要,但是最终如果要使用它,则必须声明一个符合您的实体的名称。因此,无论您如何将其切成小方块,最终都必须声明类似

的内容
public interface MyGenericRepository<MyActualEntity>{}

为避免这种情况,我鼓励您像往常一样继续创建所有存储库,然后通过查找存储库中您所操作的类型,创建一个通常可保存,更新,删除实体的服务类上。像这样:

import org.springframework.data.repository.CrudRepository;
import org.springframework.data.repository.support.Repositories;
import org.springframework.stereotype.Service;
import org.springframework.web.context.WebApplicationContext;

@Service
public class GenericPersistenceService {

  private final WebApplicationContext applicationContext;
  private Repositories repositories;

  public GenericPersistenceService(WebApplicationContext applicationContext) {
    repositories = new Repositories(applicationContext);
    this.applicationContext = applicationContext;
  }

  public <T> T save(T object) {
    Object repository = repositories.getRepositoryFor(object.getClass()).orElseThrow(
        () -> new IllegalStateException(
            "Can't find repository for entity of type " + object.getClass()));
    CrudRepository<T,Long> crudRepository = (CrudRepository<T,Long>) repository;

    return crudRepository.save(object);
  }
}

创建服务时将填充存储库,然后将实体传递给save方法时,它将查找给定实体的存储库并执行保存操作。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。