2016-09-28 12 views
0

我有以下三個實體類。Hibernate:如何設置三個實體類,它們的連接表和保存在數據庫中的關係

@Entity 
    public class User { 

     @Id 
     @Column(nullable = false) 
     @GeneratedValue(strategy= GenerationType.AUTO) 
     private Integer id; 
    } 

@Entity 
public class LanguageProficiencyLevel { 

    @Id 
    @Column(nullable = false) 
    @GeneratedValue(strategy= GenerationType.AUTO) 
    private Integer id; 

    private String name; // A1, A2, B1 ... etc 
} 

@Entity 
public class Language { 

    @Id 
    @Column(nullable = false) 
    @GeneratedValue(strategy= GenerationType.AUTO) 
    private Integer id; 

    private String name; //English, Chinese ect ... 
} 

目前在數據庫中,我有大約20種語言保存在語言表6個語言水平A1,A2,B1,B2,C1,C2保存在LanguageProficiencyLevel表。

現在我有以下關係的實體類。

用戶可以得知一個以上的語言有一個熟練程度,並與一個能力級別的語言是由許多用戶知道。

因此,例如,用戶可以說英語,他的英語水平可能是C1,再次相同的用戶也可以知道西班牙語和他的西班牙熟練程度可能是B1。

在這裏,我明白,用戶和語言有許多關係。但我不明白如何將LanguageProficiencyLevel與用戶或語言聯繫起來。

另外我應該如何將它保存在數據庫中?我的想法是創建一個連接表(LanguageSkill),列名爲user_id,language_id和languageProficiencyLevel_id,並且在創建用戶時將插入此錶行。我不確定這是否實施它的方式。請給我一個想法如何做到這一點,以及這應該是什麼配置。

回答

0

正如你所說,用戶和語言將有多對多的關係。而且,語言和語言水平將會有一對一的關係。

因此,您必須創建一個映射表,該映射表與所有3個表有多對一的關係。 請參閱link以創建具有多個列的映射表。

0

你的實體對象之間的關係會是這樣:

  • 用戶可以有多個語言和語言可以有多個用戶。所以它是用戶語言之間的多對多關係。
  • 一種語言一次只能有一種熟練程度,但熟練程度可以有多種語言。所以語言能力與語言是一對多的關係。
  • 用戶和語言熟練程度之間的關係也是多對多的。

這是一個鏈接,您可以瞭解如何進行多對多關係的數據庫設計。 How to implement a many-to-many relationship in PostgreSQL?

創建數據庫設計後,您可以使用一些逆向工程工具(https://www.javacodegeeks.com/2013/10/step-by-step-auto-code-generation-for-pojo-domain-java-classes-and-hbm-using-eclipse-hibernate-plugin.html)創建hibernate pojo類。我會建議使用一種工具來做到這一點,而不是爲了避免不必要的問題而採取措施。

所以,如果你仔細看現在......用戶,語言和LanguageProficiency的實體類會是這樣的。

希望這是有用的。

0

你應該絕對創建另一個表LanguageSkill,就像你說的。

語言和能力是所謂的基礎數據 - 他們將有相對較少的條目,並將獨立於用戶。它們都不應該映射到用戶。

用戶應該與LanguageSkill有一個@OneToMany關係,這表示他對特定語言的瞭解。語言技能對語言和熟練(和用戶)都有一個@ManyToOne。

跳過LanguageSkill會導致數據在您的模式中重複,或者至少在所有連接表難以讀取的模式中。另外,它會混合關注 - 相對穩定的數據(語言,熟練程度)和經常改變的數據(一個人對語言的瞭解)。

相關問題