2016-03-01 142 views
0

我没有太多的数据库设计经验,我尝试使用像休眠一样的ORM来理解它背后的一般逻辑。我有两个用户和语言表。用户可以知道一种或多种语言,因此两个表之间存在一对多关系。但是我有固定的语言版本,例如英语,西班牙语和法语。据我了解,每个新的用户实例持续存在,语言表中将有重复的条目与该人的外键。有没有办法阻止这个重复的条目?休眠一对多映射固定值

回答

0

你的理解有点困惑。您可以使用Foreign Key来映射OneToMany关系,并且有充足的数据库原因可以这样做,但通常是a JPA provider recommends against it。但是,您正在描述ManyToMany关系。 A User将(或可能)有许多Languages。 A Language将有很多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只有独特的组合,因此该数据库将很好正常化。由于您指出的原因,您将无法使用Language实体中的Foreign Key将语言指定给多个用户:对于任何给定的语言,只会有一个外键列。