hibernate框架中的数据关联映射

姑且把实体类中涉及其他类的属性称为“关键属性 ”,把映射文件中涉及其他类的标签称为“关键标签

【一对多】(举例:Type,Book)

首先建表,毕竟表决定配置 :显然多对一是有依赖关系的,所以”多“的一方将引用”一“的一方的id作外键,从而成为外键表。

①pojo中实体类的写法:在一中添加多的set集合,在多种添加一的对象

Type中声明private Set<Book> books; 并set ,get

Book中声明private Type type;并set get

②pojo中配置文件的写法

配置type.hbm.xml

hibernate-mapping(有package属性)------class(有name与table属性)----------id(有属性name,column,有子标签generator,子标签有属性class表示生成策略),property(有属性name,column),set(这是关键所在,写法如下)

③调用方式(本质是对两个存在主外键关系的表格的增删改查 ,所以在数据库里直接操作就行不通的事情在这里也是行不通的~)

:由于type一方放弃了关系的维护,所以只需对book对象的关键属性调用set方法赋值(如b1.setType(t1);   b2.setType(b1);)然后调用session的save方法即可。但有先后顺序上的问题:如果先大哥后小弟,正常,只有insert语句;如果先小弟侯大哥,那么会出现update操作,毕竟在大哥出现之前(save之前)小弟们是没有大哥的id的,因而是不完整的,在出现后就需要弥补缺憾,即进行update操作(不出错可能是因为在提交之前存在有信息的整合机制??????

:删除操作很想在数据库中的删除,如果是被引用的,即充当”大哥“身份,你是不能轻易将它删掉的,会抛出异常(Cannot delete or update a parent row: a foreign key constraint fails ),毕竟有一帮小弟还指靠着他呢!

但是,如果约定”树倒猢狲散“,即对set标签设置级联删除cascade=”delete“,那么在调用session的delete方法删掉大哥时,他所有的小弟们都将被删掉。然而对many-to-one标签设置级联删除是不符合表的操作(也是Cannot delete or update a parent row: a foreign key constraint fails),所以是无效的。

查:可以getXX().getXXX()l了;

【一对一】

建表:有两种,常用的是---附表id引用主表id作外键(这是一种很巧妙的约束,限定了一对一的关系)

另外,也可以两表各增加一个字段,都引用对方的id作外键

(这种情况配置文件要改为many-to-one,属性为name,column,class,cascade,unique="true")

①pojo中实体类的写法:都把对方的对象放进成员字段中

②pojo中配置文件的写法<one-to-one name="" class="" cascade=""></one-to-one>(郁闷,一对一关系没有inverse标签)

③调用方式

增:需要双方都把对方set进去

删:删除不设级联,主表数据删不掉,因为有外键引用;设级联,对附表是无效的,同样是因为外键:Cannot delete or update a parent row: a foreign key constraint fails。

 

【多对多】

建表:由经验来看,只有处于”一“的位置才有资格被引为外键,如今两者皆为”多“,故需要再增加一张关系表。

两实体表不需要引用外键,但在关系表中需要引用实体类的id做外键。

①pojo中实体类的写法:关键属性均为set集合

②pojo中配置文件的写法

③调用方式

同上

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值