`
cuebsky
  • 浏览: 7677 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
最近访客 更多访客>>
社区版块
存档分类
最新评论

Hibernate基本映射标签和属性介绍(一)

阅读更多
<?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.User">
		<!-- 映射数据库主键 映射到数据表中的字段名默认为类属性名,但可以利用column重新指定-->
		<id name="id" column="id">
			<!-- generator设置主键生成策略
				uuid:一万年内生成唯一的字符串 
			-->
			<generator class="uuid"/>
		</id>
		<!-- property 映射普通属性  映射到数据表中的字段名默认为类属性名,但可以利用column重新指定-->
		<property name="name" column="name"/>
		<property name="password"/>
		<property name="createTime"/><!--Hibernate会自动根据实体类属性类型生成数据库表中字段类型 -->
		<property name="expireTime"/>
	</class>
</hibernate-mapping>

 

通常实体类需要映射成表,这个类与通常类不一样的。

实体类---->

实体类中的普通属性(基本Java数据类型)---表字段

使用<class>标签映射成数据库表,通过<property>标签将普通属性映射成数据表字段。

所有普通属性:不包括自定义类、集合和数组等的Java基本数据类型。

二、<hibernate-mapping>标签:

这个元素包括一些可选的属性。schemacatalog属性, 指明了这个映射所连接(refer)的表所在的schema/catalog名称。 假若指定了这个属性,表名会加上所指定的schemacatalog的名字扩展为全限定名。假若没有指定,表名就不会使用全限定名。 default-cascade指定了未明确注明cascade属性的Java属性和 集合类Hibernate会采取什么样的默认级联风格。auto-import属性默认让我们在查询语言中可以使用 非全限定名的类名。

<hibernate-mapping
         schema="schemaName"                          (1)
         catalog="catalogName"                        (2)
         default-cascade="cascade_style"              (3)
         default-access="field|property|ClassName"    (4)
         default-lazy="true|false"                    (5)
         auto-import="true|false"                     (6)
         package="package.name"                       (7)
 />

 

(1)  schema (可选): 数据库schema的名称。

(2)  catalog (可选): 数据库catalog的名称。

(3)  default-cascade (可选 - 默认为 none): 默认的级联风格。

(4)  default-access (可选 - 默认为 property): Hibernate用来访问所有属性的策略。可以通过实现PropertyAccessor接口 自定义。

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

(6)  auto-import (可选 - 默认为 true): 指定我们是否可以在查询语言中使用非全限定的类名(仅限于本映射文件中的类)。

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

假若你有两个持久化类,它们的非全限定名是一样的(就是两个类的名字一样,所在的包不一样--译者注), 你应该设置auto-import="false"。如果你把一个“import过”的名字同时对应两个类, Hibernate会抛出一个异常。

 

注意hibernate-mapping 元素允许你嵌套多个如上所示的 <class>映射。但是最好的做法(也许一些工具需要的)是一个 持久化类(或一个类的继承层次)对应一个映射文件,并以持久化的超类名称命名,例如: Cat.hbm.xml Dog.hbm.xml,或者如果使用继承,Animal.hbm.xml

三、<class>标签

你可以使用class元素来定义一个持久化类:

<class
        name="ClassName"                                       (1)
        table="tableName"                                        (2)
        discriminator-value="discriminator_value"     (3)
        mutable="true|false"                                     (4)
        schema="owner"                                           (5)
        catalog="catalog"                                          (6)
        proxy="ProxyInterface"                                 (7)
        dynamic-update="true|false"                        (8)
        dynamic-insert="true|false"                          (9)
        select-before-update="true|false"               (10)
        polymorphism="implicit|explicit"                   (11)
        where="arbitrary sql where condition"        (12)
        persister="PersisterClass"                           (13)
        batch-size="N"                                             (14)
        optimistic-lock="none|version|dirty|all"        (15)
        lazy="true|false"                                          (16)
        entity-name="EntityName"                           (17)
        check="arbitrary sql check condition"           (18)
        rowid="rowid"                                              (19)
        subselect="SQL expression"                        (20)
        abstract="true|false"                                   (21)
        node="element-name"
/>

  (1)   name (可选): 持久化类(或者接口)的Java全限定名。 如果这个属性不存在,Hibernate将假定这是一个非POJO的实体映射。
  (2)   table (可选 - 默认是类的非全限定名): 对应的数据库表名,生成DDL时数据表名,如果省略,则名称同持久化类名称。
  (3)   discriminator-value (可选 - 默认和类名一样): 一个用于区分不同的子类的值,在多态行为时使用。它可以接受的值包括 null 和 not null。
  (4)   mutable (可选,默认值为true): 表明该类的实例是可变的或者不可变的。
  (5)   schema (可选): 覆盖在根<hibernate-mapping>元素中指定的schema名字。
  (6)   catalog (可选): 覆盖在根<hibernate-mapping>元素中指定的catalog名字。
  (7)   proxy (可选): 指定一个接口,在延迟装载时作为代理使用。 你可以在这里使用该类自己的名字。
  (8)   dynamic-update (可选, 默认为 false): 指定用于UPDATE 的SQL将会在运行时动态生成,并且只更新那些改变过的字段(只更新修改的字段,没有修改的字段不进行更新)。
  (9)   dynamic-insert (可选, 默认为 false): 指定用于INSERT的 SQL 将会在运行时动态生成,并且只包含那些非空值字段(在添加记录时,只添加非null的字段)。
  (10)  select-before-update (可选, 默认为 false): 指定Hibernate除非确定对象真正被修改了(如果该值为true-译注),否则不会执行SQL UPDATE操作。在特定场合(实际上,它只在一个瞬时对象(transient object)关联到一个 新的session中时执行的update()中生效),这说明Hibernate会在UPDATE 之前执行一次额外的SQL SELECT操作,来决定是否应该执行 UPDATE。
  (11)  polymorphism(多态) (可选, 默认值为 implicit (隐式) ): 界定是隐式还是显式的使用多态查询(这只在Hibernate的具体表继承策略中用到-译注)。
  (12)  where (可选) 指定一个附加的SQLWHERE 条件, 在抓取这个类的对象时会一直增加这个条件。
  (13)  persister (可选): 指定一个定制的ClassPersister。
  (14)  batch-size (可选,默认是1) 指定一个用于 根据标识符(identifier)抓取实例时使用的"batch size"(批次抓取数量)。
  (15)  optimistic-lock(乐观锁定) (可选,默认是version): 决定乐观锁定的策略。
  (16)  lazy (可选): 通过设置lazy="false", 所有的延迟加载(Lazy fetching)功能将被全部禁用(disabled)。 
  (17)  entity-name (可选,默认为类名): Hibernate3允许一个类进行多次映射( 前提是映射到不同的表),并且允许使用Maps或XML代替Java层次的实体映射 (也就是实现动态领域模型,不用写持久化类-译注)。 

   (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>在属性元素 和一个嵌套映射元素中都可见。

分享到:
评论

相关推荐

    Hibernate学习笔记

    007 Hibernate 基本映射标签和属性介绍 008 多对一 关联映射 009 一对一 主键关联映射_单向 010 一对一 主键关联映射_双向 011 一对一 唯一外键关联映射_单向 012 一对一 唯一外键关联映射_双向 013 session_flush ...

    hibernate复合主键映射

    复合主键映射 &lt;br&gt;通常将复合主键相关属性,单独抽取出来,建立一个独立的类 * 必须实现序列化接口 * 必须实现equals和hashcode方法 采用标签进行映射,其它属性采用正常映射

    Hibernate中文API大全

    以下是这个例子的Hibernate映射文件: &lt;component name="Name" class="eg.Name"&gt; &lt;!-- class attribute optional --&gt; 人员(Person)表中将包括pid, birthday, initial, first和 last等字段...

    Hibernate框架介绍以及入门 【二】Hibernate的常见配置

    Hibernate框架介绍以及入门 【二】 ...二、关于hibernate映射的配置 映射 1、【class标签的配置】 这个标签是来建立类与表(数据库)的映射关系 属性: name:类的一个全路径 table: 表名(类名如果和表名一致那么table可

    hibernate多对多双向关联

    多对多双向关联 &lt;br&gt;注意映射规则: &lt;set name="roles" table="t_user_role"&gt;&lt;br&gt; &lt;key column="userid"/&gt;&lt;br&gt; &lt;many-to-many class="com.bjsxt.hibernate.Role" column="roleid"/&gt; &lt;/set&gt;&lt;br&gt; table...

    低清版 大型门户网站是这样炼成的.pdf

    4.3.1 hibernate的基本映射数据类型 212 4.3.2 hibernate的主键映射 218 4.3.3 hibernate的实体映射 228 4.3.4 映射一对一关联关系 228 4.3.5 映射多对一单向关联关系 235 4.3.6 映射一对多双向关联关系 239 ...

    从J2SE到J2EE知识点介绍

    2. Java时间和日期类型的Hibernate映射类型 224 3. Java大对象类型的Hibernate映射类型 225 4. 关联关系映射 225 5. Hibernate的事务与并发 238 (十) 数据库 240 1. 数据库的基本概念 240 2. 数据模型 240 3. 关系...

    Grails 中文参考手册

    5.2.4 集合、列表和映射 5.3 持久化基础 5.3.1 保存和更新 5.3.2 删除对象 5.3.3 级联更新和删除 5.3.4 立即加载和延迟加载 5.3.4 悲观锁和乐观锁 5.4 GORM查询 5.4.1 动态查找器 5.4.2 条件查询 5.4.3 Hibernate...

    ssh(structs,spring,hibernate)框架中的上传下载

    Tfile的Hibernate映射文件Tfile.hbm.xml放在Tfile .java类文件的相同目录下:  代码 2 领域对象映射文件 1. 2. !DOCTYPE hibernate-mapping PUBLIC 3. "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 4. ...

    struts2_spring3_hibernate3_1.1

    将hibernate实体映射集成到spring配置文件中。 B.使用properties文件配置数据源 3.使用传统的配置文件集成框架。 A.视图层使用struts标签。 B.对用户输入验证 1.controller验证属性 2.使用Validate ...

    java web技术开发大全(最全最新)

    《Java Web开发技术大全:JSP+Servlet+Struts+Hibernate+Spring+Ajax》重点讲解了Struts 2、Speing和HIbernate框架的基础知识和高级技术,如Sruts 2中的*、类型转换、国际化和标签等,HIbe rna{e的会话、0/R映射和...

    java web开发技术大全

    《Java Web开发技术大全:JSP+Servlet+Struts+Hibernate+Spring+Ajax》重点讲解了Struts 2、Speing和HIbernate框架的基础知识和高级技术,如Sruts 2中的*、类型转换、国际化和标签等,HIbe rna{e的会话、0/R映射和...

    Java语言基础下载

    标签属性 420 HTML基本标签 422 标题元素 422 HTML格式 427 HTML实体 431 不可拆分的空格 431 HTML表格 439 表格 441 HTML列表 461 HTML图像 469 Img标签和src属性 469 HTML背景 475 内容总结 478 独立实践 479 第二...

    java面试题

    Struts2只是起到一个数据接收和转接的功能,就是Controller控制器,而传来数据的页面叫view显示层,Struts2将数据提交给进行处理的类叫Model模型层,专门进行数据处理和数据库的连接。 heap和stack有什么区别? 答:...

    spring in action英文版

     9.1.5 暴露请求和会话属性  9.1.6 在Velocity中绑定表单域  9.2 使用FreeMarker  9.2.1 构造一个FreeMarker视图  9.2.2 配置FreeMarker引擎  9.2.3 解析FreeMarker视图  9.2.4 在FreeMarker中...

    深入浅出Struts2(附源码)

    跟随作者一道深入Struts 2,聆听大量来之不易的经验之谈,你对Struts 2开发框架的理解和应用水平都将更上一层楼。本书适合Java Web 程序员阅读和参考 第1章 Model 2应用程序 1 1.1 Model 2概览 1 1.2 带servlet...

    1000道 互联网Java架构师面试题.pdf和JAVA核心知识整理.zip

    7、当实体类中的属性名和表中的字段名不一样 ,怎么办 ? 8、 模糊查询 like 语句该怎么写? 9、通常一个 Xml 映射文件,都会写一个 Dao 接口与之对应,请问,这个 Dao 接口的工作原理是什么?Dao 接口里的方法,...

    iBATIS实战

    书中既详实地介绍了iBATIS的设计理念和基础知识,也讨论了动态SQL、高速缓存、DAD框架等高级主题,还讲解了iBATIS在实际开发中的应用。书的最后给出了一个设计优雅、层次清晰的示例程序JGameStore,该示例涵盖全书的...

Global site tag (gtag.js) - Google Analytics