這個專案的背景是有兩種用戶,suscriber用戶和amdin用戶。還有兩種型別的用戶,學生和教授。管理員用戶可以注冊新教室,訂閱用戶可以訂閱教室查看溫度等不同資訊。
問題是我必須在教室和訂閱者用戶之間映射多對多雙向關系,并且在 Classroom 類中出現以下錯誤:
“多對多”屬性值型別不應為“SuscriberUser”
這個例外:
org.hibernate.AnnotationException:使用@OneToMany 或@ManyToMany 定位未映射的類
這是我的代碼:
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public abstract class User implements IUser {
private String name;
// some other fields
// constructors
// getters and setters
}
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public abstract class SuscriberUser extends User implements ISuscriberUser {
@ManyToMany(mappedBy = "suscribers")
private ArrayList<Classroom> classroomSubscriptions;
// constructors
// getters and setters
}
例如 SuscriberUser 的一個具體類:
@Entity
@Table(name = "student")
public class Student extends SuscriberUser {
@Id
private int studentId;
// constructors
// getters and setters
}
@Entity
@Table(name = "classroom")
public class Classroom implements IClassroom {
@Id
private int internalId;
// other fields
@ManyToMany()
@JoinTable(name = "suscribers")
private ArrayList <SuscriberUser> suscribers;
// constructors
// getters and setters
}
我也嘗試在 User 和 SuscriberUser 兩個類中使用 @MappedSuperclass,但它不起作用。我想這是因為兩個抽象類都沒有 id。
我該如何解決這個問題?
uj5u.com熱心網友回復:
該類User只是欄位的收集器,因此它可以成為@MappedSuperClass.
@MappedSuperClass
public abstract class User implements IUser {
private String name;
// some other fields
// constructors
// getters and setters
}
如果您使用@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS),則每個班級都有一個表格,因此您需要:
- 消除
abstract - 添加
@Entity注釋 - 添加
@Table以定義名稱 - 添加
@Id到 id 列。
@Entity
@Table(name = "subscriber_user")
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public class SuscriberUser extends User implements ISuscriberUser {
@Id
private int id;
@ManyToMany(mappedBy = "suscribers")
private List<Classroom> classroomSubscriptions;
// constructors
// getters and setters
}
更多資訊在這里。
學生類不需要 id 列,因為它在父類中。
@Entity
@Table(name = "student")
public class Student extends SuscriberUser {
// constructors
// getters and setters
}
注意連接表是另一個。該表包含學生和教室之間的關系,可以命名subscription。
@Entity
@Table(name = "classroom")
public class Classroom implements IClassroom {
@Id
private int internalId;
// other fields
@ManyToMany
@JoinTable(
name = "subscription",
joinColumns = @JoinColumn(name = "internalId"), // id class room
inverseJoinColumns = @JoinColumn(name = "id")) // id user
private List<SuscriberUser> suscribers;
// constructors
// getters and setters
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/473494.html
