十四: 关联
员工和部门是多对一 在员工表中 持有部门 类属性 depart
private Department depart
员工配置文件 多对一反射能够知道不是简单拿数据 知道depart找到类映射文件 才能把完整
对象映射过来 通过depart_id(表里列名),缺省 去寻找depart表里的id 如果不是映射id
再加一个 property-ref="name"
<many-to-one name="depart" column="depart_id"/>
存储进表里的数据列名为depart_id 引用的是对象的id 查询也一样查询得到的是我们的对象,
根据打印出来的sql可以看到,底层也是先插员工,根据员工里的部门id查询得到id
这个注解hibernate帮我们做了什么? 新增的时候,我们往这个字段里塞了一个对象,那么会往
数据库表的列里放入这个对象对应的表的注解列,就形成了外键引用
查询的时候,我们获取员工后,会连带着部门对象整个获取。底层当然还是查询了两个表,先查询
员工表,员工表里信息得到了里面包含一个部门id,再根据部门id查询得到部门的所有信息,映射
的员工表里的部门字段
部门到员工是一对多
在部门表里 写一个集合
private Set<Employee> emps;
编写hibernate映射文件,只有hibernate能帮助我们完成这种关联 set
//set 告诉他是集合 class 告诉他集合里放的是啥 key 告诉他依赖什么区寻找这个集合,依赖
另一个对这个表的外键,也就是我们上一个写的 <many-to-one name="depart"
column="depart_id"/>列 可以得到一组部门号相同的员工集合
<set name="emps">
<key cloumn="depart_id"></key>
<one-to-many class="Employee" />
</set>
穿一个部门id得到员工集合,sql也是跑了两条 ,先查询部门信息 ,查询员工表(根据
depart_id)
save部门的时候给他穿一个员工集合会发生什么呢? 会更新员工的depart_id 为部门id
这个例子也能体现出对象模型和关系模型的不对等性。看我们的对象模型发生了改变,但关系模型
没变
十七 一对一
基于主键的one-to-one (person的映射文件)
Person <one-to-one name="idCard" /> 主
IdCard <one-to-one name="person" /> 引用
两个类中他们是相互持有的
情况一:IdCard的id就是person的id 主外键关联
在写IdCard的id配置文件的时候这样写
<class name="IdCard" table="id_card">
<id name="id">
<generator class="foreign">
这里指的是下面配置文件中的person
<param name="property">person</param>
</generator>
</id>
<property name="life">life</property>
<one-to-one name="person" />
</class>
情况二 idCard有自己主键,也是自增长,另外有一列是引用Person的id,和多对一类似,在id—
Card中引用其他表的外键上加上唯一性约束 就变成了一对一
<class name="IdCard" table="id_card">
<id name="id">
<generator class="native">
</generator>
</id>
<property name="life">life</property>
<many-to-one name="person" column="person_id" unique="true" />
</class>
Person配置文件
<one-to-one name="idCard" property-ref="person" />加上property-ref表示去
name="idCard" 中找person,如果id跟我的逐渐一致表示是这个人的卡
hibernate定义集合的时候只能使用接口不能用实现类
二十六:
级联操作 配置两个对象关联的时候都可以配置,例如
<set name="emps" cascade="delete">....</set> 意思就是我删除部门把员工都删除
掉
cascade 级联 可以设置为 save-update delete all等
看主从对象的关系例如person里的idcard引用就可以设置级联为all
一般多对多不配置级联 普通property没有这个属性的
一对多中一可以放弃维护关系(部门,集合这边出现) inverse="true" 放弃维护关联关系
hibernate不允许多的那边放弃关系维护(员工)
二十八
继承 关系模型 一个表有type skill sell 列没有为null
关系模型 三个类 Employee 父类 Skill Sales 子类
配置文件这样写
<discriminator column="type" type="int"/> 鉴别器作用
<subclass name="Skiller" discriminator-value="1"/>
<property name="skill" />
</subclass>
<subclass name="Sales" discriminator-value="2"/>
<property name="sell" />
</subclass>
优点:效率高,只操作一张表,
缺点:增加子类要修改表结构,必须设计为可以为null
如果子类差别太大,可以选取方式:修改关系模型 将子类单独建张表
优点 表更合理 没有null字段
缺点 效率低
这两种可以结合使用