3 回答

TA貢獻(xiàn)1846條經(jīng)驗(yàn) 獲得超7個(gè)贊
問(wèn)題在于您如何定義實(shí)體。超類和子類都有@Id
屬性。
繼承應(yīng)該由IS-A HAS-A 關(guān)系來(lái)管理。
因此,@Id
子類中的 應(yīng)該被排除,因?yàn)樽宇惖膶?shí)例應(yīng)該可以被超類的對(duì)應(yīng)實(shí)例識(shí)別@Id
,這意味著子類必須具有@Id
超類的屬性(繼承樹(shù))。
此外,您的超類必須有一個(gè)@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貢獻(xiàn)1895條經(jīng)驗(yàn) 獲得超3個(gè)贊
確保您的 application.properties 文件具有正確的數(shù)據(jù)庫(kù) URL。還要檢查實(shí)體名稱是否正確。這是創(chuàng)建數(shù)據(jù)庫(kù)連接時(shí)的常見(jiàn)錯(cuò)誤。

TA貢獻(xiàn)1834條經(jīng)驗(yàn) 獲得超8個(gè)贊
您正在對(duì) JPA 實(shí)體使用繼承:UserApp 擴(kuò)展 Role,但同時(shí)您聲明 UserApp 應(yīng)該擁有它自己的 @Id。這里的問(wèn)題是您試圖將域?qū)嶓w的繼承映射到關(guān)系數(shù)據(jù)庫(kù)。SQL 不直接支持這種關(guān)系,而 Hibernate 或任何其他 JPA 實(shí)現(xiàn)必須將其映射到支持的概念。
您可以在 4 種策略中進(jìn)行選擇,將域模型的繼承結(jié)構(gòu)映射到不同的表結(jié)構(gòu):映射超類、每個(gè)類表、單表或連接表方法。這些策略都有其優(yōu)點(diǎn)和缺點(diǎn)。您應(yīng)該選擇最適合您的用例的一種。
同時(shí),我使用您的配置和您提供的代碼在我的計(jì)算機(jī)上重現(xiàn)了該問(wèn)題,正如我所提到的,UserApp 類中用 @Id 注釋的字段導(dǎo)致了問(wèn)題??焖傩迯?fù)選項(xiàng)之一是刪除 UserApp 中的此字段。因此,以下代碼在我的機(jī)器上運(yùn)行測(cè)試效果很好:
@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) {
? ? }
}
正如您在評(píng)論之一中提到的,此錯(cuò)誤發(fā)生在默認(rèn)測(cè)試中(不是您編寫(xiě)的) - 如果您只想構(gòu)建,總是有一個(gè)選項(xiàng)可以跳過(guò)它:
mvn clean install -DskipTests
添加回答
舉報(bào)