【SSH商城】--- Hibernate 的many-to-one;one-to-many;many-to-many

来源:互联网 发布:linux热点连接ip查询 编辑:程序博客网 时间:2024/05/17 23:39
    虽然我已经敲过SSH了,可是感觉还是心里面空空的,这不,前两天就有几个同学问我给他们挑错,结果就没有调出来,丢脸啊,所以就捡着零碎时间,好好的总结一下把,就当是给以后面试做准备了!
     开始咱们的主题:
1、many-to-one:
     描述多对一的一种数据模型,它指定many一方是不能独立存在的。通过many- to - one 的标签,我们可以定义一种多对一的联系,在配置文件中建立这两个表的关联。这个标签在SSH中是应用在实体类的配置文件中,主要是用来进行级联操作的,它里面有很多属性,咱们一一来说明一下:

1.name:属性名。指出many一方的类用哪个属性和one一方的类关联.
2.column:字段名(可选).指出many一方的类对应的数据表用哪个列和one一方的类对应的数据表关联(两表之间存在外键关联);
3.class:关联的类的名字(可选 - 默认是通过反射得到属性类型);
4.cascade:指明哪些操作会从父对象级联到关联的对象(可选).cascade属性允许下列值:: all, save-update, delete, none. 设置除了none以外的其它值会传播特定的操作到关联的(子)对象中。
5.outer-join:当设置hibernate.use_outer_join的时候,对这个关联允许外连接抓取(可选 - 默认为 auto).outer-join参数允许下列三个不同值: auto(使用外连接抓取关联(对象),如果被关联的对象没有代理(proxy) ),true(一直使用外连接来抓取关联),false(永远不使用外连接来抓取关联);
6.update,insert:指定对应的字段是否在用于UPDATE 和/或 INSERT的SQL语句中包含。如果二者都是false,则这是一个纯粹的“外源性(derived)”关联,它的值是通过映射到同一个(或多个)字段的某些其他属性得到的,或者通过trigger(除法器),或者是其他程序(可选 - 默认为 true)
7.property- ref:指定关联类的一个属性,这个属性将会和本外键相对应。如果没有指定,会使用对方关联类的主键(可选).property-ref属性只应该用来对付老旧的数据库系统,可能出现外键指向对方关联表的是个非主键字段(但是应该是一个惟一关键字)的情况。这是一种十分丑陋的关系模型。比如说,假设 Product类有一个惟一的序列号,它并不是主键;
8.access:NHibernate 用来访问属性的策略(可选 - 默认为property)
9.unique:允许产生外键列唯一约束的数据库定义语言(DDL)(可选)
10、lazy:指定是否采用延迟加载及加载策略 默认值为proxy通过代理进行关联 可选值为 true此对象采用延迟加载并在变量第一次被访问时抓取、false此关联对象不采用延迟加载

一般情况下用到最多的属性就是:name,cascade,column就行了,别的用到了可以再查。
例如:在SSH商城的User实体类需要和订单实体类进行关联,一个用户可以有多个订单,所以订单与用户关联的配置就可以写在订单的hbm配置文件中,还可以定义在什么操作的时候进行这个级联操作。代码如下:
<!-- 订单与用户关联配置 --><many-to-one name="user" lazy="false" class="cn.itcast.shop.user.vo.User" column="uid"/>

2、one -to-many:
道理类似,是一对多的关系,也就是用户的配置文件里需要配置的,和订单的many-to-one对应。但是在SSH商城中它只是定义了删除的关联关系。它其实还可以提供级联更新的功能,保证数据的完整性。

<set name="orders" cascade="delete">            <key column="uid"/>            <one-to-many class="cn.itcast.shop.order.vo.Order"/></set>


3、many-to-many:
  在SSH商城里面好像没有多对多的配置。它代表的是多对多的关系。
  在这里以学生可以选多门课程为例,学生实体和课程就是多对多的关系
写在student.hbm.xml中的代码体现为:
<bag name="Subject" table="r_Student_Subject" inverse="true" cascade="save-update" lazy="false">      <key column="StudentID" />      <many-to-many class="Subject" column="ID" outer-join="auto" /></bag>

但是只是在插入和修改的时候进行表的关联关系,他们关联的主键就是StudentID和ID.

1 0