007---Hibernate基本映射标签和属性介绍(三)

五、<property>标签

用于映射普通属性到表字段

<property>元素为类定义了一个持久化的,JavaBean风格的属性。

<property

        name="propertyName"                                          (1)

        column="column_name"                                         (2)

        type="typename"                                              (3)

        update="true|false"                                          (4)

        insert="true|false"                                          (4)

        formula="arbitrary SQL expression"                           (5)

        access="field|property|ClassName"                            (6)

        lazy="true|false"                                            (7)

        unique="true|false"                                          (8)

        not-null="true|false"                                        (9)

        optimistic-lock="true|false"                                 (10)

        generated="never|insert|always"                              (11)

        node="element-name|@attribute-name|element/@attribute|."

 

        index="index_name"

        unique_key="unique_key_id"

        length="L"

        precision="P"

        scale="S"

/>

(1) name: 实体类属性的名字,以小写字母开头。

(2) column (可选 - 默认为属性名字): 对应的数据库字段名。 也可以通过嵌套的<column>元素指定。(如果省略则使用,则使用name所指定的名称为字段名)

(3) type (可选): 一个Hibernate类型的名字(省略则使用hibernate默认类型),也可以自己配置其它hbernate类型(integer, long, short, float, double, character, byte, boolean, yes_no, true_false)

(4) update, insert (可选 - 默认为 true) : 表明用于UPDATE / INSERT SQL语句中是否包含这个被映射了的字段。这二者如果都设置为false 则表明这是一个外源性(derived的属性,它的值来源于映射到同一个(或多个) 字段的某些其他属性,或者通过一个trigger(触发器)或其他程序生成。

(5) formula (可选): 一个SQL表达式,定义了这个计算 computed 属性的值。计算属性没有和它对应的数据库字段。

(6) access (可选 - 默认值为 property): Hibernate用来访问属性值的策略。

(7) lazy (可选 - 默认为 false): 指定 指定实例变量第一次被访问时,这个属性是否延迟抓取(fetched lazily)( 需要运行时字节码增强)。

(8) unique (可选): 使用DDL为该字段添加唯一的约束 同样,允许它作为property-ref引用的目标。

(9) not-null (可选): 使用DDL为该字段添加可否为空nullability)的约束。

(9) length(可选):typevarchar时,设置字段长度

(10) optimistic-lock (可选 - 默认为 true): 指定这个属性在做更新时是否需要获得乐观锁定(optimistic lock)。 换句话说,它决定这个属性发生脏数据时版本(version)的值是否增长。

(11) generated (可选 - 默认为 never): 表明此属性值是否实际上是由数据库生成的。请参阅 5.6 数据库生成属性(Generated Properties的讨论。

typename可以是如下几种:

Hibernate基本类型名(比如:integer, string, character,date, timestamp, float, binary, serializable, object, blob)。

一个Java类的名字,这个类属于一种默认基础类型 (比如: int, float,char, java.lang.String, java.util.Date, java.lang.Integer, java.sql.Clob)

一个可以序列化的Java类的名字。

一个自定义类型的类的名字。(比如: com.illflow.type.MyCustomType)

如果你没有指定类型,Hibernarte会使用反射来得到这个名字的属性,以此来猜测正确的Hibernate类型。 Hibernate会按照规则2,3,4的顺序对属性读取器(getter方法)的返回类进行解释。然而,这还不够。 在某些情况下你仍然需要type属性。(比如,为了区别Hibernate.DATE Hibernate.TIMESTAMP,或者为了指定一个自定义类型。)

access属性用来让你控制Hibernate如何在运行时访问属性。在默认情况下, Hibernate会使用属性的get/set方法对(pair)。如果你指明access="field", Hibernate会忽略get/set方法对,直接使用反射来访问成员变量。你也可以指定你自己的策略, 这就需要你自己实现org.hibernate.property.PropertyAccessor接口, 再在access中设置你自定义策略类的名字。

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

<property name="totalPrice"

    formula="( SELECT SUM (li.quantity*p.price) FROM LineItem li, Product p

                WHERE li.productId = p.productId

                AND li.customerId = customerId

                AND li.orderNumber = orderNumber )"/>

注意,你可以使用实体自己的表,而不用为这个特别的列定义别名( 上面例子中的customerId)。同时注意,如果你不喜欢使用属性, 你可以使用嵌套的<formula>映射元素。

注意:如果实体类和实体类中的属性和SQL中的关键重复,必须采用tablecolumn重新命名。

 

六、完整实例:

映射文件完整代码如下:

<?xml version="1.0"?>

<!DOCTYPE hibernate-mapping PUBLIC

    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"

    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>

    <!--

        class标签 实体类映射到数据表

        * name属性:实体类的完整路径

        * table属性:实体类映射到数据库中的表名,如果省略,则为实体类的类名称

    -->

    <class name="com.wjt276.hibernate.User1">

        <!-- 映射数据库主键 映射到数据表中的字段名默认为类属性名,但可以利用column重新指定-->

        <id name="id" column="id">

            <!-- generator设置主键生成策略    uuid:一万年内生成唯一的字符串 -->

            <generator class="uuid"/>

        </id>

        <!--

            property 映射普通属性  映射到数据表中的字段名默认为类属性名,但可以利用column重新指定

            nuique:唯一约束;

            not-null:非空约束

            length:字段长度

        -->

        <property name="name" unique="true" not-null="true" length="20"/>

        <property name="password" not-null="true" length="10"/>

        <property name="createTime"/><!--Hibernate会自动根据实体类属性类型生成数据库表中字段类型 -->

        <property name="expireTime"/>

    </class>

</hibernate-mapping>

 

 

利用org.hibernate.tool.hbm2ddl.SchemaExport工具类生成如下HQL语句和数据表:

 

create table User1 (id varchar(255) not null, name varchar(20) not null unique, password varchar(10) not null, createTime datetime, expireTime datetime, primary key (id))

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值