`
wjt276
  • 浏览: 650523 次
  • 性别: Icon_minigender_1
  • 来自: 合肥
社区版块
存档分类
最新评论

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

阅读更多

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

    (19) rowid (可选): Hibernate可以使用数据库支持的所谓的ROWIDs,例如: Oracle数据库,如果你设置这个可选的rowid Hibernate可以使用额外的字段rowid实现快速更新。ROWID是这个功能实现的重点, 它代表了一个存储元组(tuple)的物理位置。

    (20) subselect (可选): 它将一个不可变(immutable)并且只读的实体映射到一个数据库的 子查询中。当你想用视图代替一张基本表的时候,这是有用的,但最好不要这样做。更多的介绍请看下面内容。

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

若指明的持久化类实际上是一个接口,这也是完全可以接受的。 之后你可以用元素<subclass>来指定该接口的实际实现类。 你可以持久化任何static(静态的)内部类。 你应该使用标准的类名格式来指定类名,比如:Foo$Bar

不可变类,mutable="false"不可以被应用程序更新或者删除。 这可以让Hibernate做一些小小的性能优化。

 

可选的proxy属性允许延迟加载类的持久化实例。 Hibernate开始会返回实现了这个命名接口的CGLIB代理。当代理的某个方法被实际调用的时候, 真实的持久化对象才会被装载。参见下面的“用于延迟装载的代理”。

Implicit (隐式)的多态是指,如果查询时给出的是任何超类、该类实现的接口或者该类的 名字,都会返回这个类的实例;如果查询中给出的是子类的名字,则会返回子类的实例。 Explicit (显式)的多态是指,只有在查询时给出明确的该类名字时才会返回这个类的实例; 同时只有在这个<class>的定义中作为<subclass> 或者<joined-subclass>出现的子类,才会可能返回。 在大多数情况下,默认的polymorphism="implicit"都是合适的。 显式的多态在有两个不同的类映射到同一个表的时候很有用。(允许一个“轻型”的类,只包含部分表字段)。

persister属性可以让你定制这个类使用的持久化策略。 你可以指定你自己实现 org.hibernate.persister.EntityPersister的子类,你甚至可以完全从头开始编写一个 org.hibernate.persister.ClassPersister接口的实现, 比如是用储存过程调用、序列化到文件或者LDAP数据库来实现。 参阅org.hibernate.test.CustomPersister,这是一个简单的例子 (“持久化”到一个Hashtable)。

请注意dynamic-updatedynamic-insert的设置并不会继承到子类, 所以在<subclass>或者<joined-subclass>元素中可能 需要再次设置。这些设置是否能够提高效率要视情形而定。请用你的智慧决定是否使用。

使用select-before-update通常会降低性能。如果你重新连接一个脱管(detache)对象实例 到一个Session中时,它可以防止数据库不必要的触发update 这就很有用了。

如果你打开了dynamic-update,你可以选择几种乐观锁定的策略:

·                                 version(版本检查) 检查version/timestamp字段

·                                 all(全部) 检查全部字段

·                                 dirty(脏检查)只检察修改过的字段

·                                 none(不检查)不使用乐观锁定

我们非常强烈建议你在Hibernate中使用version/timestamp字段来进行乐观锁定。 对性能来说,这是最好的选择,并且这也是唯一能够处理在session外进行操作的策略(例如: 在使用Session.merge()的时候)。

Hibernate映射来说视图和表是没有区别的,这是因为它们在数据层都是透明的( 注意:一些数据库不支持视图属性,特别是更新的时候)。有时你想使用视图,但却不能在数据库 中创建它(例如:在遗留的schema中)。这样的话,你可以映射一个不可变的(immutable)并且是 只读的实体到一个给定的SQL子查询表达式:

<class name="Summary">
    <subselect>
        select item.name, max(bid.amount), count(*)
        from item
        join bid on bid.item_id = item.id
        group by item.name
    </subselect>
    <synchronize table="item"/>
    <synchronize table="bid"/>
    <id name="name"/>
    ...
</class>

定义这个实体用到的表为同步(synchronize),确保自动刷新(auto-flush)正确执行, 并且依赖原实体的查询不会返回过期数据。<subselect>在属性元素 和一个嵌套映射元素中都可见。

四、<id>标签

<id>标签必须配置在<class>标签内第一个位置。由一个字段构成主键,如果是复杂主键<composite-id>标签

被映射的类必须定义对应数据库表主键字段。大多数类有一个JavaBeans风格的属性, 为每一个实例包含唯一的标识。<id> 元素定义了该属性到数据库表主键字段的映射。

<id

        name="propertyName"                                          (1)

        type="typename"                                              (2)

        column="column_name"                                         (3)

        unsaved-value="null|any|none|undefined|id_value"             (4)

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

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

 

        <generator class="generatorClass"/>

</id>

(1) name (可选): 标识属性的名字(实体类的属性)

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

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

(3) column (可选 - 默认为属性名): 主键字段的名字(省略则取name为字段名)

(4) unsaved-value (可选 - 默认为一个切合实际(sensible)的值): 一个特定的标识属性值,用来标志该实例是刚刚创建的,尚未保存。 这可以把这种实例和从以前的session中装载过(可能又做过修改--译者注) 但未再次持久化的实例区分开来。

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

如果 name属性不存在,会认为这个类没有标识属性。

unsaved-value 属性在Hibernate3中几乎不再需要。

还有一个另外的<composite-id>定义可以访问旧式的多主键数据。 我们强烈不建议使用这种方式。

()<generator>元素(主键生成策略)

 

主键生成策略是必须配置

用来为该持久化类的实例生成唯一的标识。如果这个生成器实例需要某些配置值或者初始化参数, <param>元素来传递。

<id name="id" type="long" column="cat_id">

        <generator class="org.hibernate.id.TableHiLoGenerator">

                <param name="table">uid_table</param>

                <param name="column">next_hi_value_column</param>

        </generator>

</id>

所有的生成器都实现org.hibernate.id.IdentifierGenerator接口。 这是一个非常简单的接口;某些应用程序可以选择提供他们自己特定的实现。当然, Hibernate提供了很多内置的实现。下面是一些内置生成器的快捷名字:

increment

用于为long, short或者int类型生成 唯一标识。只有在没有其他进程往同一张表中插入数据时才能使用。 在集群下不要使用。

identity

DB2,MySQL, MS SQL Server, SybaseHypersonicSQL的内置标识字段提供支持。 返回的标识符是long, short 或者int类型的。 (数据库自增)

sequence

DB2,PostgreSQL, Oracle, SAP DB, McKoi中使用序列(sequence) 而在Interbase中使用生成器(generator)。返回的标识符是long, short或者 int类型的。(数据库自增)

hilo

使用一个高/低位算法高效的生成long, short 或者 int类型的标识符。给定一个表和字段(默认分别是 hibernate_unique_key next_hi)作为高位值的来源。 /低位算法生成的标识符只在一个特定的数据库中是唯一的。

seqhilo

使用一个高/低位算法来高效的生成long, short 或者 int类型的标识符,给定一个数据库序列(sequence)的名字。

uuid

用一个128-bitUUID算法生成字符串类型的标识符, 这在一个网络中是唯一的(使用了IP地址)。UUID被编码为一个3216进制数字的字符串,它的生成是由hibernate生成,一般不会重复。

UUID包含:IP地址,JVM的启动时间(精确到1/4秒),系统时间和一个计数器值(在JVM中唯一)。 Java代码中不可能获得MAC地址或者内存地址,所以这已经是我们在不使用JNI的前提下的能做的最好实现了

guid

MS SQL Server MySQL 中使用数据库生成的GUID字符串。

native

根据底层数据库的能力选择identity, sequence 或者hilo中的一个。(数据库自增)

assigned

让应用程序在save()之前为对象分配一个标示符。这是 <generator>元素没有指定时的默认生成策略。(如果是手动分配,则需要设置此配置)

select

通过数据库触发器选择一些唯一主键的行并返回主键值来分配一个主键。

foreign

使用另外一个相关联的对象的标识符。通常和<one-to-one>联合起来使用。

分享到:
评论

相关推荐

    hibernate实体映射文件字段设置默认值

    首先,我们需要了解一个基本的Hibernate映射文件结构: ```xml &lt;hibernate-mapping&gt; &lt;class name="com.bulletin.bean.Bulletin" table="BULLETIN" schema="XJL" dynamic-insert="true" dynamic-update="true"&gt; &lt;!...

    hibernate map 集合映射

    在Java的持久化框架Hibernate中,集合映射是将数据库中的表关系映射到对象的集合属性上,以便更好地管理和操作数据。这篇文章将深入探讨Hibernate中的集合映射机制,包括其基本概念、类型以及如何在实际开发中进行...

    Hibernate学习笔记特别详细

    007---Hibernate映射标签和属性 - `&lt;generator&gt;`元素:用于定义主键生成策略,如increment、sequence、identity等。 - `&lt;property&gt;`标签:用于映射类的普通属性,包含name、type、column等属性。 例如,一个简单的...

    [原]Hibernate集合映射

    在Hibernate配置文件中,我们通过`&lt;element&gt;`标签来指定元素的类型和字段映射。例如,如果集合元素是基本类型,我们可以直接映射;如果是复杂类型的对象,就需要指定对应的实体类。 3. **一对一(One-to-One)映射*...

    J2EE电子商务系统开发从入门到精通--基于Struts和Hibernate技术实现

    ### J2EE电子商务系统开发从入门...以上内容详细介绍了如何使用J2EE、Struts和Hibernate技术开发一个电子商务系统的过程,包括理论知识、实践步骤等方面的内容。希望这些知识点能够帮助读者更好地理解和掌握这些技术。

    hibernate array 数组映射

    在Hibernate中,数组映射是将数据库表的一列或多列数据映射到Java对象的一个数组属性上。数组可以是基本类型数组或对象类型的数组。这种映射方式简化了数据访问,并提高了代码的可读性和可维护性。 ### 配置数组...

    Myeclipse生成Hibernate映射文件

    本文将详细介绍如何在MyEclipse中创建和使用Hibernate映射文件。 首先,理解Hibernate映射文件(.hbm.xml)的作用。这些文件是XML文档,它们定义了数据库表与Java类之间的映射关系,包括字段对应、主键设置、关联...

    hibernate映射篇

    Hibernate是Java领域中一款强大的对象关系映射框架,它允许开发者用面向对象的...通过理解并熟练应用多对一、一对一和一对多映射,以及级联操作和事务隔离级别,我们可以更好地利用Hibernate提升Java应用的开发效率。

    Hibernate映射配置实例大全(详细总结)

    综上所述,"Hibernate映射配置实例大全"涵盖的内容广泛,包括基本的配置文件设置、实体类的XML和注解映射、集合映射、加载策略、事务管理和缓存配置等。通过深入学习和实践这些实例,开发者可以熟练地运用Hibernate...

    Hibernate关系映射

    "多对一"关系映射是Hibernate支持的四种基本关联类型之一,包括一对一、一对多、多对一和多对多。本篇将深入探讨“多对一”关系映射的概念、配置以及在实际web系统中的应用。 **一、“多对一”关系映射概念** 在...

    J2EE电子商务系统从入门到精通--基于Struts和Hibernate技术实现.

    - **3.3.1 基本配置**:这部分介绍了Hibernate的基本配置文件及其设置项。 - **3.3.2 连接池配置**:这部分讲解了如何配置连接池以提高性能。 - **3.3.3 数据源配置**:这部分指导如何配置数据源,以便更好地管理...

    Hibernate one-to-many / many-to-one关系映射

    "Hibernate one-to-many / many-to-one关系映射"是两个基本的关系类型,用于表示实体间的关联。在这个主题中,我们将深入探讨这两种关系映射的原理、配置和实际应用。 一、一对一(one-to-one)与一对多(one-to-...

    hibernate组建映射代码

    在这个映射文件中,`&lt;class&gt;`标签定义了实体类与数据库表的对应关系,`name`属性是实体类的全限定名,`table`属性是数据库中的表名。`&lt;id&gt;`标签表示主键,`name`属性是实体类中的属性名,`column`属性是数据库表中的...

    hibernate的映射文件配置

    描述:本文深入解析了Hibernate映射文件配置的核心概念,重点阐述了映射文件的基本结构及其组成部分,包括主键(id)、普通属性(property)等关键元素的配置方法和策略。 ### Hibernate映射文件配置详解 在...

    hibernate关系映射网址

    通过本文的介绍,我们不仅了解了Hibernate关系映射的基本概念和常用标签,还深入探讨了几种常见的关系类型及其映射方法。理解并熟练掌握这些知识将极大地帮助开发人员利用Hibernate进行高效的数据持久化操作。在未来...

    Hibernate 映射文件自动生成

    【压缩包子文件的文件名称列表】:“hibernate映射文件自动生成.doc”很可能是这篇博文的文档形式,其中详细介绍了具体的操作步骤、使用工具或者自定义脚本,以帮助开发者理解并应用自动化的映射文件生成过程。...

Global site tag (gtag.js) - Google Analytics