Udo*_*Udo 18 java spring jpa spring-data spring-data-jpa
给出某些类中所有spring数据存储库的列表Bar:
@Autowired
private List<Repository> repositories;
Run Code Online (Sandbox Code Playgroud)
如何Foo在上面的列表中找到现有域类的存储库?
假设存在以下内容:
@Entity
public class Foo {
...
}
Run Code Online (Sandbox Code Playgroud)
和
public interface FooRepository extends JpaRepository<Foo, String> {}
Run Code Online (Sandbox Code Playgroud)
Oli*_*ohm 25
Spring Data Commons包含一个类Repositories,该类ListableBeanFactory用于查找在其中定义的所有存储库bean,并公开API以通过域类(通过….getRepository(Class<?> type))获取这些实例.
应谨慎使用本课程.由于存储库实例正在进行一些严格的代理生成,因此您必须确保在Repositories创建期间尽可能晚地创建实例ApplicationContext.首选方法是ApplicationListener通过监听实现和创建实例ContextRefreshedEvent.
如果您正在编写Web应用程序,最安全的使用方法Repositories是通过引导ApplicationContext创建的存储库ContextLoaderListener并放置Repositories(有关详细信息,请参阅Spring MVC 的参考文档).
Dee*_*pak 16
@Service
public class GenericRepository {
@Autowired
private WebApplicationContext appContext;
Repositories repositories = null;
public GenericRepository() {
repositories = new Repositories(appContext);
}
public JpaRepository getRepository(AbstractPersistable entity) {
return (JpaRepository) repositories.getRepositoryFor(entity.getClass());
}
public Object save(AbstractPersistable entity) {
return getRepository(entity).save(entity);
}
public Object findAll(AbstractPersistable entity) {
return getRepository(entity).findAll();
}
public void delete(AbstractPersistable entity) {
getRepository(entity).delete(entity);
}
}
Run Code Online (Sandbox Code Playgroud)
解决这个问题的关键是Springorg.springframework.data.repository.core.support.DefaultRepositoryMetadata提供的方法getDomainType()。
DefaultRepositoryMetadata需要存储库接口作为构造函数参数。因此,我们可以遍历所有现有存储库,检索存储库接口(这仍然是一个棘手的部分,因为存储库实例有多个接口)并找到getDomainType()equals 的接口Foo.class。
| 归档时间: |
|
| 查看次数: |
14691 次 |
| 最近记录: |