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 注釋的字段導致了問題??焖傩迯瓦x項之一是刪除 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
添加回答
舉報