我没有很多数据库设计经验,我尝试使用像hiber这样的ORM来理解它背后的一般逻辑。我有两个表用户和语言。用户可以知道一种或多种语言,因此两个表之间存在一对多的关系。但我有固定长度的语言英语,西班牙语和法语。据我所知,每个新的用户实例都是持久存在的,语言表中会有一些重复的条目,其中包含该人的外键。有没有办法防止这些重复的条目?
答案 0 :(得分:0)
你的理解有点困惑。您可以使用OneToMany
映射Foreign Key
关系,并且有很好的数据库原因,但通常a JPA provider recommends against it。但是,您正在描述ManyToMany
关系。 User
将(或可能)多 Languages
。 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_id
和languages_id
的唯一组合,因此数据库将很好地规范化。由于您指出的原因,您将无法使用Foreign Key
实体中的Language
为多个用户分配语言:对于任何给定的语言,只有一个外键列。