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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值