• Hibernate学习笔记--映射配置文件详解


    参考资料:

    http://blog.163.com/hzd_love/blog/static/13199988120108265317988/

    http://www.cnblogs.com/oftenlin/archive/2013/03/29/2989096.html

    Hibernate的持久化类和关系数据库之间的映射通常是用一个XML文档来定义的。该文档通过一系列XML元素的配置,来将持久化类与数据库表之间建立起一一映射。这意味着映射文档是按照持久化类的定义来创建的,而不是表的定义

    一、根元素:<hibernate-mapping>,每一个hbm.xml文件都有唯一的一个根元素,包含一些可选的属性

    1)package:指定一个包前缀,如果在映射文档中没有指定全限定的类名,就使用这个作为包名,如

    <hibernate-mapping package="com.demo.hibernate.beans">
        <class name="User" ...>
    </hibernate-mapping>

    <hibernate-mapping> <class name="com.demo.hibernate.beans.User" ...> </hibernate-mapping>

    2)schema:数据库schema的名称

    3)catalog:数据库catalog的名称

    4)default-cascade:默认的级联风格,默认为none

    5)default-access:Hibernate用来访问属性的策略

    6)default-lazy:指定了未明确注明lazy属性的Java属性和集合类,Hibernate会采取什么样的默认加载风格,默认为true

    7)auto-import:指定我们是否可以在查询语言中使用非全限定的类名,默认为true,如果项目中有两个同名的持久化类,则最好在这两个类的对应的映射文件中配置为false

    二、<class>定义类:根元素的子元素,用以定义一个持久化类与数据表的映射关系,如下是该元素包含的一些可选的属性

    1)name:持久化类(或者接口)的Java全限定名,如果这个属性不存在,则Hibernate将假定这是一个非POJO的实体映射

    2)table:对应数据库表名

    3)discriminator-value:默认和类名一样,一个用于区分不同的子类的值,在多态行为时使用

    4)mutable:表明该类的实例是可变的或者是不可变的

    5)schema:覆盖根元素<hibernate-mapping>中指定的schema名字

    6)catalog:覆盖根元素<hibernate-mapping>中指定的catalog名字

    7)proxy:指定一个接口,在延迟装载时作为代理使用

    8)dynamic-update:指定用于UPDATE的SQL将会在运行时动态生成,并且只更新那些改变过的字段

    9)dynamic-insert:指定用于INSERT的SQL将会在执行时动态生成,并且只包含那些非空值字段

    10)select-before-update:指定HIbernate除非确定对象真正被修改了(如果该值为true),否则不会执行SQL UPDATE操作。在特定场合(实际上,它只在一个瞬时对象关联到一个新的Session中时执行的update()中生效),这说明Hibernate会在UPDATE之前执行一次额外的SQL SELECT操作,来决定是否应该执行UPDATE

    11)polymorphism:多态,界定是隐式还是显式的多态查询

    12)where:指定定个附加的SQLWHERE条件,在抓取这个类的对象时会增加这个条件

    13)persister:指定一个定制的ClassPersister

    14)batch-size:指定一个用于根据标识符(identifier)抓取实例时使用的'batch size'(批次抓取数量)

    15)optimistic-lock:乐观锁定,决定乐观锁定的策略

    16)lazy:通过设置lazy="false",所有的延迟加载(Lazy fetching)功能将未被激活(disabled)

    17)entity-name

    18)check:这是一个SQL表达式,用于为自动生成的schema添加多行(multi-row)约束检查

    19)rowid

    20)subselect

    21)abstract:用于在<union-subclass>的继承结构(hierarchies)中标识抽象超类

     

    示例代码:

    <hibernate-mapping>
        <class name="com.hibernate.hql.Emp" table="EMP">
            <id name="eid" column="EID" type="java.lang.Integer">
                <generator class="increment" />
            </id>
            <property name="ename" column="ENAME" type="java.lang.String"/>
            <property name="eage" column="EAGE" type="java.lang.Integer"/>
            <property name="esal" column="ESAL" type="java.lang.Integer"/>
            <property name="did" column="DID" type="java.lang.Integer"/>
        </class>
    </hibernate-mapping>

    三、<id>定义主键:Hibernate使用OID(对象标识符)来标识对象的唯一性,OID是关系数据库中主键在Java对象模型中的等价物,在运行时,Hibernate根据OID来维持Java对象和数据库表中记录的对应关系

    1)name:持久化类的标识属性的名字

    2)type:标识Hibernate类型的名字

    3)column:数据库表的主键这段的名字

    4)unsaved-value:用来标志该实例是刚刚创建的,尚未保存。可以用来区分对象的状态

    5)access:Hibernate用来访问属性值的策略

    如果表使用联合主键,那么你可以映射类的多个属性为标识符属性。<composite-id>元素接受<key-property>属性映射和<key-many-to-one>属性映射作为子元素:

    以下定义了两个字段作为联合主键:

    <composite-id>
        <key-property name="username" />
        <key-property name="password" />
    </composite-id>

    四、<generator>设置主键生成方式

    该元素的作用是指定主键的生成器,通过一个class属性指定生成器对应的类。(通常与<id>元素结合使用)

    <id name="id" column="ID" type="integer">
        <generator class="native" />
    </id>
    native是Hibernate主键生成器的实现算法之一,由Hibernate根据底层数据库自行判断采用identity、hilo、sequence其中一种作为主键生成方式。

    Hibernate提供的内置生成器:

    1)assigned算法

    2)hilo算法

    3)seqhilo算法

    4)increment算法

    5)identity算法

    6)sequence算法

    7)native算法

    8)uuid.hex算法

    9)uuid.string算法

    10)foregin算法

    11)select算法

    主要是由generator子元素是指定主键生成策略,详细说明如下:
    <id name="id">
        <generator class="native"/>
    </id>
    
    <!-- identity,使用数据库的自动增长,在保存时会忽略手工指定的主键值而由数据库生成,要求此属性要是数字类型-->
          <generator class="identity"/>
    
    <!-- assigned,手工指定,比如指定UUID-->
          <generator class="assigned"/>
    
    <!-- uuid,由Hibernate生成UUID并指定为主键值,要求此属性要是String型-->
          <generator class="uuid"/>
    
    <!-- hilo,高低位生成主键,需要用到一个额外的表,所有的数据库都可以使用这种类型-->
          <generator class="hilo">
            <param name="table">hi_value</param>
            <param name="column">next_value</param>
            <param name="max_lo">100</param>
          </generator>
    
    <!-- native,根据底层数据库的能力选择 identity、sequence 或者 hilo 中的一个--> <generator class="native"/>

    五、<property>定义属性

    用于持久化类的属性与数据库表字段之间的映射,包含如下属性:

    1)name:持久化类的属性名,以小写字母开头

    2)column:数据库表的字段名

    3)type:Hibernate映射类型的名字

    4)update:表明用于UPDATE的SQL语句中是否包含这个被映射的字段,默认为true

    5)insert:表明用于INSERT的SQL语句中是否包含这个被映射是否包含这个被映射的字段,默认为true

    6)formula:一个SQL表达式,定义了这个计算属性的值

    7)access:Hibernate用来访问属性值的策略

    8)lazy:指定实例变量第一次被访问时,这个属性是否延迟抓取,默认为false

    9)unique:使用DDL为该字段添加唯一的约束,此外,这也可以用做property-ref的目标属性

    10)not-null:使用DDL为该字段添加可否为空的约束

    11)optimistic-lock:指定这个属性在进行更新时是否需要获得乐观锁定(换句话说,它决定这个属性发生脏数据时版本version的值是否增长)

    access属性用来让你控制Hibernate如何在运行时访问属性。默认情况下,Hibernate会使用属性的get/set方法对。如果你指明access="field",则Hibernate会忽略get/set方法对,直接使用反射来访问成员变量。

    formula属性是个特别强大的的特征。这些属性应该定义为只读,属性值在装载时计算生成。用一个SQL表达式生成计算的结果,它会在这个实例转载时翻译成一个SQL查询的SELECT子查询语句。如:

    <property name="totalPrice" formula="(SELECT SUM(*) FROM user)" />

  • 相关阅读:
    lucene 3.0.2 search 各种各样的Query类型
    lucene 3.0.2 中文分词
    java 文件读写
    java 从args[]中赋值和程序直接赋值不一样?
    java 中文转换成Unicode编码和Unicode编码转换成中文
    Java栈与堆一篇好文
    lucene 3.0.2 操作进阶
    Lucene实战(第2版)》
    java工程包的命名(-dev.jar,-javadoc.jar,jar)
    POJ 3304 Segments (线段和直线相交 + 思维)
  • 原文地址:https://www.cnblogs.com/gnivor/p/4439958.html
Copyright © 2020-2023  润新知