2016-03-05 41 views
0

我試圖找到建立學生/教師 - 書籍關係的最佳方式。學生和老師延伸人,他們每個人都可以有很多書。同時,一本書可以由一個人擁有。這裏是我的實體: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最終創建了兩個表。

而且我應該在書中聲明一個人嗎?如果是這樣,什麼是正確的方式?

+0

因爲老師和學生是兩個完全不同的實體,所以你需要兩個不同的連接表。如果您的目標是能夠說出「這是一個人的身份證明,證明是該人的書籍」,那麼Person必須是一個實體,而不是MappedSuperclass。然後您可以選擇3種類型的繼承。 –

回答

1

那麼,您不能聲明PersonBook爲雙向關係的目的,因爲Person不是一個實體,所以沒有什麼可以映射回。我認爲您必須使Person成爲一個實體,並且不具有StudentTeacher實體,而是具有Role實體,其實體ManyToMany(單向)關聯從Person。考慮一個Person可能既是學生又是老師,所以基本上假設他們是獨立的實體似乎有缺陷。

​​

有角色和書籍。

@Entity 
public class Role {} 

定義STUDENTTEACHER

@Entity 
public class Book { 
    @ManyToOne 
    private Person owner; 
} 

都有一個所有者。

+0

我最終簡化了模型以遵循您的建議。謝謝。 – Klaus

+0

高興成爲一名幫助。 –