数据库:外键是什么上海时时乐走势图官网

外键是什么?

外键或者外键环中数据不一致:

在@OneToMany 和 @ManyToOne 所对应的实体对应表的外键有差别,原则上JoinColum对应的应该是在多的一方对应的表的外键

那么,d字段就可以叫外键。对于A来说,d是A的字段;对于B来说,d是B的主键。

数据类型长度不一致:即A表中的外键字段和B表中的被外键关联的字段数据类型长度不一致。由此产生了问题,这个问题如果出现,我觉得建表的人可以找个没人的地方面壁思过一下。

@JoinTable

如果有两张表:A,B。

最近,应该是很久了遇到这个问题,一直觉得不影响自己工作使用,就一直在执行sql的时候跳过了,但是,心里一直有个疙瘩。今天把问题解决了,很开心,就把解决问题的具体过程写一下,算是给自己一个记录。

1) 设计表方法

A表中有字段:c,d,e,f;  B表中有d,g,h,i。

每天进步一点点。

A表user是多的一方,B表group是一的一方,在A表中有对应B表的成员变量,并且加标注@ManyToOne @JoinColumn(name="groupId"),groupId指的是user表有字段groupId作为user表的外键,对应的是group表的主键id

 

推荐微信公众号【排骨肉段】,记录日常的美好。

7) 多对一

有关此问题的所有文章中,都说了这个问题出现的场景:向某张表A中插入数据,A表的某个字段m是外键,关联到了另外一张表B,由此产生了问题。

多对多单向

解决方法无非三种:

在A实体中,有B实体husband作为成员变量,在B实体中,有A实体wife作为其成员变量,这时,在A实体中的husband的get方法上声明这个注解,意思是A实体中的husband已经在B实体中的wife成员变量做了映射(mapped),即建立了从A实体到B实体的映射关系。对应到表指的是,是通过B表建立的关联关系,即B表有外键指向A表的主键,B表是主导

外键:A表的外键关联的为B表中的字段,则应该A有数据则B必有数据,A为空则B必为空,如果A中有数据,但B中无数据,就会报错。

加中间表是为了解决多对多关系,用中间表记录另外两个表的主键,从而达到多对多关系映射

首先要说的就是最不应该出现的问题:

A实体为group,B实体为user,在A中有成员变量B Set类型,即是一个集合成员变量。在A表的由B集合成员变量的get方法上加@OneToMany @JoinColumn(name="groupId"),groupId指的是user表的字段groupId作为外键,关联到group表的id

后面两种情况可以归为一类:

多对一单向

外键环:A表的外键关联的为B表中的字段,B表中的字段又为外键关联C表中的字段。。。。。。,这个过程中,出现外键数据不一致的问题,就会报错。

4) @OneToOne(mappedbBy="wife")

在单向的基础上,在stduent实体中加入teacher成员变量,在get方法上加@ManyToMany(mappedBy="students"),多对多关系已经在studen实体中维护,所以使用mappedBy说明不需要再在Teacher实体中声明外键表的外键。

在双向关系中,一定会指定mappedBy,如果不指定mappedBy,会造成一个表可能有多个外键,因为@OneToMany指定了一个外键,@ManyToOne也指定了一个外键,这样一张表就会有两个外键。最佳实践:在实体Group中,在users的get方法上声明 @OneToMany(mappedBy="group"),即是由多的一方维护关联关系,因为在表中是多的一方有外键

@JoinColumns(
    {
        @JoinColumn(name="wifeId", referencedName="id"),
        @JoinColumn(name="wifeName", referencedName="name")
    }
)

5) @JoinColumns

2) @JoinColumn(name="wife_id")

实体A中有实体B作为成员变量,B中的成员变量是A实体对应表的一部分字段,这时,需要在A实体的B成员变量的get方法上加这个注解,代表是A对应表的其中一部分字段

9) @OneToMany

在stduents的get方法上没有使用该标注,则中间表的表明由hibernate默认声明为teacher_student,若声明@JoinTable(name="t_s"),则中间表名映射为t_s

3) 单向关联与双向关联

11) @ManyToMany

6) @Embeded

指的是当前实体用来与其他实体做表连接的字段,wife_id可能是当前实体对应表的字段,也有可能是连接实体对应表的字段,但肯定对应的是表的外键

@ManyToMany
@JoinTable(
    name="t_s",
    joinColumns={@JoinColumn(name="teacher_id")},
    inverseJoinColumns={@JoinColumn(name="student_id")}
)

一对多的单向

在A实体中,有B实体作为其成员变量,同时B实体中也有A实体作为其成员变量,这就是双向关联。只有一方有对方实体作为成员变量,即是单向关联

表设计是在多方加外键

8) @ManyToOne

在Teacher中声明一个students的成员变量(Set类型)的get方法上添加@ManyToMany ,这样会映射中间表作为Teacher和Stduent对应表的多对多关系

Teacher实体和Student实体是多对多关系

如当前实体为A,则A对应的表包括wifeId,wifeName字段,相关的实体对应的表包括id,name字段

连接字段

多对多双向

joinColumns 指的是当前实体对应表的外键,在t_s表中的字段名字,inverseJoinColumns 指的是关联表所对应的外键在t_s表中的字段名字

10) 多对一双向

本文由上海时时乐走势图发布于上海时时乐走势图官网,转载请注明出处:数据库:外键是什么上海时时乐走势图官网

您可能还会对下面的文章感兴趣: