当前位置: 首页 > 知识库问答 >
问题:

JPA无@Id抽象@MappedSuperclass的位置

充栋
2023-03-14

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

@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,它接受从我的Base Entity扩展的任何类:

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在回答中的评论。我可以在服务的构造函数中注入每种存储库类型来解决这个问题

共有1个答案

穆飞龙
2023-03-14

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

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

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

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

public interface EntityARepository extends BaseRepository<EntityA, Integer> {
}
 类似资料:
  • 我做了一些研究,我已经读了这本指南。 在Application.Properties中配置了h2数据库的项的我的存储库 实现接口并接受bean的服务: 然后是接受bean的控制器: 我还在我的抽象类上尝试了另一种策略: 还是没有雪茄。同样的错误。有没有人能给我一点启示,对于被其他实体扩展的抽象实体,使用Spring Boot和JPA的正确方法?

  • 我有一个JPA实体的类层次结构,基类是定义了一个ID的MappedSuperclass。我试图在子类中使用复合键,但这似乎不起作用

  • 问题内容: 因此,我正在使用DerbyDB,并且正在设置一些实体。我有一个用作某些实体()的超类。更具体地讲,我有一个超类和子类3,即,和。现在,我有一个不同的实体,假设该实体应引用其所有者(作为其字段之一)。因此,我创建了一个名为的字段。我得到的错误是: 有解决方法吗? 问题答案: 我可以提出两种解决方案: 变更继承 您得到的异常清楚地描述了您的问题:不是实体。使用接口声明为超类的任何类都不能是

  • 问题内容: 我有一个抽象的DAO类,它使用参数化类型(实体)和(主键)。在每个实体中我都有一个。我想动态调用此命名查询而不知道其确切名称和参数名称。 例如,假设以下实体 和这个 我应该如何实现该方法,以便不需要知道确切的名称和参数名称? 问题答案: 在您的示例中,命名查询的命名约定通常为“ City.findByName”,因此,我将尝试更改命名查询以遵循此模式。然后,此查询的参数也应具有相同的名

  • 我的代码: 问题:“

  • 问题内容: 您将如何在以下示例代码中配置注释?我只想保留JPA注释,避免使用Hibernate特定的依赖项。 下面的代码正确吗? (这些类将具有多个版本,RefSomeOtherExample等,并且每个类一个db表。有些可能会添加其他字段(列),但大多数只会使用继承自“ RefData”基类的基本字段。) 基类: 最终,我想使用Hibernate的SchemaExport类从中生成模式创建脚本。