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一方放弃了关系的维护,所以只需对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中配置文件的写法
③调用方式
同上
”,把映射文件中涉及其他类的标签称为“关键标签
”
【一对多】(举例: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>
③调用方式
同上
相关文章推荐
- 【SSH之旅】一步步学习Hibernate框架(二):一对一关联映射中的主键关联
- 【HIbernate框架学习】:Hibernate对象关系映射之单向多对一关联映射
- Hibernate多对多双向关联,Annotation与映射文件方式。解决中间表无法插入数据。
- Hibernatel框架关联映射
- Hibernate数据关联映射之一对多和多对一配置
- Hibernate数据关联映射出现Could not execute JDBC batch update的异常处理
- 一步步学习Hibernate框架(三):采用jpa实现一对多关联映射(一)
- 【HIbernate框架学习】:Hibernate对象关系映射之双向一对多关联映射
- 【HIbernate框架学习】:Hibernate对象关系映射之单向多对多关联映射
- Java的Hibernate框架中一对多的单向和双向关联映射
- 深入解析Java的Hibernate框架中的一对一关联映射
- Hibernate框架中的关联映射
- Hibernate的关联映射,数据表的关联
- 【Hibernate框架】关联映射(一对一关联映射)
- 【hibernate框架】关系映射之一对一单向外键关联(XML实现)
- 【HIbernate框架学习】:Hibernate对象关系映射之双向多对多关联映射
- 【Hibernate框架】关联映射(一对多,多对一)
- Hibernate框架--关联映射,一对多,多对多 inverse cascade
- 【Hibernate框架】关联映射(一对多,多对一)
- 【hibernate框架】关系映射之一对一单项外键关联(Annotation实现)