spring-data-jpa 如何为给定的域类检索Spring Data 仓库示例?

eivgtgni  于 2022-11-10  发布在  Spring
关注(0)|答案(5)|浏览(145)

给定某个类Bar中的所有spring数据库的列表:

@Autowired
private List<Repository> repositories;

如何在上面的列表中找到现有域类Foo的存储库?
假设存在以下情况:

@Entity
public class Foo {
  ...
}

public interface FooRepository extends JpaRepository<Foo, String> {}
eqzww0vc

eqzww0vc1#

Spring Data Commons包含一个类Repositories,它接受一个ListableBeanFactory来查找其中定义的所有存储库bean,并公开一个API来通过域类(通过….getRepository(Class<?> type))获取这些示例。
这个类应该小心使用。因为仓库示例有一些严重的代理生成,所以你必须确保在ApplicationContext创建期间尽可能晚地创建Repositories示例。首选的方法是实现ApplicationListener,并通过监听ContextRefreshedEvent来创建示例。
如果您正在编写一个Web应用程序,使用Repositories最安全的方法是引导由ContextLoaderListener创建的ApplicationContext中的存储库,并放置Repositories(有关详细信息,请参阅Spring MVC的参考文档)。

polhcujo

polhcujo2#

@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);
    }
}
qeeaahzv

qeeaahzv3#

解决 方案 的 关键 是 Spring 的 org.springframework.data.repository.core.support.DefaultRepositoryMetadata , 它 提供 了 getDomainType() 方法 。
DefaultRepositoryMetadata 需要 存储 库 接口 作为 构造 器 参数 。 因此 , 可以 遍历 所有 现有 存储 库 , 检索 存储 库 接口 ( 这 仍然 是 一 个 棘手 的 部分 , 因为 存储 库 示例 有 多 个 接口 ) , 并 找到 getDomainType() 等于 Foo.class 的 接口 。

rryofs0p

rryofs0p4#

您可以使用Spring的GenericTypeResolver从存储库中获取Entity类。

Repository<Foo, String> fooRepository = repositories.stream()
    .filter(repository -> GenericTypeResolver
        .resolveTypeArguments(repository.getClass(), Repository.class)[0].equals(Foo.class))
    .findFirst().get();
dsf9zpds

dsf9zpds5#

这对我很有效:

Repositories repositories = new Repositories(context);
CrudRepository repo = (CrudRepository) repositories.
            getRepositoryFor(entityClass).get();

相关问题