Hibernate映射文件详解

类名.hbm.xml 关系映射配置文件

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2018-4-4 16:22:30 by Hibernate Tools 3.5.0.Final -->

<!--
package:简化配置作用,把包名直接写到package里面,那么以后hibernate-mapping里面有多个在相同包下的类的name就可以直接写类名了
-->
<hibernate-mapping package="pers.domain">
    <!--
    class下参数:
    name:类名
    table:数据表名
    dynamic-insert:若设置为 true, 表示当保存一个对象时, 会动态生成 insert 语句, insert 语句中仅包含所
    取值不为 null 的字段. 默认值为 false
    dynamic-update: 若设置为 true, 表示当更新一个对象时, 会动态生成 update 语句, update 语句中仅包含所有取值需要更新的字段. 默认值为 false
    select-before-update:设置 Hibernate 在更新某个持久化对象之前是否需要先执行一次查询. 默认值为 false(对游离对象操作时候有用,如果游离对象跟数据库的数据一样就执行update,反之不执行,因为都会执行一次select,所以会降低效率)
    -->
    <class name="User" table="USER" dynamic-update="true">
        <!--
        id标签
        name:持久化类的属性名
        type:属性类型

        column:指定主键的列名
        generator:标识符生成器,指定如何生成主键(主键应该不具备业务含义的,代理主键通常是整型,这样节省空间)

        unsaved-value:若设定了该属性, Hibernate 会通过比较持久化类的 OID 值和该属性值来区分当前持久化类的对象是否为临时对象(就是,如果对象的主键值跟unsaved-value的值一样,hibernate就会认为这个对象是临时对象,执行saveOrUpdate()的时候会直接执行save()操作),默认false

        -->
        <id name="id" type="java.lang.Integer">
            <column name="ID" />
            <!--
            generator标签
            class:用class指定生成主键的方式,一般用native
                 increment:由hibernate以递增方式为代理主键赋值(读取数据表,找到最大的主键值,插入数据时,将之前获取到的最大主键值数+1,赋值给代理主键)
                    适用范围:适用于所有数据库,但因为并发问题,所以只用于单个进程情况,比如测试
                 identity:由底层数据库负责生成,则底层数据库要支持自增字段类型,所以Oracle不能用这个,而且主键类型只能是long、int、short类型
                    适用范围:所以支持自增的数据库 如:DB2、MySQL
                 sequence:由底层数据库提供的序列生成主键,所以数据库要支持序列,而且主键类型只能是long、int、short类型
                    适用范围:所以支持序列的数据库 如:DB2、Oracle
                    写法:<generator class="sequence">可以自定义</generator>
                 hilo:按照hibernate高低算法生成主键,不依赖任何底层数据库,但是主键类型只能是long、int、short类型,不会出现并发问题
                    适用范围:适用所有数据库
                    逻辑:hibernate会生成一个hibernate_unique_key的表,然后找里面next_hi这个字段的值,最后生成出来一个整型的值,用于生成主键
                 native:根据底层数据库对自动生成主键的支持能力来选择identity、sequence、hilo
                    适用范围:适合跨数据库平台开发使用,但是主键类型只能是long、int、short类型
            -->
            <generator class="native" />
        </id>
        <!--
        property标签
        name:属性名
        type:属性类型, 如果没有为某个属性显式设定映射类型, Hibernate 会运用反射机制先识别出持久化类的特定属性的 Java 类型, 然后自动使用与之对应的默认的 Hibernate 映射类型
                如:<property name="name" type="java.lang.String"> 可以写成 <property name="name" type="string">
        column->name:字段名,这里的column可以写到property标签里面
                如:<property name="name" type="java.lang.String" column="NAME">
        access:指定 Hibernate 的默认的属性访问策略。默认值为 property, 即使用 getter, setter 方法来访问属性. 若指定 field, 则 Hibernate 会忽略 getter/setter 方法, 而通过反射访问成员变量
        unique: 设置是否为该属性所映射的数据列添加唯一约束
        index: 指定一个字符串的索引名称
        update:列的值能否被修改,默认true,哪个property里面加了这个,那么这个字段的值就不能被修改了
        length: 指定该属性所映射数据列的字段的长度
        formula:设置一个 SQL 表达式, Hibernate 将根据它来计算出派生属性的值(持久化类的有些属性的值必须在运行时通过计算才能得出来, 这种属性称为派生属性),就是写一个自定义内容到sql语句里面,这个自定义内容就是方便写子sql语句
                如:<property name="TestFormula" formula="xxxx">
        scale: 指定该属性所映射数据列的小数位数, 对 double, float, decimal 等类型的数据列有效
        -->
        <property name="name" type="java.lang.String">
            <column name="NAME" />
        </property>
        <property name="pswd" type="java.lang.String">
            <column name="PSWD" />
        </property>
        <property name="description" type="java.lang.String">
            <column name="DESCRIPTION" />
        </property>
        <!--
        时间日期类型:
            1、因为java.util.Date是java.sql.Date、java.sql.Time、java.sql.Timestamp的父类,而这三个分类对应标准SQL中的DATE, TIME 和 TIMESTAMP类型
            所以在持久化类中,日期参数一定要import java.util.Date,而映射文件中property标签的type就可以是java.util.Date、date、time、timestamp
            2、要注意的是:这里的date、time、timestamp不是java或者标准sql的类型,是hibernate的类型
        -->
        <property name="date" type="java.util.Date">
            <column name="DATE" />
        </property>
        <!--
        长文本类型:
            1、这里长文本用clob这个hibernate映射类型,这个clob就是java.sql.Clob对应的hebernate类型
            2、如果需要精确指定数据库中的字段类型,可以在column中加上sql-type,这个属性的值写数据库的类型名
        -->
        <property name="content">
            <column name="CONTENT" sql-type="MEDIUMTEXT"/>
        </property>
        <property name="image">
            <column name="IMAGE" sql-type="LONGBLOB"/>
        </property>

         <!--
        映射组成关系
        1、component的name是被映射关系模型的名字,class写被映射关系模型的类名
        2、要写parent,parent的name是域模型的名字,就是被映射关系模型里面定义的域模型的名字
        3、用property写被映射关系模型里面的参数和对应数据表要写的列名
        4、DetailInfo是Info类的组成部分,Hibernate里面称之为组件
        5、Info类(域模型)和DetailInfo类(被映射关系模型)都需要互相实例化,不然插入数据库会出现被映射关系模型的数据是null
        -->
        <component name="detailInfo" class="DetailInfo">
            <parent name="info"/>
            <!-- 指定组成关系的参数属性 -->
            <property name="firstName" type="java.lang.String" column="FIRSTNAME"></property>
            <property name="lastName" type="java.lang.String" column="LASTNAME"></property>
            <property name="age" type="java.lang.String" column="AGE"></property>
        </component>

    </class>
</hibernate-mapping>

hibernate、java、标准sql数据类型对照表

即映射文件中<property>标签中的 type 属性取值可以是Hibernate映射类型,也可以是java类型的全类名

  • 基本数据类型
Hibernate映射类型 Java类型 标准SQL字段类型
integer int or java.lang.Integer INTEGER
long long or java.lang.Long BIGINT
short short or java.lang.Short SMALLINT
float float or java.lang.Float FLOAT
double double or java.lang.Double DOUBLE
big_decimal java.math.BigDecimal NUMERIC
character java.lang.String CHAR(1)
string java.lang.String VARCHAR
byte byte or java.lang.Byte TINYINT
boolean boolean or java.lang.Boolean BIT
yes_no boolean or java.lang.Boolean CHAR(1('Y'or'N')
true_false boolean or java.lang.Boolean CHAR(1)('Y'or'N')
date java.util.Date or java.sql.Date DATE
time java.util.Date or java.sql.Time TIME
timestamp java.util.Date or java.sql.Timestamp TIMESTAMP
calendar java.util.Calendar TIMESTAMP
calendar_date java.util.Calendar DATE
  • 大数据类型
Hibernate映射类型 Java类型 标准SQL字段类型
binary byte[] VARBINARY(or BLOB)
text java.lang.String CLOB
serializable java.io.Serializable的任何实例 VARBINARY(or BLOB)
clob java.sql.Clob CLOB
blob java.sql.Blob BLOB
  • 其它数据类型
Hibernate映射类型 Java类型 标准SQL字段类型
class java.lang.Class VARCHAR
locale java.util.Locale VARCHAR
timezone java.util.TimeZone VARCHAR
currency java.util.Currency VARCHAR

参考

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,539评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,911评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,337评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,723评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,795评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,762评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,742评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,508评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,954评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,247评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,404评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,104评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,736评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,352评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,557评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,371评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,292评论 2 352

推荐阅读更多精彩内容