1、一对一单项外键
(比如实体People和实体IDCard,一个人对应一个身份证号)
@OneToOne(cascade=CAscadeType.ALL)全级联关系
@JoinColumn(name=“pid”,unique=true)被控类的外键写到主控类中,且唯一
注意:保存时应该先保存主表对象,再保存外键对象,这是因为数据库外键约束的原因。删除时则相反,应该先删除该人的身份证号,再删除该人,或者将该人和身份证号一起删除。
2、一对一双向外键
主控方配置不变
被控方添加
@OneToOne(mappedBy=“card”)myppedBy指定了把控制权利交给主控方,指定主控方所对应的外键属性card
注意:双向关联,必须设置mappedBy属性,因为双向关联只能交给一方去控制,不可能双方都设置外键保存关联关系,否则双方都无法保存
3、多对一单向外键(如多个学生对应一个班级)
在多方添加注解
@ManyToOne(cascade{CAscadeType.ALL},fetch=FetchType.EAGER)
EAGER表示迫切的加载
@JoinColumn(name=“cid”,referencedColumnName=“cid”)JoinColumn在此处表示多方持有一方的引用,一方的外键用name表示,referencedColumnName表示该外键在多方中关联的字段。
4、一对多单向外键(如一个班级有多个学生)
在一的一方添加注解,一方持有多方的一个集合
@OneToMany(cascade{CAscadeType.ALL},fetch=FetchType.LAZY)
@JoinColumn(name=“cid”)cid仍然存在于学生表中作为外键
注意:FetchType的抓取数据策略,如果是多对一,多的一方通常设置为EAGER,一对多,一的一方通常设置为LAZY
5、一对多(多对一)双向外键
在多方添加注解
@ManyToOne(cascade{CAscadeType.ALL},fetch=FetchType.EAGER)
@JoinColumn(name=“cid”)
在一的一方添加注解
@OneToMany(cascade{CAscadeType.ALL},fetch=FetchType.LAZY)
@JoinColumn(name=“cid”)
注意:这里的@JoinColumn可能不太好理解,但你仔细想想(假设对象为学生和班级),每个学生都可以有一个cid属性作为他的外键,表示他属于哪个班级,但不可能班级表里面有sid,因为一个班级可能有多个学生,这就导致sid不能只有一个,这将破坏外键的唯一性
6、多对多单向外键
其中一个多方持有另一个多方的集合对象(如学生持有老师的集合)
学生和老师之间的外键关系的维护需要通过中间表来完成
注解
@ManyToMany
@JoinTable(name=“teachers_students”,JoinColumns={@JoinColumn(name=“sid”)},inverseJoinColumns={@JoinColumn(name=“tid”)})
Jointable注解可以生成中间表,JoinColumns和inverseJoinColumns指定了相应的控制字段
7、多对多双向外键
双方都持有对方的集合,其中一方设置
如教师类
@ManyToMany(mappedBy=“teachers”)将主控方交给学生
学生类
@ManyToMany
@JoinTable(name=“teachers_students”,JoinColumns={@JoinColumn(name=“sid”)},inverseJoinColumns={@JoinColumn(name=“tid”)})