18.01.04,web学习第三十七天,还有一年,努力吧青年 hibernate第三天 一对多,多对多
37.hibernate第三天
1. Union 同盟,联盟
grant:同意 认同。
convert:使转变,使改变
2. session 的缓存域,session对象中有一个可以存放对象的集合。
查询时:第一次查询时,会将对象放入缓存中,再次查询,不再 查询数据库。
修改时:会使用快照对比修改前和修改后的对象的属性的区别, 只执行一次修改。
3. (一对多的封装)
映射对象时,varchar对应String,char对应Character,bigint对应Long。
一对多封装时在1的一方对象使用Set集合表示一对多关系。
多的一方持有一的引用。
配置文件里外键没封。
Association 协会,社团; 联合,联系; 联想;
Transient 短暂的,转瞬即逝的,临时的。
对 一对多和多对一数据的操作:(重要)
不论是增删改还是啥,都是对一方的集合和多方的引用的操作。
如果是多方在增加:new 出多方添加到一方集合中,多方设置一方引用。
如果是多方被删除:多方的引用赋值null,一方的集合去除多方。
此处错误由于配置出错 |
这是由于new出来的对象是瞬时对象,需要先save再提交。 |
操作的进阶1: 级联操作:目的:简化代码 当我们在增删改客户时,需要对多个联系人进行save()方法。 我们想在save客户的时候就给我们一同save联系人。 级联操作是双向的,可以在一方配,也可以在多方配。 如何配: cascade="" (倾泻,小瀑布):配完之后相应的就不用 save()操作了 |
操作的进阶2: Inverse属性提高效率:一的一方不维护外键 多的一方不可以放弃维护 记住:当一的一方配置了inverse时,就不需要有维护关系的添加到集合的代码了(写不写无所谓):例: |
当1的一方删除时 因为存在外键所以有两种方案删除1的一方: 1)inverse设置成false(维护外键),当执行session.selete方法时, 多的一方的外键置空。一的一方删除。 2)inverse设置成true(维护外键),然后cascade=”delete”,设置级联删除,有联系的一起删除。 |
4.(多对多的封装)
多对多需要第三方表。
多对多的对象表达,均使用set集合的形式。
当我们配置update时,session一创建不论什么操作都会帮我们建表。
|
该案例不存在外键,都是以主键的形式存在第三张表以维护多对多的关系。 多对多两方在维护关系时因为是向第三张表插入数据,所以他们在维护关系时必须有一方放弃维护操作(否则第三张表主键重复插入),根据业务判定谁放弃。 如何放弃维护:1)配置文件直接inverse=‘true’ 2)或者直接维护对象时不写维护关系代码 |
实现多对多中为一个人物添加一个角色: 在为人物添加角色时,人物是持久化状态,而角色是瞬时状态,需要对角色进行save保存,可实现cascade简化代码操作: 略 |