我有一个用 @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/