您的位置:首页 > 数据库

hibernate框架中的数据关联映射

2011-05-22 00:13 246 查看
姑且把实体类中涉及其他类的属性称为“关键属性
”,把映射文件中涉及其他类的标签称为“关键标签


【一对多】(举例: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.hbm.xml中关键标签的配置,首先要理解为何要使用set标签-->
<set name="allbooks" inverse="true" order-by="id desc">
<!--set的三个属性name表示你为Set集合起的名字,set的inverse属性决定是否把对set的改动反映到数据库中去。inverse=false————反映;inverse=true————不反映,即你放弃了关系维护”inverse属性默认为false ,order-by表示对查取的数据按升/降序排序 -->
<key column="tid"></key>
<one-to-many class="Book"><!--Set中装的对象-->
</set>
<!--book.hbm.xml中关键标签的配置,首先要理解为何要使用many-to-one标签,因为many(Book)-to-one(Type)->
<many-to-one name="type" class="Type" column="tid">
<!--三个属性name表示你为对象起的名字,class表示对象 column表示引用外键的列名,与set中的key中的一致-->
</many-to-one>


③调用方式(本质是对两个存在主外键关系的表格的增删改查

,所以在数据库里直接操作就行不通的事情在这里也是行不通的~)



:由于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中配置文件的写法

<!-- 用关系表映射集合属性 ,因为多对多关联需要关系表在中间来维持,存在两个外键碰头的现象-->
<set name="myStudents" table="t_teacher_student" inverse="true">
<!-- 使该实体类本身与关系表中的列名匹配 -->
<key column="tid"></key>
<!-- 查询关联实体类集合的入口(表格中对应的列名) -->
<many-to-many class="Student" column="sid"></many-to-many>
</set>


③调用方式

同上

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息