关系映射文件***.hbm.xml详解

关系映射文件***.hbm.xml详解

  (2012-10-27 09:57:44)
标签: 

关系映射文件

 

.hbm.xml

 

lazy

 

property

分类: Hibernate
下面是关系映射文件的部分:
简介版:
<hibernate-mapping package="entity">
    <class name="UserInfo">
        <id name="userId">
            <generator class="sequence"/>
        </id>
        <property name="userName"/>
        <property name="birthday"/>
    </class>
</hibernate-mapping>

较全面版:
 

<hibernate-mapping package="entity" >
   <class name="UserInfo" schema="HOTEL"><!--只有数据库名为HOTEL才可以使用此文件-->
        <id name="userId"
  type="java.lang.Integer">
            <!--为int类型的数据库字段指定精度和scale-->
            <column name="userid" precision="10" scale="0" />
            <generator class="sequence
">
                <param name="sequence
">S_STA</param>
            </generator><!--为每张表生成自己的序列,而非共用一个-->
        </id>
        <property name="userName" type="java.lang.String">
        <column name="username" length="20" />
        </property>
        <property name="birthday"/>
    </class>
</hibernate-mapping>

 1、ID详解
 <id name="propertyName" type="typename" column="column_name" access="field|property|ClassName">
    <generator class="generatorClass"/>
</id>

name (可选): 标识属性的名字。
type (可选): 标识Hibernate类型的名字。
column (可选 - 默认为属性名): 主键字段的名字。
access (可选 - 默认为property): Hibernate用来访问属性值的策略,property是访问实体类中的属性。

2、主键生成器

 常用的主键生成器如下图:

关系映射文件***.hbm.xml详解

1)Increment标识符生成器
   HIbernate会以自增的方式生成标识符,事实上是在hibernate的初始化阶段读取将要操作的表中的最大的ID(select max(ID) from tableName),在向数据库中插入记录时再在此基础上递增。 这样就会存在并发的问题:如果同时有两个hibernate进程读取了这个最大值(假设为100),在向数据库中插入数据的时候都会想插入ID为101的记录,这样就违反了数据库的约束。这个问题只要是存在两个sessionFacotry就会发生,不能在集群下使用。
   优点:生成标识符的机制不依赖于底层数据库,适用于所有的数据库系统。


2)Identity标识符生成器

    identity标识符生成器由底层数据库来负责生成标识符,它要求底层数据库把主键定义为自动增长字段类型,比如在MySql中应为auto_increment,SQL Server中为identity。
    优缺点:必须依赖于底层数据库。
3)sequence标识符生成器
   
 sequence标识符生成器利用底层数据库提供的序列来生成标识符(需要在数据库中创建一个序列)。
   
  优缺点: 必须依赖于底层数据库,只适用于oracle数据库。
4)Native标识符生成器
   
 native标识符生成器依据底层数据库对自动生成标识符的支持能力,来选择适用identity,sequence,hilo标识符生成器。native能自动判读底层数据库提供的生成符机制,如果为MySQL和SQL Server为identity,如果数据库为Oracle则为sequence。
   
  优缺点:不 赖于底层数据库如果底层数据库是oracle,那么数据库中只会生产一个序列,数据库中所有的共用此序列。推荐使用!!!
5)assigned标识符生成器
     由程序指定OID。
6)uuid.hex:
  
  用一个128-bit的UUID算法生成字符串类型的标识符。使用了IP地址,JVM的启动时间(精确到1/4秒),系统时间和一个计数器值(在JVM中唯一)。用该算法生成的id可以确保在一个网络中唯一。
    
  优缺点:适用于多应用的环境,即使在多实例并发的环境中也可以确保唯一。并且解决了多个数据库的部分数据合并。

3、Property配置
   <property name="propertyName"
column="column_name"
type="typename"
update="true|false"
insert="true|false"
formula="arbitrary SQL expression"
access="field|property|ClassName"
lazy="true|false"
unique="true|false"
not-null="true|false"
optimistic-lock="true|false"
generated="never|insert|always"
index="index_name"
unique_key="unique_key_id"
length="L"
precision="P" scale="S" />
其中:
name:
  属性的名字,以小写字母开头,即实体类中属性的名字 
column (可选 - 默认为属性名字): 对应的数据库字段名。
  也可以通过嵌套的<column>元素指定。 
type (可选):
  一个Hibernate类型的名字
update, insert (可选 - 默认为 true) :
  表明用于UPDATE 和/或 INSERT 的SQL语句中是否包含这个被映射了的字段。这二者如果都设置为false 则表明这是一个“外源性 (derived)”的 属性,它的值来源于映射到同一个(或多个) 字段的某些其他属性,或者通过一个trigger(触发器)或其他程序生成。 
formula (可选):
  一个SQL表达式,定义了这个计算 (computed) 属性的值。计算属性没有和它对应的数据库字段。 
access (可选 - 默认值为 property):
  Hibernate用来访问属性值的策略。 
lazy (可选 - 默认为 false):
  指定 指定实例变量第一次被访问时,这个属性是否延迟抓取(fetched lazily)( 需要运行时字节码增强)。 
unique (可选):
  使用DDL为该字段添加唯一的约束。 同样,允许它作为property-ref引用的目标。 
not-null (可选):
  使用DDL为该字段添加可否为空(nullability)的约束。 
optimistic-lock (可选 - 默认为 true):
  指定这个属性在做更新时是否需要获得乐观锁定(optimistic lock)。 换句话说,它决定这个属性发生脏数据时版本(version)的值是否增长。 
generated (可选 - 默认为 never):
  表明此属性值是否实际上是由数据库生成的

附、Oracle使用标准、可变长度的内部格式来存储数字。这个内部格式精度可以高达38位。

    NUMBER数据类型可以有两个限定符,如:

    column NUMBER ( precision, scale)

    precision表示数字中的有效位。如果没有指定precision的话,Oracle将使用38作为精度。

    scale表示数字小数点右边的位数,scale默认设置为0.  如果把scale设成负数,Oracle将把该数字取舍到小数点左边的指定位数。



4、Hibernate数据类型映射

关系映射文件***.hbm.xml详解

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值