1、一对一单项外键(比如实体People和实体IDCard,一个人对应一个身份证号,反之)
@OneToOne(cascade=CAscadeType.ALL)全级联关系
@JoinColumn(name="pid",unique=true)被控类的外键写到主控类中,且唯一
ps:保存时应该先保存外键对象,再保存主表对象,这是因为数据库相关约束的原因
2、一对一双向外键
主控方配置不变
被控方添加
@OneToOne(mappedBy="card")myppedBy指定了把控制权利交给主控方,指定主控方所对应的外键属性card
ps:双向关联,必须设置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仍然存在于学生表中作为外键
ps:FetchType的抓取数据策略,如果是多对一,多的一方通常设置为EAGER,一对多,一的一方通常设置为LAZY
5、一对多(多对一)双向外键
在多方添加注解
@ManyToOne(cascade{CAscadeType.ALL},fetch=FetchType.EAGER)
@JoinColumn(name="cid")
在一的一方添加注解
@OneToMany(cascade{CAscadeType.ALL},fetch=FetchType.LAZY)
@JoinColumn(name="cid")
ps:这里的@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")})
————————————————
版权声明:本文为CSDN博主「JokerZhan」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/JokerZhan/java/article/details/85014806