@Primary 相当于自动装配的 Spring JPA 存储库

Eri*_*fer 4 java spring spring-data spring-data-jpa

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

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

但是,对于存储库,这不起作用。我可以用@Primary 注释新的存储库,但它没有效果(两个 bean 都被找到,因此不能自动装配)。这是有道理的,因为存储库是一个接口而不是一个实现,实现是由 Spring 动态提供的。

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

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

@Entity
public class A {
  @Id
  private long id;
}
Run Code Online (Sandbox Code Playgroud)

及其存储库

public ARepository extends Repository<A, Long> {
}
Run Code Online (Sandbox Code Playgroud)

现在我将它扩展到实体 B

@Entity
public class B extends A {
}

public interface BRepository extends ARepository {
}
Run Code Online (Sandbox Code Playgroud)

通常,根据文档,您使用这样的存储库:

@Autowired
private ARepository repository;
Run Code Online (Sandbox Code Playgroud)

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

Ral*_*lph 5

我会根据这个答案调整想法: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

引入一个通用的抽象 Repository,标记为 @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
}
Run Code Online (Sandbox Code Playgroud)

现在您可以注入ARepositoryBRepository,并且都输入保存!