如何解决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 举报,一经查实,本站将立刻删除。