hibernate映射配置文件详解

来源:互联网 发布:warframe网络端口设置 编辑:程序博客网 时间:2024/04/27 15:28

hibernate映射配置文件详解

映射配置文件基本结构如下:

<hibernate-mapping>    <class name="cn.itcast.elec.domain.ElecText" table="elec_text">        <id name="textID" type="string">             <column name="textID" sql-type="varchar(50)" not-null="true"/>            <generator class="uuid"></generator>        </id>        <property name="textName" type="java.lang.String">            <column name="textName" sql-type="varchar(50)"/>        </property>        <property name="textDate" type="date">            <column name="textDate" />        </property>        <property name="textRemark" type="string">            <column name="textRemark" sql-type="varchar(500)"></column>        </property>    </class></hibernate-mapping>

1、主键(id)
hibernate的主键生成策略有如下几种:
1)assigned
主键由外部程序负责生成,在save()之前指定。
2)hilo
通过hi/lo算法实现的主键生成机制,需要额外的数据库表或字段提供高位值来源。
3)seqhilo
与hilo类似,通过hi/lo算法实现的主键生成机制,需要数据库中的sequence,适用于支持sequence的数据库,如oracle。
4)increment
主键按数值顺序递增,此方式的实现机制为在当前应用实例中维持一个变量,以保存着当前的最大值,之后每次需要生成主键的时候将此值加1作为主键,这种方式可能产生的问题是:不能在集群下使用
5)identity
采用数据库提供的主键生成机制。如果MySQL、SQL Server中的主键生成机制。
6)sequence
采用数据库提供的sequence机制生成主键,如Oracle中的sequence。
7)native
由hibernate根据使用的数据库自行判断传菜员的identity、hilo、sequence其中一种作为主键生成方式。
8)uuuid.hex
由hibernate基于128位UUUID算法生成16进制数值(32位字符串)作为主键
9)uuuid.string
与uuuid.hex类似,只是生成的主键未进行编码(长度16位),不能应用在PostgreSQL数据中。
10)foreign
使用另外一个相关联的对象的标识符作为主键。
主键配置举例如下:

 <id name="id" column="id" type="java.lang.Integer">      <generator class="native"/>    </id>   

另外还可以扩展hibernate的类来做自己的主键生成策略,具体例子见:http://www.javaeye.com/topic/93391。
2、普通属性(property)

属性中比较常用的有:name(对应的java类的属性名称)、column(对应的表中的字段)、type(属性的类型,eg.java.lang.String)、not-null(设置该属性是否为空,为true时表示非空,默认为false)和length(字段的长度限制)。 示例如下:

<property name="accessname" column="accessName" type="java.lang.String" not-null="true" />   <property name="state" column="state" type="java.lang.Byte" not-null="true" />   <property name="description" column="description" type="java.lang.String" />  

1)Hibernate中映射关系文件中,每个字段的配置都
需要通过type来指定转换的类型,这个类型可以
是Java类型,也可以是Hibernate预置的类型。
2)Java类型
–需要写完整的类路径
–对于布尔值的转换,没有默认的Java类型可以
处理,如果一定要使用Java类型来处理,需要
自定义一个类,并实现接口UserType
3)Hibernate预置的映射类型(推荐)
(1)整数
byte,short,integer,long
(2)小数
float,double
(3)字符串
string
(4)日期(年月日)
date,可以将数据库中的日期类型转换为
java.sql.Date
(5)时间(时分秒)
time,可以将数据库中的日期类型转换为
java.sql.Time
(6)时间戳(年月日时分秒)
timestamp,可以将数据库中的日期类型转换为
java.sql.Timestamp
(7)布尔
yes_no:
可以将数据库中的y/n转换为java.lang.Boolean
中的true/false
true_false:
可以将数据库中的t/f转换为java.lang.Boolean
中的true/false
3. 一对多关系(

    <set name="java映射类中对应的属性" inverse="true" lazy="true">             <key column="表中对应字段"/>               <one-to-many class="多方的类"/>      </set>        <!-- 示例 -->       <set name="userSet" inverse="true" lazy="true">                   <key column="orgId"/>                    <one-to-many class="User"/>         </set>   “多”方(例如:用户)隶属于一个“一”方对象,一般的格式如下: <many-to-one name="java映射类中对应的属性" column="表中对应字段" class="类名" not-null="true" />     <!-- 示例 -->   <many-to-one name="org" column="orgId" class="Organization" not-null="true" />  

4、 一对一关系
一对一关系相对一对多关系来说比较少见,但也在某些情况下要用到,例如有一个用户的基本信息表(USER)和一个用户的密码表(PASSWD)就存在一对一的关系。下面来看一下一对一关系在Hibernate的配置。

<!-- 其中主表(eg. 用户的基本信息表)的配置 -->  <one-to-one name="主表对象中子表对象的属性名" class="子表对象的类名" cascade="save-update"/>   <one-to-one name="password" class="com.amigo.dao.pojo.Passwd" cascade="save-update"/>   <!-- 子表(eg. 用户的密码表)的配置 -->   <one-to-one name="子表对象中主表对象的属性名" class="主表对象的类名" constrained="true" />    <one-to-one name="user" class="com.amigo.dao.pojo.User" constrained="true" /> 

5、多对多关系
在数据库设计时,一般将多对多关系转换为两个一对多(或多对一)关系,例如在基于角色的权限系统中,用户和角色存在的关系就是典型的多对多关系,即一个用户可以具有多个角色,而一个角色又可以为多个用户所有,一般在设计时,都会加一个用户与角色的关联表,该表与用户表以及角色表都存在外键关联。
在本小节中讲述的是没有分解的多对多关系在Hibernate中如何配置。设置格式如下:

<set name="java对象的属性名" table="表名" cascade="all" outer-join="false">           <key column="表的对应字段"/>           <many-to-many class="另一个表的对象类" column="另一个表的字段"/>      </set>         <!-- t_user方 -->      <set name="roleSet" table="t_user" cascade="all" outer-join="false">          <key column="roleId"/>          <many-to-many class="com.amigo.dao.pojo.Role" column="roleId"/>       </set>         <!-- t_role方 -->      <set name="userSet" table="t_role" cascade="all" outer-join="false">          <key column="roleId"/>          <many-to-many class="com.amigo.dao.pojo.User" column="roleId"/>       </set>
1 0