一、关系映射级别注解
1、一对一单向外键关联
2、一对一双向外键关联
3、一对一单向外键联合主键
4、多对一单向外键关联
5、一对多单向外键关联
6、一对多双向外键关联
7、多对多单向外键关联
8、多对多双向外键关联
二、实体之间的映射关系
一对一:一个公民对应一个身份证号码
一对多(多对一):一个公民有多个银行帐号
多对多:一个学生有多个老师,一个老师有多个学生。
三、一对一单向外键关联
(1)@OneToOne(cascade=CascadeType.ALL):参数为级联关系
(2)@JoinColumn(name="xx",unique=true):参数name为被控类主键,unique标识该主键唯一
xx是被控类的主键,主控类的外键
注意:保存时应该先保存外键对象,再保存主表对象
(1)新建一个工程RelationshipAnnotation,导入包
(2)实体类
(3)hibernate的配置文件
(4)创建测试类,输出表结构
(5)控制台的打印
(6)表结构
身份证表
学生表
(7)增加一条记录
四、一对一双向外键关联
其他的跟一对一单向一样
五、一对一双向外键联合主键
创建主键类
主键类必须实现serializable接口,重写hashCode()和equals方法。
主键类:@Embeddable
实体类:@EmbeddedId
具体实现步骤请参考第二章内容
六、多对一单向外键关联
多方持有一方的引用,比如:多个学生对应一个班级(多对一)
@ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@JoinColumn(name = "cid", referencedColumnName = "CID")
要知道@JoinColulmn是干什么的,@ManyToOne只是定义了一种关系,以及关系的维护,但并未指明建立关系的对应列,所以@JoinColumn中的name为当前类的属性名,(多对一单向,有多方维护)所以,name为student中的cid,而ReferenceColumnName为引用表的列(多对一单向,所以为一方的引用列)即ClassRoom中的主键列
新增一条记录
缺少这个
加上这个就可以了
重新新增
七、一对多单向外键关联
一方持有多方的集合,一个班级有多个学生(一对多)
@OneToMany(cascade={CascadeType.ALL},fetch=FetchType.LAZY)
JoinColumn(name="cid"):此处中的name为设定多方中外键的列名
八、一对多(多对一)双向外键
以上保持不变
九、多对多单向外键关联
学生和教师构成多对多的关联关系
其中一个多方持有另一个多方的集合对象(学生持有教师的集合)
创建中间表
学生(有外键)为主控方,教师(配置主键及生成策略)为被控方。
在学生表中的教师集合上加注解,
@ManyToMany
@Jointable(name="teachers_students"
joinColumns={@joincolumn(name="sid")},
inverseJoinColumns={@JoinColumn(name="tid")}
新增记录
十、多对多双向外键关联
(1)双方持有对方的集合对象,其中一方设置
@ManyToMany(mappedBy="teachers")这里指的是映射的属性名(在主控类student中),正是通过这个这个属性才最终完成了双向映射。将主控方交给学生来处理,相当于把控制权抛出。
根据上面的多对多单向外键关联的案例,只需在teacher实体类加上student集合属性,再在上面添上如下注解,就可以实现多对多双向外键关联了。其他保持不变。
网友评论