Java Hibernate:如何设置三个实体类、它们的联接表和保存在数据库中的关系

Java Hibernate:如何设置三个实体类、它们的联接表和保存在数据库中的关系,java,hibernate,jpa,hibernate-mapping,jointable,Java,Hibernate,Jpa,Hibernate Mapping,Jointable,我有以下三个实体类 @Entity public class User { @Id @Column(nullable = false) @GeneratedValue(strategy= GenerationType.AUTO) private Integer id; } @Entity public class LanguageProficiencyLevel { @Id @Colum

我有以下三个实体类

    @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保存在语言熟练程度级别表中

现在我有了实体类之间的以下关系

一个用户可以通过一个熟练程度掌握多种语言,一个熟练程度的语言为许多用户所知

因此,例如,用户可能懂英语,其英语水平可能为C1,同样,同一用户也可能懂西班牙语,其西班牙语水平可能为B1

在这里我了解到,用户和语言有着多对多的关系。但我不明白如何将语言熟练程度与用户或语言联系起来


我该如何将其保存在数据库中?我的想法是创建一个联接表(LanguageSkill),列名为user\u id、language\u id和languageProficiencyLevel\u id,创建用户时将插入该表行。我不确定这是否是实施它的方法。请给我一个想法如何做到这一点,应该是什么样的配置

正如你所说,用户和语言将有多对多的关系。而且,语言和语言熟练程度将有一对一的关系

因此,您必须创建一个映射表,该映射表将与所有3个表具有多对一关系。
请参阅此项以创建具有多列的映射表。

用户和语言将如您所说具有多对多关系。而且,语言和语言熟练程度将有一对一的关系

因此,您必须创建一个映射表,该映射表将与所有3个表具有多对一关系。
请参阅此项以创建具有多列的映射表。

实体对象之间的关系如下:

  • 一个用户可以有多种语言,而一种语言可以有多个用户。因此,用户语言之间存在多对多关系
  • 一种语言一次只能有一种熟练程度,但一种熟练程度可以有多种语言。因此,语言熟练程度与语言能力是一对多的关系
  • 用户和语言能力之间的关系也是多对多的
下面是一个链接,您可以通过该链接进行多对多关系的数据库设计。

在创建数据库设计之后,您可能可以使用一些反向工程工具()来创建hibernate pojo类。我建议使用一个工具来完成这项工作,而不是亲自动手来避免不必要的问题

所以现在如果你仔细看。。。用户、语言和语言熟练程度的实体类如下所示


希望这有用。

实体对象之间的关系如下:

  • 一个用户可以有多种语言,而一种语言可以有多个用户。因此,用户语言之间存在多对多关系
  • 一种语言一次只能有一种熟练程度,但一种熟练程度可以有多种语言。因此,语言熟练程度与语言能力是一对多的关系
  • 用户和语言能力之间的关系也是多对多的
下面是一个链接,您可以通过该链接进行多对多关系的数据库设计。

在创建数据库设计之后,您可能可以使用一些反向工程工具()来创建hibernate pojo类。我建议使用一个工具来完成这项工作,而不是亲自动手来避免不必要的问题

所以现在如果你仔细看。。。用户、语言和语言熟练程度的实体类如下所示


希望这是有用的。

你绝对应该像你说的那样创建另一个table LanguageSkill

语言和熟练程度是所谓的基础数据——它们的条目相对较少,并且独立于用户。它们都不应映射到用户

然后,用户应该与LanguageSkill有@OneToMany关系,这表示他对特定语言的知识。LanguageSkill对语言和熟练程度(以及用户)都有@manytone的影响

跳过LanguageSkill将导致模式中的数据重复,或者至少在所有Jointable都难以读取的模式中。
此外,它还将混合关注点-相对稳定的数据(语言、熟练程度)和经常变化的数据(一个人的语言知识)。

你绝对应该像你说的那样创建另一个table LanguageSkill

语言和熟练程度是所谓的基础数据——它们的条目相对较少,并且独立于用户。它们都不应映射到用户

然后,用户应该与LanguageSkill有@OneToMany关系,这表示他对特定语言的知识。LanguageSkill对语言和熟练程度(以及用户)都有@manytone的影响

跳过LanguageSkill将导致模式中的数据重复,或者至少在所有Jointable都难以读取的模式中。 此外,它将混合关注点——相对稳定的数据(语言、熟练程度)和经常变化的数据(一个人的语言知识)