gpt4 book ai didi

java - @Primary 等同于 Autowiring 的 Spring JPA 存储库

转载 作者:塔克拉玛干 更新时间:2023-11-01 23:09:19 25 4
gpt4 key购买 nike

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

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

然而,对于存储库,这不起作用。我可以使用 @Primary 注释新存储库,但它没有任何效果(两个 bean 都已找到,因此无法 Autowiring )。这是有道理的,因为存储库是一个接口(interface)而不是一个实现,该实现是由 Spring 动态提供的。

我能以某种方式告诉 Spring(通过存储库上的注释或通过配置)使用哪个存储库吗?还是我必须像这样手动解决方法 Using @Primary in Spring Data JPA repositories或者我应该想出一种存储库提供程序而不是 Autowiring ?

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

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

及其存储库

public ARepository extends Repository<A, Long> {
}

现在我将它扩展到实体 B

@Entity
public class B extends A {
}

public interface BRepository extends ARepository {
}

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

@Autowired
private ARepository repository;

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

最佳答案

我会根据这个答案改编这个想法: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标记的通用抽象Repository

@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
}

现在你可以注入(inject)ARepositoryBRepository,而且都是type save!

关于java - @Primary 等同于 Autowiring 的 Spring JPA 存储库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33496823/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com