使用固定值进行一对多的Hibernate映射

时间:2016-03-01 00:14:22

标签: java hibernate postgresql

我没有很多数据库设计经验,我尝试使用像hiber这样的ORM来理解它背后的一般逻辑。我有两个表用户和语言。用户可以知道一种或多种语言,因此两个表之间存在一对多的关系。但我有固定长度的语言英语,西班牙语和法语。据我所知,每个新的用户实例都是持久存在的,语言表中会有一些重复的条目,其中包含该人的外键。有没有办法防止这些重复的条目?

1 个答案:

答案 0 :(得分:0)

你的理解有点困惑。您可以使用OneToMany映射Foreign Key关系,并且有很好的数据库原因,但通常a JPA provider recommends against it。但是,您正在描述ManyToMany关系。 User将(或可能) LanguagesLanguage Users。当您使用注释创建多对多关系时:

@Entity
public class Person {
    @Id @GeneratedValue(strategy=GenerationType.AUTO)
    private Long id;

    @ManyToMany
    private List<Language> languages;

@Entity
public class Language {
    @Id @GeneratedValue(strategy=GenerationType.AUTO)
    private Long id;

JPA提供商将创建一个关联或Join Table,其中包含每个Entity的ID:

create table Person_Language (Person_id bigint not null, languages_id bigint not null)

创建语言时,会在语言表中输入一个条目。创建用户时,会将一个条目放入用户表中。当您向某人languages添加语言时,会将一个条目放入Join Table

insert into Person_Language (Person_id, languages_id) values (?, ?)

在连接表中只有Person_idlanguages_id的唯一组合,因此数据库将很好地规范化。由于您指出的原因,您将无法使用Foreign Key实体中的Language为多个用户分配语言:对于任何给定的语言,只有一个外键列。