我在应用程序中使用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,但是对于存储库,在编译时没有接口的实现。
我可以以某种方式告诉 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 >仓库
仅供记录,可以按照此处的建议向 JPA 存储库添加@Primary支持 在 Spring 数据中使用@Primary
JPA 存储库
我对缺失代码的实现:
private boolean isSpringDataJpaRepository(Class<?> beanClass) {
return JpaRepositoryFactoryBean.class.isAssignableFrom(beanClass);
}
我认为@拉尔夫的答案更好,因为类型安全。
我会改编这个答案的想法: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
}
现在,您可以插入ARepository
和BRepository
,两者都是类型保存!
我在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