一、***.hbm.xml 映射文件模板
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<!-- 映射文件: 映射一个实体类对象; 描述一个对象最终实现可以直接保存对象数据到数据库中。 -->
<!--
package: 要映射的对象所在的包
(可选,如果不指定,此文件所有的类都要指定全路径)
auto-import:默认为true, 在写hql的时候自动导入包名
如果指定为false, 再写hql的时候必须要写上类的全名;
如:session.createQuery("from cn.itcast.c_hbm_config.Employee").list();
-->
<hibernate-mapping package="cn.itcast.c_hbm_config" auto-import="true">
<!--
class 映射某一个对象的(一般情况,一个对象写一个映射文件,即一个class节点)
name 指定要映射的对象的类型
table 指定对象对应的表;
如果没有指定表名,默认与对象名称一样
-->
<class name="Employee" table="employee">
<!-- 主键 ,映射-->
<id name="empId" column="id">
<!--
主键的生成策略
identity 自增长(mysql,db2)
sequence 自增长(序列), oracle中自增长是以序列方法实现
native 自增长【会根据底层数据库自增长的方式选择identity或sequence】
如果是mysql数据库, 采用的自增长方式是identity
如果是oracle数据库, 使用sequence序列的方式实现自增长
increment 自增长(会有并发访问的问题,一般在服务器集群环境使用会存在问题。)
assigned 指定主键生成策略为手动指定主键的值
uuid 指定uuid随机生成的唯一的值
foreign (外键的方式, one-to-one讲)
-->
<generator class="uuid"/>
</id>
<!--
普通字段映射
property
name 指定对象的属性名称
column 指定对象属性对应的表的字段名称,如果不写默认与对象属性一致。
length 指定字符的长度, 默认为255
type 指定映射表的字段的类型,如果不指定会匹配属性的类型
java类型: 必须写全名
hibernate类型: 直接写类型,都是小写
-->
<property name="empName" column="empName" type="java.lang.String" length="20"></property>
<property name="workDate" type="java.util.Date"></property>
<!-- 如果列名称为数据库关键字,需要用反引号或改列名。 -->
<property name="desc" column="`desc`" type="java.lang.String"></property>
</class>
</hibernate-mapping>
二、***.hbm.xml 映射文件详解
该映射文件用于配置domain实体模型与数据库表的映射。
实体与表的映射。
属性与字段的映射。
类型的映射。
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<!-- 映射文件: 映射一个实体类对象; 描述一个对象最终实现可以直接保存对象数据到数据库中。 -->
<hibernate-mapping package="cn.itcast.c_hbm_config" auto-import="true">
<class name="Employee" table="employee">
<!-- 主键 ,映射-->
<id name="empId" column="id">
<generator class="uuid"/>
</id>
<property name="empName" column="empName" type="java.lang.String" length="20"></property>
<property name="workDate" type="java.util.Date"></property>
<!-- 如果列名称为数据库关键字,需要用反引号或改列名。 -->
<property name="desc" column="`desc`" type="java.lang.String"></property>
</class>
</hibernate-mapping>
2.1 hibernate-mapping 节点
<hibernate-mapping package="cn.itcast.c_hbm_config" auto-import="true">
</hibernate-mapping>
+++ package: 指定要映射的对象所在的包
(可选,如果不指定,此文件所有的类都要指定全路径)
1.指定映射文件所在的包。配置class的name时,不用指定完整路径了。
<hibernate-mapping package="org.jsoft.demo">
<class name="UserEntity" table="USER">
<id name="id" column="u_id" ></id>
<property name="name" column="u_name"></property>
<property name="birth" column="u_birth"></property>
</class>
</hibernate-mapping>
2.不指定映射文件所在的包。配置class的name时,就需要执行完整路径。
<hibernate-mapping >
<class name="org.jsoft.demoUserEntity" table="USER">
<id name="id" column="u_id" ></id>
<property name="name" column="u_name"></property>
<property name="birth" column="u_birth"></property>
</class>
</hibernate-mapping>
+++ auto-import 默认为true, 在写hql的时候自动导入包名。
如果指定为false, 再写hql的时候必须要写上类的全名;
如:session.createQuery("from cn.itcast.c_hbm_config.Employee").list();
1.2 class 节点
<class name="Employee" table="employee">
</class>
+++ name 要映射的类名。
如果package设置了基础包,则name只需设置简单类名。
如果package没有设置基础包,则name需设置完整类名。
+++ table 表名。
如果没有指定表名,默认为与类名一致(小写)。
+++ hibernate-mapping节点下可以配置多个class节点。
即可以配置多个映射关系。
但是在实际开发中,一般一个映射文件配置一个映射。原因:便于维护。
1.3 property 节点
<property name="empName" column="empName" type="java.lang.String" length="20"></property>
+++ name 指定对象的属性名称
+++ column 指定表的字段的名称。
如果不指定,默认为与属性名一致
+++ type 指定表的字段的类型。
如果不指定,会匹配属性的类型
类型分类:
java类型: 必须写全名(推荐使用)
hibernate类型:直接写类型,都是小写
+++ length 指定字符的长度,默认为255
<property name="empName" column="empName" type="java.lang.String" length="20"></property>
+++ 如果设置表的字段名出现关键字时,可以添加转义字符。
<!-- 如果列名称为数据库关键字,需要用反引号或改列名。 -->
<property name="desc" column="`desc`" type="java.lang.String"></property>
三、字段映射
<property name="desc" column="`desc`" type="java.lang.String"></property>
3.1 主键映射
3.2 Hibernate3映射数据类型
1. 在实际开发中需要在hbm文件中使用的type属性值是指定的类型。那
么指定的类型一般的是基于hibernate的类型。
2. 当然在实际过程中也可以在hbm文件中指定java类型。
typename 可以是如下几种:
1.Hibernate 基本类型名
(比如:integer, string, character,date,
timestamp, float, binary, serializable, object, blob)。
2.一个 Java 类的名字,这个类属于一种默认基础类型
(比如:int, float,char, java.lang.String, java.util.Date,
java.lang.Integer, java.sql.Clob)。
3.一个可以序列化的 Java 类的名字。
4.一个自定义类型的类的名字。(比如:com.illflow.type.MyCustomType)。
如果你没有指定类型,Hibernarte 会使用反射来得到这个名字的属性,
以此来猜测正确的 Hibernate 类型。
3.2 特殊含义字段转义
<property name="desc" column="`desc`" type="java.lang.String"></property>
desc在数据库中是关键字,所以不能直接当做字段名,所以需要转义。