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):

 <hibernate-mapping package="com.pattywgm.a_simple_test">
<!--对象到表的映射 -->
<class name="User" table="user_info">
<!--
id元素: 表示对象标识符OID即数据库表的主键
属性:type 元素类型
column 数据库表中对应的列名
-->
<id name="id" type="int" column="id">
<!--
generator元素表示主键生成策略
native:根据底层数据库自动选择主键生成方式,identity,sequence,hilo
-->
<generator class="native"/>
</id>
<!--属性到列的映射 -->
<property name="age" type="int" column="age"></property>
<property name="name" type="string" column="name"/>
<property name="birthday" type="date" column="birthday"/>
<property name="salary" type="float" column="salary"/>
</class> </hibernate-mapping>

2、Set集合

有时候一个类对象可能存在某个属性对应多个值,这种情况下若希望每个值都是不重复的就得选用Set集合,如User用户可能对应多个地址(土豪、房多),这时候

从面向对象的角度将就是用一个Set来存放用户的地址信息而保证不重复,从数据库的角度将,我们可以建立一个关联的表address,表外键为user_id对应user_info表的

主键id。

 <!-- set集合的映射
table属性:集合表的名称
key子元素:集合外键的列名
element子元素:存放集合元素的列的信息
sort属性:"unsorted|natural|comparatorClass"
默认为:unsorted
order-by属性:写的是order by 子句,是SQL语句,是操作的集合表。
这是在查询数据时指定orderby子句。
-->
<set name="address" table="address" sort="natural">
<key column="user_id" not-null="true"></key>
<element column="address" type="string" length="50"></element>
</set>

Set集合映射

3、List、Bag、Array映射

很多时候,可能对于某样东西我们不仅有很多个,发烧级的还会同样的东西买多个,这个时候可以使用List来保存,同时干净整洁的达人们一般都会尽然有序的排放

整齐自己的东西啦,要是阁下豁出去了,承认自个儿就这么随意,尽情打包到Bag中吧。现在假设User的不少用户都是运动鞋发烧友了哈,这样建立一个与每个user相

关的爱鞋维护,放在user_shoesList表中,在User.hbm.xml映射文件中的配置如下:

 <!-- List集合
key:外键列
list-index:用于存放索引的列(有序),这样数据库表中就不会有重复项了
key + list-index ==> primary key
-->
<list name="shoes" table="user_shoesList">
<key column="user_id" not-null="true"></key>
<list-index column="shoe_idx"></list-index>
<element column="shoe" type="string"></element>
</list>

List映射

Bag的映射类似于List,另外Array的映射也基本同于List,这里做几点说明:

1)Set集合中的元素不重复且无序的,映射 Set 集合属性时, 如果 element 元素包括 not-null = “true” 属性,
         则集合属性表以关联持久化类的外键和元素列作为联合主键,否则该表没有主键。

注意:此处Key为MUL表示该列的值可以重复,该列是一个非唯一索引的前导列(第一列)或者是一个唯一性索引的组成部分。

2)List中的元素是可重复但有序的,List 集合属性总是以外键列key和元素索引序列list-index作为联合主键

          

3 )Bag中的元素可重复且无序,bag 元素既可以为 List 集合属性映射,也可以为 Collection 集合属性映射。
          不管是哪种集合属性,使用 bag 元素都将被映射成无序集合,而集合属性对应的表没有主键
          Bag 元素只需要 key 元素来映射外键列,使用 element 元素来映射集合属性的每个元素。

4、Map映射

在需要key-value对的场合,就需要用到map了,这时候不仅要映射map属性,还要表达他的key-value映射。假设为User表的每个用户添加家庭成员关系。

Map中以外键列及key值对应列作为联合主键。

 <!--
map映射
key元素:指示外键列
map-key元素: 指示集合的key值,必须有type属性
element元素: 指示集合的value值,必须有type属性
-->
<map name="family" table="user_family">
<key column="user_id"></key>
<map-key column="appellation" type="string"></map-key>
<element column="name" type="string"></element>
</map>

Map映射

5、组成关系映射Component

有时候,关系映射不仅限于基本数据类型,对于组成关系(如User对象与Car对象)之间,hibernate提供了component实现组合关系的映射。现在,

我们假设每个用户user有一辆车对应Car类,包括color、money、logo三个属性,修改表的结构,我们需要提供每个User对象的新的映射,该映射中包括

其到Car对象的映射如下:

 <!--
组成关系映射
class元素:组合关系所对应的实体类Car
property元素:表示Car类中的属性到数据库表user_info中列名的映射
-->
<component name="car" class="Car">
<property name="money" column="car_cost" type="float"> </property>
<property name="color" column="car_color" type="string"></property>
<property name="logo" column="car_logo" type="string"></property>
</component>

Component组合关系映射

在数据库表中的体现:

集合除了存放 基本数据类型及其包装类型、String 字符串、日期类型以外,还可以存放组件类型。实际上,更多情况下,集合组件存放的都是组件类型

         a> 对于有集合属性持久化类, 需要使用 set, list, bag 等集合元素来映射集合属性。
    b> 如果集合里的元素是普通字符串,则使用 element 映射集合元素即可。
    c> 如果集合元素也是定义类,则需使用 composite-element 子元素来映射集合元素。
      composite-element 元素映射一个组件类型,因此需要 class 元素确定元素的类
        型,该元素还支持 property 的子元素来定义组件类型的子属性

下面为每个用户添加jobs属性,放在一个set集合中,表示该用户的工作经历,则映射文件如下:

 <!--
集合元素为组成关系的映射
composite-element: 表示set中元素为组合类型
class元素:组合关系所对应的实体类Car
property元素:表示Car类中的属性到数据库表user_info中列名的映射
-->
<set name="jobs" table="user_jobs">
<key column="user_id" not-null="true"></key>
<composite-element class="Job">
<!-- job_name设为非空,则与user_id共同构成user_jobs表的主键 -->
<property name="job_name" type="string" column="job_name" not-null="true"></property>
<property name="begin_time" type="date" column="begin_time"></property>
<property name="company" type="string" column="company"></property>
</composite-element>
</set>

Set+Component

在数据库中的反应如下,注意user_id和job_name共同构成表的主键:

Hibernate持久化类属性映射的更多相关文章

  1. 笔记:Hibernate 持久化类标注说明

    持久化类标注 标注 @Entity:注解声明该类是一个Hibernate的持久化类 标注 @Table:指定该类映射的表 参数 name:指定映射数据库表的名称 参数 uniqueConstraint ...

  2. (转) Hibernate持久化类与主键生成策略

    http://blog.csdn.net/yerenyuan_pku/article/details/65462930 Hibernate持久化类 什么是持久化类呢?在Hibernate中持久化类的英 ...

  3. Eclipse从数据库逆向生成Hibernate实体类和映射文件(Eclipse插件系列之HibernateTools)

    ♣下载安装Eclipse插件(HibernateTools) ♣Eclipse连接数据库(Mysql5.7) ♣新建hibernate.properties和hibernate.cfg.xml文件 ♣ ...

  4. 笔记:Hibernate 持久化类标注示例-双向1-N关系映射

    1-N关系的1端持久化类 package org.drsoft.hibernate.model.oneToMany;     import java.util.Date; import java.ut ...

  5. (补充)06.Hibernate持久化类&持久化对象

    持久化类:就是一个Java类(JavaBean),这个类与表建立映射关系就可以成为是持久类 持久化类 = JavaBean + xxx.hbm.xml 编写规则: 1.提供一个无参数,public访问 ...

  6. myeclipse自动生成可持久化类的映射文件的方法

    1.打开DB Browser,新建一个数据库的连接,找到想要持久化操作的数据库表的图标,右键选择hibernate reverse engineering 2.之后出现如下所示: java src f ...

  7. Hibernate持久化类规则

    注意事项: 提供无参的构造方法,因为在hibernate需要使用反射生成类的实例 提供私有属性,并对这些属性提供公共的setting和getting方法,因为在hibernate底层会将查询到的数据进 ...

  8. 反向生成hibernate实体类和映射文件

    工欲善其事,必先利其器.我们可以使用IDE来根据数据库中的表反向生成实体类和映射文件,虽然这些东西手写也并不是难度很大,但是如果存在大量的简单工作需要我们做,也会显得很麻烦. 写在前面 我们反向生成的 ...

  9. hibernate持久化类中,修改字符串长度时,注意的问题

    在使用hibernate注解修饰字符串长度时,如果一开始没有把String类型的变量长度设计好,在网数据库插入数据时,容易造成字段长度超出错误,这时候需要修改@Column里length的大小.如果使 ...

随机推荐

  1. CSSText属性批量修改样式

      给一个HTML元素设置css属性 var head= document.getElementById("head");head.style.width = "200p ...

  2. PHP命名空间的作用、为什么使用命名空间?

    命名空间一个最明确的目的就是解决重名问题,PHP中不允许两个函数或者类出现相同的名字,否则会产生一个致命的错误.这种情况下只要避免命名重复就可以解决,最常见的一种做法是约定一个前缀. 举个栗子:项目中 ...

  3. JAVA获取客户端IP地址

    在JSP里,获取客户端的IP地址的方法是:request.getRemoteAddr(),这种方法在大部分情况下都是有效的.但是在通过了Apache,Squid等反向代理软件就不能获取到客户端的真实I ...

  4. bash profile .bashrc

    /etc/profile:此文件为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行. 并从/etc/profile.d目录的配置文件中搜集shell的设置. /etc/bashrc:为每一 ...

  5. Android IOS WebRTC 音视频开发总结(八十二)-- VP8对VP9,质量还是码率?

    本文主要介绍VP9(我们翻译和整理的,译者:weizhenwei,校验:blacker),最早发表在[编风网] 支持原创,转载必须注明出处,欢迎关注我的微信公众号blacker(微信ID:blacke ...

  6. Android IOS WebRTC 音视频开发总结(七八)-- 为什么WebRTC端到端监控很关键?

    本文主要介绍WebRTC端到端监控(我们翻译和整理的,译者:weizhenwei,校验:blacker),最早发表在[编风网] 支持原创,转载必须注明出处,欢迎关注我的微信公众号blacker(微信I ...

  7. 41个Web开发者JavaScript实用小技巧

    1. 将彻底屏蔽鼠标右键 oncontextmenu="window.event.returnValue=false" < table border oncontextmen ...

  8. 第三次作业:caculator

    第三次作业 作业链接 ********* 遇到的问题: Scan类: 队列的使用方法不了解,上网查询并自己练习了一下才初步了解,才运用到作业 . 判断数字用的 if (input[i] >= ' ...

  9. Foundation框架—数据类(NSData)

    一 NSData的使用 .string -> data     NSString *str = @"changxiangweilai";     NSData *data = ...

  10. mybatis - resultMap

    resultMap有比较强大的自动映射,下面是摘自mybatis中文官网的的片段: 当自动映射查询结果时,MyBatis会获取sql返回的列名并在java类中查找相同名字的属性(忽略大小写). 这意味 ...