没有@Id的抽象@MappedSuperclass的JpaRepository

gmc*_*gmc 2 spring spring-data spring-data-jpa

我有一个抽象实体,其注释为@MappedSuperclass

@MappedSuperclass
public abstract class BaseEntity {
    public abstract T getId();
    public abstract void setId(T id);
}
Run Code Online (Sandbox Code Playgroud)

然后,我从中继承实体,并在每个实体中定义其ID:

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

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

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

public interface BaseRepository<T extends BaseEntity, ID extends Serializable> extends JpaRepository<T, ID> {
}
Run Code Online (Sandbox Code Playgroud)

但是Spring抛出一个异常,说BaseEntity没有ID:

java.lang.IllegalArgumentException: This class [BaseEntity] does not define an IdClass
Run Code Online (Sandbox Code Playgroud)

请检查他的答案中Plog的评论。我可以解决将每个存储库类型注入服务的构造方法

Plo*_*log 5

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

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

@NoRepositoryBean
public interface BaseRepository<T extends BaseEntity, ID extends Serializable> extends JpaRepository<T, ID> {
  //common methods
}
Run Code Online (Sandbox Code Playgroud)

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

public interface EntityARepository extends BaseRepository<EntityA, Integer> {
}
Run Code Online (Sandbox Code Playgroud)

  • 嘿@Plog,它正在工作。我爱你。我将您的答案标记为正确,并参考评论。非常感谢 (3认同)