1集合映射
一个买家对应多个地址
Set集合的配置
<!--接下来我们应该配置的是我们的集合映射 set集合-->
<set name="addresses" table="t_address">
<!--这里的这个key相当于是要配置外键 那么这个外键 是会自动的映射到当前的class的主键-->
<!-- 下面的这个 u_id 会自动的映射成上面的主键的id值-->
<key column="u_id"></key>
<!--下面的这个列专门用来存放地址
下面记住因为是集合所以集合中的数据的数据类型必须要写 否则报错
-->
<element column="address" type="java.lang.String"></element>
</set>
List集合配置
<!--接下来我们应该配置的是我们的集合映射 list集合-->
<list name="addresses" table="t_address_list">
<!--配置的是我们的外键-->
<key column="u_id"></key>
<!--下面就是和set集合唯一区别 下面这个配置表示的是排序的列-->
<list-index column="indexs"></list-index>
<!--配置的是实质映射的字段-->
<element column="address" type="java.lang.String"></element>
</list>
Map集合的配置
<!--下面就是map集合的映射-->
<map name="addresses" table="t_address_map">
<key column="u_id"></key>
<map-key column="keys_001" type="java.lang.String"></map-key>
<element column="address" type="java.lang.String"></element>
</map>
注意:
1——在使用集合映射的时候 首先要掌握 必须要给定集合中的数据的数据类型 否则报错
2——在使用我们的List集合的是时候 需要给我们的List集合提供排序的列(必须的)
3——在使用map集合的时候 需要在集合映射表中添加key的映射字段
4——在集合中的<key></key> 这个表示的是集合要引用的键 这个外键是自动完成映射的
外键会主动的映射到我们的实体的主键中去
一对多映射配置文件:
<!--下面就配置的是一对多的集合映射-->
<set name="emps" table="t_employee" cascade="save-update,delete">
<!--集合中的外键会自动的映射到上面的主键-->
<key column="dept_id"></key>
<one-to-many class="Employ"/>
</set>
2 多对一映射配置文件:
<many-to-one name="dept" class="Dept" column="dept_id"></many-to-one>
注意:实际开发中不需要两边配置,而且一般实际中都是多维护一
级联的问题 cascade
<set name="emps" table="t_employee" cascade="save-update">
<!--集合中的外键会自动的映射到上面的主键-->
<key column="dept_id"></key>
<one-to-many class="Employ"/>
</set>
cascade:级联 级联有三种 :save-update 级联的保存和更新 delete 级联的删除 all(前面两个家伙的并集)
级联的保存和更新是可以用的 但是在开发中一般情况下 级联的删除是不会用到的 因为他会影响到多张表
4多对多的关联映射
一个程序员可以开发多个项目 程序员----->项目(一对多的关系)
一个项目是由多个开发人员来进行开发 项目----->程序员(一对多的关系)
综上所述 两个一对多的关系就构成了 多对多的关系
Project的一方的配置
<!--配置的是多对多的集合映射-->
<set name="devs" table="t_relation" cascade="all">
<!--上面的这个key你记住就是映射的当前的类的主键-->
<key column="pro_id"></key>
<!--配置的是相关联的另外一张表
column:配置的是对方的主键在关系表中映射的这个值的列名
class:配置的是对方的这个名字
-->
<many-to-many column="dev_id" class="Developer"></many-to-many>
</set>
Developer一方的配置
<!--配置的是多对多的集合映射-->
<set name="pros" table="t_relation" cascade="all">
<!--上面的这个key你记住就是映射的当前的类的主键-->
<key column="dev_id"></key>
<!--配置的是相关联的另外一张表
column:配置的是对方的主键在关系表中映射的这个值的列名
class:配置的是对方的这个名字
-->
<many-to-many column="pro_id" class="Project"></many-to-many>
</set>
5 继承映射
1 普通的继承映射
需求:现在有动物(Animal这个类) 还有Dog这个类 和 Fish这个类 要求使用继承映射来完成这个关联关系的配置
<hibernate-mapping package="com.qf.extend2">
<class name="Dog" table="t_dog">
<!--配置的是表里面的主键-->
<id name="id" type="java.lang.Integer">
<generator class="native">
</generator>
</id>
<!--配置的是普通的列-->
<property name="color"></property>
<property name="name"></property>
<property name="num"></property>
</class>
</hibernate-mapping>
2 所有自类个父类对应一张表
分类:首先得有分类 只有有了分类之后那么这个才知道是谁的数据
表的字段应该包含所有的字段
<hibernate-mapping package="com.qf.extend3">
<class name="Animal" table="t_animal_01">
<!--配置的是表里面的主键-->
<id name="id" type="java.lang.Integer">
<generator class="native">
</generator>
</id>
<!-- 下面就配置一个非公共的 -->
<!--首先的整个分类
下面这个就是分类的这个列
-->
<discriminator column="type_" length="30" type="string"></discriminator>
<!--配置的是普通的列-->
<property name="color"></property>
<property name="name"></property>
<!--分别来配置我们的 dog 和 fish了-->
<subclass name="Dog" discriminator-value="dog_">
<!--要给这个孩子配置个类型-->
<property name="num" type="string"></property>
</subclass>
<!--配置鱼的信息-->
<subclass name="Fish" discriminator-value="fish_">
<property name="fishCoatCount" type="java.lang.Integer"></property>
</subclass>
</class>
</hibernate-mapping>
3所有类都对应表
1>:要实现分表的话那么首先要 将Anianl的主键自增长给我改了...
2>:使用的是join-class来完成分表的
<hibernate-mapping package="com.qf.extend4">
<class name="Animal" table="t_animal_02">
<!--配置的是表里面的主键-->
<id name="id" type="string">
<generator class="assigned">
</generator>
</id>
<!--配置的是普通的列-->
<property name="color"></property>
<property name="name"></property>
<!--接下来就是配置我们的分表了-->
<joined-subclass name="Dog" table="t_dog_02">
<!--这里的key会自动的映射到上面class的主键上面去-->
<key column="id"></key>
<!--配置的是其他的列-->
<property name="num"></property>
</joined-subclass>
<!--接下来配置我们的fish-->
<joined-subclass name="Fish" table="t_fish_02">
<!--这里的key会自动的映射到上面class的主键上面去-->
<key column="id"></key>
<!--配置的是其他的列-->
<property name="fishCoatCount"></property>
</joined-subclass>
</class>
</hibernate-mapping>
4 父类不对应表,子类都对应
为什么不用第一种呢?因为第一种要编写很多的配置文件 不好使...
<hibernate-mapping package="com.qf.extend5">
<!-- abstract="true":这个表示的是不对应表 -->
<class name="Animal" abstract="true">
<!--配置的是表里面的主键-->
<id name="id" type="string">
<generator class="assigned">
</generator>
</id>
<!--配置的是普通的列-->
<property name="color"></property>
<property name="name"></property>
<!--接下来就是配置加表的问题-->
<union-subclass name="Dog" table="t_dog_03">
<property name="num"></property>
</union-subclass>
<!--下面就配置鱼了-->
<union-subclass name="Fish" table="t_fish_03">
<property name="fishCoatCount"></property>
</union-subclass>
</class>
</hibernate-mapping>
6一对一映射
需求:人和身份证的问题
一个人 只有一个身份证
一个身份证是不是也只是对应了 一个人
人----->身份证 一对一的关系
身份证------>人 一对一的关系
身份证的配置
<hibernate-mapping package="com.qf.one2one">
<class name="IdCard" table="t_idcard">
<!--配置的是表里面的主键-->
<id name="cardId" type="java.lang.Integer">
<generator class="native">
</generator>
</id>
<!--配置的是普通的列-->
<property name="cardNum"></property>
<!--下面配置的是引用主键的这一方-->
<many-to-one name="people" column="p_id" class="People" cascade="all"></many-to-one>
</class>
</hibernate-mapping>
People的配置
<hibernate-mapping package="com.qf.one2one">
<class name="People" table="t_people">
<!--配置的是表里面的主键-->
<id name="pId" type="java.lang.Integer">
<generator class="native">
</generator>
</id>
<!--配置的是普通的列-->
<property name="name"></property>
<!--接下来应该配置一对一的映射-->
<one-to-one name="idCard" class="IdCard" cascade="all"></one-to-one>
</class>
</hibernate-mapping>
把第一个的主键作为第二个的主键