■■■■■■■■■■■■■■■■■■■↓↓↓↓↓↓↓↓↓ Hibernate框架 —— 映射配置文件基本详细配置↓↓↓↓↓↓↓↓↓↓↓■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
<?xml version="1.0" encoding="UTF-8" ?>
<!--
引入hibernate核心包下的org.hibernate的映射文件的约束
-->
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<!--
根据约束文件创建根标签
auto-import 是查找这个映射类的文件的时候是按照类路径进行查找的
lazy 是设置是否延迟加载,默认是true,设置为false则是立即加载
◆映射的标签也是可以设置的
-->
<hibernate-mapping auto-import="true" lazy="false">
<!--
class 根据一个类进行映射
name 是类的类路径
table 是需要进行映射的表
-->
<class name="com.hibernate._01configurefile.Student" table="_student">
<!--
<id>是定义这个表的主键映射
name 是类的属性
column 是表的字段名
-->
<id name="id" column="id">
<!--
genetator 是定义这个id的值是如何创建的
class 是定义主键进行创建的方式
方式一;自行维护
assigned 是开发人员给的,
如果开发人员没有对主键进行赋值则自动赋值,
1 但是是从0开始,并且是只会赋值一次。
方式二;底层数据库维护
identity 针对sql数据库的
squence 针对orcle数据库的
native 自适应
方式三;hibernate框架维护
increment 是根据最大的id+1进行计算的
uuid 是底层生成一个uuid的,
但是必须要是字符类型或者文本类型
◆注;如果主键是使用自生成的,
那么这个主键第一个值必须要是这个自动生成的规则,
如;第一个必须是1
并且有一些是手动设置以及是失效的,只会使用自生成的值
-->
<generator class="identity"></generator>
</id>
<!--
property 是定于类的属性和表字段直接的关系,
如果表的字段和类的属性名是一样的则不需要写column默认是一样的
name 是映射类的属性名
column 是表的映射字段名
type 则是需要存入数据库的类型
length 则是可以存入数据库的大小
因为在<id>中定义了主键所以不需要在<property>中再次定义
在hibernate框架中对数据库的操作有三种数据库存储类型,
每一种数据类型都是一一对应的。
java hibernate MySql
java.lang.String string string/text/clob
java.lang.byte binary blob
-->
<property name="name"></property>
<property name="age" column="age"></property>
<property name="date" column="date" type="java.util.Date"></property>
<!-- ◆◆◆ 在对文件进行操作的时候建议检查数据库的数据类型和存放的大小 ◆◆◆ -->
<!-- 对字符文件进行操作 -->
<property name="charFile" column="charFile" type="string" length="2000000"></property>
<!-- 对字节文件进行操作 -->
<property name="bytes" column="butes" type="binary" length="2000000"></property>
<!-- 集合映射 -->
<!--
配置Set映射
name 是进行映射类的Set属性名
table 是这个映射集合的表名
-->
<set name="set" table="s_set">
<!--
key 是设置这个表与主表的外键关联键
-->
<key column="s_id"></key>
<!--
element 是定义这个表,存放数据的字段
-->
<element column="address" type="string"></element>
</set>
<!--
list 是设置这个表的List属性的副表
name 映射类中的list名
table 是这个副表的名
-->
<list name="list" table="l_list">
<!--
key 是设置这个表与主表的外键
cloumn 是这个外键的字段名
-->
<key column="s_id"></key>
<!--
因为List集合是一个有序的所以需要定义一个list索引值,
因为id如果进行了删除那么则会出现断层
column 是定义这个索引值的字段名
-->
<list-index column="list_i"></list-index>
<!--
element 是设置这副表的存放数据的字段
column 是字段名
-->
<element column="address_l" type="string"></element>
</list>
<!--
map 是定义映射类中的Map集合
name 是映射类的Map集合属性名
table 是定义这个映射类的表的表名
-->
<map name="map" table="m_map">
<!--
key 是定义这个表的与主表的外键
column 是定义这个外键的字段名
-->
<key column="s_id"></key>
<!--
因为map 集合是有一个key的所以则使用map-key标签
column 是定义这key的字段名
type 是定义这个字段的类型,·····必须
-->
<map-key column="map_key" type="string"></map-key>
<!--
element 是定义字段名
column 是定义这个字段名
-->
<element column="map_value" type="string"></element>
</map>
----------- 对象映射 ---------------
<!--
+----------------> 多对一映射;单向
| 设置对一方的配置
| name 当前这个一方位于多方类中属性名
| class 是这个多方类的类路径
| column 是这个多方法位于表的外键字段
| cascade 是设置这个2个表之间的级联,
| 在写到代码的时候可以省略一点,在删除,
| 修改等操作则会自动映射到一方的表也进行这样的操作。
| 可是如果有多个映射到一方表中的某一个数据,那么则在删除的时候则要关闭级联。
| save-update 是保存和更新
| delete 是删除
| all 是所有
结 none 关闭,默认
合 -->
就 <many-to-one name="person"
是 class="com.levi._02m_t_o_single.Person"
双 column="p_id"
向 ></many-to-one>
|
|
| <!--
| 配置多方的映射
| cascade 是配置这个2个表之间的外键级联
| save-update 保存和修改级联
| delete 删除级联
| all 所有
| none 默认是没有
| -->
| <!--
+-------------> 一对多映射;单向
在数据进行保存的时候出现了2次的update。
因为这个update的出现是因为在insert的时候那个外键是空的,
从而在后面才需要补上去。
在一对多的关联中是由一方进行维护这个关联关系的,
而这个关联关系的建立是依靠外键的。
而这个关联关系是由谁维护则是谁保存则是由谁维护的,
所以一方会主动的把自己的主键的值再次进行更新到外键表的外键字段中,
由此产生了2个update语句。
但是可以通过设置inverse(反转)属性,
用于将这个关联维护关系,主动的转换给被的表
inverse 默认是false,不转让出去,需要设置为true
◆默认在一方
-->
<set name="orders" cascade="all" inverse="true">
<!-- 设置这个一方类位于这个多方表的外键 -->
<key column="c_id"></key>
<!--
配置对象映射关系
class 配置这个多方类的类路径
-->
<one-to-many class="com.levi._03o_t_m_single.Orders" ></one-to-many>
</set>
<!--
+-------------> 多对多映射;双向
| 配置对象映射,table 是中间表的表名
| cascade 是设置这个关联
| save-update 保存/修改
| delete 删除
| all 所有
| none 关闭级联,默认
|
| inverse 设置和外键维护控制权给另外的一个映射,
| 因为在多对多的映射中会出现同时2个维护
| -->
| <set name="student" table="n_stu_tea" cascade="all" inverse="true">
多
对 <!-- 设置当前这个表的外键 -->
多 <key column="t_id"></key>
双
向 <!--
| 设置这个表的映射
| column 是设置这个class属性对应的类的外键值
| -->
| <many-to-many class="com.levi._05m_t_m_double.Student"
| column="s_id"></many-to-many>
| </set>
|
| <!--
+-------------> 多对多映射;双向
设置对象映射
name 是属性名
table 是中间表
-->
<set name="teacher" table="n_stu_tea">
<!-- 设置当前这个表的位于中间表的外键 -->
<key column="s_id"></key>
<!-- 设置关联表,column是设置这个关联表的外键 -->
<many-to-many class="com.levi._05m_t_m_double.Teacher"
column="t_id">
</many-to-many>
</set>
<!--
+-------------> 一对一映射;双向 —— 主表
| 设置映射,因为外键是不在Person表的
| -->
<one-to-one name="idcard"
| class="com.levi._06o_t_o_double.IdCard"
| cascade="all"></one-to-one>
|
| <!--
| 一对一映射;双向 —— 副表
+------------> 方式一;使用一对多(多对一)双向;
| 必须要设置外键是唯一的,
一 这是一个特殊的一对一。
对
一
映 -->
射 <!-- <many-to-one name="person"
双 class="com.levi._06o_t_o_double.Person"
向 column="p_id"
| cascade="all"
| unique="true"></many-to-one> -->
| <!--
| 一对一映射;双向 —— 副表
|
+------------> 方式二;主键作为外键
-->
<one-to-one name="person"
class="com.levi._06o_t_o_double.Person"
cascade="all"
constrained="true">
</one-to-one>
</class>
</hibernate-mapping>