当前位置: 首页 > 知识库问答 >
问题:

@自动连接的Spring JPA存储库的主要等效项

白博易
2023-03-14

我在应用程序中使用Spring JPA存储库和实体。现在,在这个应用程序中,我需要扩展我的一个实体,并提供一个扩展的存储库。

对于我需要覆盖/扩展的所有其他beans,我只需创建一个新的实现并用@Primary对其进行注释,这样它将自动连接,而不是默认实现。

然而,对于存储库来说,这是行不通的。我可以用@Primary注释新的存储库,但是没有效果(两个beans都找到了,因此不能自动连接)。这是有意义的,因为存储库是一个接口而不是一个实现,实现是由Spring动态提供的。

我可以告诉Spring(通过存储库上的注释或通过配置)使用哪个存储库吗?或者我是否必须在Spring Data JPA存储库中使用@Primary这样的手动解决方法,或者我应该想出一种存储库提供程序而不是自动连接?

编辑以使事情更清晰:假设我有一个实体 A

@Entity
public class A {
  @Id
  private long id;
}

及其存储库

public ARepository extends Repository<A, Long> {
}

现在我把它扩展到实体< code>B

@Entity
public class B extends A {
}

public interface BRepository extends ARepository {
}

通常,根据文档,您可以使用如下存储库:

@Autowired
private ARepository repository;

但是,这并不可行,因为现在有两个类型为< code>ARepository的beans。对于我自己实现的beans,我会在扩展类上使用< code>@Primary,但是对于存储库,在编译时没有接口的实现。

共有3个答案

闻人修明
2023-03-14

我可以以某种方式告诉 Spring(通过存储库上的注释或通过配置)使用哪个存储库吗?

是的,你可以。首先,给每个存储库类一个惟一的bean名称。

@Repository("myARepository")
public ARepository extends Repository<A, Long> {
}

@Repository("myBRepository")
public interface BRepository extends ARepository {
}

然后,当您使用< code>ARepository作为类型进行自动连接时,您应该使用< code>@Qualifier注释来告诉Spring您想要哪个存储库。

@Autowire
@Qualifier("myBRepository")
private ARepository repository;

这将自动连线一个< code >仓库

时仰岳
2023-03-14

仅供记录,可以按照此处的建议向 JPA 存储库添加@Primary支持 在 Spring 数据中使用@Primary JPA 存储库

我对缺失代码的实现:

private boolean isSpringDataJpaRepository(Class<?> beanClass) {
      return JpaRepositoryFactoryBean.class.isAssignableFrom(beanClass);
}

我认为@拉尔夫的答案更好,因为类型安全。

武友樵
2023-03-14

我会改编这个答案的想法:https://stackoverflow.com/a/27549198/280244 和这个 git 示例 https://github.com/netgloo/spring-boot-samples/tree/master/spring-boot-springdatajpa-inheritance/src/main/java/netgloo/models

引入一个标有@NoRepositoryBean的通用抽象存储库

@NoRepositoryBean
public interface AbstractARepository<T extends A>
                                    extends Repository<T, Long> {
    T findByName(String name); //or what ever your queries are
}

public ARepository extends AbstractARepository<A> {
   //almost emtpy
}


public BRepository extends AbstractARepository<B> {
   //queries that are special for B
}

现在,您可以插入ARepositoryBRepository,两者都是类型保存!

 类似资料:
  • 我在Spring Boot上还是新手,我在mongoDB数据库中使用Spring-Boot添加了一个名为文章的文档,我想在该文章中添加注释。但是Spring-boot不能在我的应用程序中自动连接我的存储库。 下面是我的Repository类,它实现了ArticleRepositoryCustom接口,该接口包含一个OuterComment方法。 文章库 这是我的Springboot应用程序课程 当

  • 问题内容: 我想查询从左表中的Id和联接表中的描述在1行上输出的ID。 架构: 示例数据: 因此,我希望输出为: 问题答案: SELECT p.ID PersonID, STUFF( (SELECT ‘;’ + b.description FROM personrole a INNER JOIN role b ON a.roleid = b.id WHERE a.personid = p.id F

  • 我已经用@Autowired注释为相应的存储库定义了服务类 存储库接口定义为从JpaReepository扩展 应用程序自动编译服务类 运行时,我得到以下错误

  • 当我们在spring mvc中使用crud存储库时,会出现以下错误

  • 在 Docker Hub 中,可以通过单击“”选项卡右上角的相应按钮来配置自动生成。除了在推送到包含 的源代码存储库时配置重建之外,还可以将“存储库链接”设置为“为基本映像启用”。这旨在“每当在 Docker Hub 上更新基本映像时,都会在此存储库中触发构建”。 我在一些简单的玩具示例中实现了这个功能。但它无法触发一个更复杂的例子。我的看起来像这样: 如果(任一)基本映像更新,为什么不会触发重建

  • 我正在试验Spring和MongoDB。在我的项目中,我有一个存储库和一个有调度方法的服务。问题是,存储库没有自动运行,它总是为空。 Autowire在主应用程序类中正常工作(通过实现CommandLineRunner进行测试) 我错过什么了吗? 目录 机器应用。JAVA 工人JAVA LineDataRepository