3 回答
TA贡献1846条经验 获得超7个赞
问题在于您如何定义实体。超类和子类都有@Id
属性。
继承应该由IS-A HAS-A 关系来管理。
因此,@Id
子类中的 应该被排除,因为子类的实例应该可以被超类的对应实例识别@Id
,这意味着子类必须具有@Id
超类的属性(继承树)。
此外,您的超类必须有一个@Id
,因此快速解决方案是摆脱子@Id
类中的 ,并在子类中添加相同的属性(不带@Id
注释)。
/* Class level annotations */
public class Role { //Superclass
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "role_id")
private Integer roleId;
}
/* Class level annotations */
public class UserApp extends Role { //Subclass
private Integer roleId; // Same as the @Id in superclass
}
TA贡献1834条经验 获得超8个赞
您正在对 JPA 实体使用继承:UserApp 扩展 Role,但同时您声明 UserApp 应该拥有它自己的 @Id。这里的问题是您试图将域实体的继承映射到关系数据库。SQL 不直接支持这种关系,而 Hibernate 或任何其他 JPA 实现必须将其映射到支持的概念。
您可以在 4 种策略中进行选择,将域模型的继承结构映射到不同的表结构:映射超类、每个类表、单表或连接表方法。这些策略都有其优点和缺点。您应该选择最适合您的用例的一种。
同时,我使用您的配置和您提供的代码在我的计算机上重现了该问题,正如我所提到的,UserApp 类中用 @Id 注释的字段导致了问题。快速修复选项之一是删除 UserApp 中的此字段。因此,以下代码在我的机器上运行测试效果很好:
@NoArgsConstructor
@Data
@Entity
@Table(name = "user")
public class UserApp extends Role {
private String name;
private String password;
private int active;
@ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@JoinTable(name = "user_role",
joinColumns =
@JoinColumn(name = "user_id"),
inverseJoinColumns = @JoinColumn(name = "role_id"))
private Set<Role> roles;
public UserApp(UserApp userApp) {
}
}
正如您在评论之一中提到的,此错误发生在默认测试中(不是您编写的) - 如果您只想构建,总是有一个选项可以跳过它:
mvn clean install -DskipTests
添加回答
举报