我試圖找到建立學生/教師 - 書籍關係的最佳方式。學生和老師延伸人,他們每個人都可以有很多書。同時,一本書可以由一個人擁有。這裏是我的實體:Spring JPA - 一對多關係中的繼承
@MappedSuperclass
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
public abstract class Person implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue
private Long id;
@OneToMany(fetch = FetchType.EAGER, cascade=CascadeType.ALL)
@JoinTable(
name="person_book",
joinColumns = @JoinColumn(name="person_id"),
inverseJoinColumns = @JoinColumn(name="book_id")
)
private Set<Book> books= new HashSet<Book>();
public Set<Book> getBooks() {
return books;
}
public void setBooks(Set<Book> books) {
this.books = books;
}
}
@Entity
public class Student extends Person {
private static final long serialVersionUID = 1L;
public Student() {
}
}
@Entity
public class Teacher extends Person {
private static final long serialVersionUID = 1L;
public Teacher() {
}
}
我的資料庫: 公共接口BookRepository擴展CrudRepository { } 公共接口TeacherRepository擴展CrudRepository { } 公共接口StudentRepository擴展CrudRepository { }
我的問題是對此進行建模的最佳方式是什麼?
Hubernate文檔指出TABLE_PER_CLASS策略有許多缺點。因此我試圖避免它。但是,在我看來,在這兩個存儲庫聲明的情況下,Spring最終創建了兩個表。
而且我應該在書中聲明一個人嗎?如果是這樣,什麼是正確的方式?
因爲老師和學生是兩個完全不同的實體,所以你需要兩個不同的連接表。如果您的目標是能夠說出「這是一個人的身份證明,證明是該人的書籍」,那麼Person必須是一個實體,而不是MappedSuperclass。然後您可以選擇3種類型的繼承。 –