Hibernate充当应用程序和数据库之间的中间件,实现二者之间的交互操作,他对JDBC进行了封装,以完全面向对象的方式来操作数据。
适用于有多个数据源的情况下,不必去考虑不同数据源的操作差异。
Hibernate将类型对象与数据库表建立映射关系,把类的属性映射称为数据库表的字段,Hibernate属性映射可分为简单属性映射、集合属性
映射、复合属性映射及派生属性映射。下面分别以实例介绍这几个映射及其对应的映射文件表示方式。
1、简单属性
假设有个User类,对应数据库中的User表
User类中的属性包括: <---------------> user_info表中对应字段:
id: int id: primary key
name: String name
age: int age
birthday: Date birthday
salary: float salary
则可在*.hbm.xml中配置类对象到数据库表的映射关系如下(User.hbm.xml):
1 <hibernate-mapping package="com.pattywgm.a_simple_test"> 2 <!--对象到表的映射 --> 3 <class name="User" table="user_info"> 4 <!-- 5 id元素: 表示对象标识符OID即数据库表的主键 6 属性:type 元素类型 7 column 数据库表中对应的列名 8 --> 9 <id name="id" type="int" column="id"> 10 <!-- 11 generator元素表示主键生成策略 12 native:根据底层数据库自动选择主键生成方式,identity,sequence,hilo 13 --> 14 <generator class="native"/> 15 </id> 16 <!--属性到列的映射 --> 17 <property name="age" type="int" column="age"></property> 18 <property name="name" type="string" column="name"/> 19 <property name="birthday" type="date" column="birthday"/> 20 <property name="salary" type="float" column="salary"/> 21 </class> 22 23 </hibernate-mapping>
2、Set集合
有时候一个类对象可能存在某个属性对应多个值,这种情况下若希望每个值都是不重复的就得选用Set集合,如User用户可能对应多个地址(土豪、房多),这时候
从面向对象的角度将就是用一个Set来存放用户的地址信息而保证不重复,从数据库的角度将,我们可以建立一个关联的表address,表外键为user_id对应user_info表的
主键id。
1 <!-- set集合的映射 2 table属性:集合表的名称 3 key子元素:集合外键的列名 4 element子元素:存放集合元素的列的信息 5 sort属性:"unsorted|natural|comparatorClass" 6 默认为:unsorted 7 order-by属性:写的是order by 子句,是SQL语句,是操作的集合表。 8 这是在查询数据时指定orderby子句。 9 --> 10 <set name="address" table="address" sort="natural"> 11 <key column="user_id" not-null="true"></key> 12 <element column="address" type="string" length="50"></element> 13 </set>
Set集合映射
3、List、Bag、Array映射
很多时候,可能对于某样东西我们不仅有很多个,发烧级的还会同样的东西买多个,这个时候可以使用List来保存,同时干净整洁的达人们一般都会尽然有序的排放
整齐自己的东西啦,要是阁下豁出去了,承认自个儿就这么随意,尽情打包到Bag中吧。现在假设User的不少用户都是运动鞋发烧友了哈,这样建立一个与每个user相
关的爱鞋维护,放在user_shoesList表中,在User.hbm.xml映射文件中的配置如下:
1 <!-- List集合 2 key:外键列 3 list-index:用于存放索引的列(有序),这样数据库表中就不会有重复项了 4 key + list-index ==> primary key 5 --> 6 <list name="shoes" table="user_shoesList"> 7 <key column="user_id" not-null="true"></key> 8 <list-index column="shoe_idx"></list-index> 9 <element column="shoe" type="string"></element> 10 </list>
List映射
Bag的映射类似于List,另外Array的映射也基本同于List,这里做几点说明:
1)Set集合中的元素不重复且无序的,映射 Set 集合属性时, 如果 element 元素包括 not-null = “true” 属性,
则集合属性表以关联持久化类的外键和元素列作为联合主键,否则该表没有主键。
2)List中的元素是可重复但有序的,List 集合属性总是以外键列key和元素索引序列list-index作为联合主键
3 )Bag中的元素可重复且无序,bag 元素既可以为 List 集合属性映射,也可以为 Collection 集合属性映射。
不管是哪种集合属性,使用 bag 元素都将被映射成无序集合,而集合属性对应的表没有主键。
Bag 元素只需要 key 元素来映射外键列,使用 element 元素来映射集合属性的每个元素。
4、Map映射
在需要key-value对的场合,就需要用到map了,这时候不仅要映射map属性,还要表达他的key-value映射。假设为User表的每个用户添加家庭成员关系。
1 <!-- 2 map映射 3 key元素:指示外键列 4 map-key元素: 指示集合的key值,必须有type属性 5 element元素: 指示集合的value值,必须有type属性 6 --> 7 <map name="family" table="user_family"> 8 <key column="user_id"></key> 9 <map-key column="appellation" type="string"></map-key> 10 <element column="name" type="string"></element> 11 </map>
Map映射