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在扩展类上使用,但对于存储库,在编译时没有接口的实现。
我会根据这个答案调整想法: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)
现在您可以注入ARepository和BRepository,并且都输入保存!
| 归档时间: |
|
| 查看次数: |
1756 次 |
| 最近记录: |