spring - 没有@Id的抽象@MappedSuperclass的JpaRepository

标签 spring spring-data spring-data-jpa

我有一个用@MappedSuperclass注释的抽象实体:

@MappedSuperclass
public abstract class BaseEntity {
    public abstract T getId();
    public abstract void setId(T id);
}

然后我从中继承我的实体,在每个实体中定义它们的 id:

@Entity
public class EntityA {
  @Id
  private int id;
  // ....
}

@Entity
public class EntityB {
  @Id
  private long id;
  // ....
}

现在我想创建一个通用的 JpaRepository,它接受从我的基本实体扩展的任何类:

public interface BaseRepository<T extends BaseEntity, ID extends Serializable> extends JpaRepository<T, ID> {
}

但是 Spring 抛出异常,表示 BaseEntity 没有 ID:

java.lang.IllegalArgumentException: This class [BaseEntity] does not define an IdClass

请检查 Plog 在其回答中的评论。我可以通过在服务的构造函数中注入(inject)每个存储库类型来解决它

最佳答案

据我所知,你不能创建这样的通用存储库。您需要为每个具体实体类创建一个单独的存储库。聚合根(感谢@JensSchauder)。

但是,您可以创建一个通用基础存储库,通过将其标记为 @NoRepositoryBean 来定义这两个存储库之间的一些常见查询:

@NoRepositoryBean
public interface BaseRepository<T extends BaseEntity, ID extends Serializable> extends JpaRepository<T, ID> {
  //common methods
}

您的具体类存储库应该扩展它而不是 JpaRepository:

public interface EntityARepository extends BaseRepository<EntityA, Integer> {
}

关于spring - 没有@Id的抽象@MappedSuperclass的JpaRepository,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47221218/

相关文章:

java - 如何使用 PagingAndSortingRepository 不返回特定列

java - 将相同项目添加到其他实体时,Spring JPA 实体会丢失数据

spring - Spring Data JPA中@Modifying方法的返回值是什么意思

multithreading - Spring Boot 应用程序可以同时处理多个请求吗?

java - 有没有办法在 Hibernate 的 @query 注释中使用 @params 中的表名?

Spring 和 hibernate : Function of annotatedClasses and packagesToScan

java - 使用自定义实现手动设置 Spring Data JPA 存储库

java - Spring Data错误由: org. hibernate.QueryException引起:无法解析属性

mysql - 如何在 Spring 中使用变量作为 @Query 的值

java - Spring - DefaultMessageListenerContainer TaskExecutor 线程监控