Chapter 5. O/R Mapping基础
Prev Next
--------------------------------------------------------------------------------
Chapter 5. O/R Mapping基础
5.1. 映射声明(Mapping declaration)
对象和关系数据库之间的映射是用一个XML文档(XML document)来定义的。这个映射文档被设计为易读的,并且可以手工修改。映射语言是以Java为中心的,意味着映射是按照持久化类的定义来创建的,而非表的定义。
请注意,虽然很多Hibernate用户选择手工定义XML映射文档,也有一些工具来生成映射文档,包括XDoclet,Middlegen和AndroMDA.
让我们从一个映射的例子开始:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 2.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">
<hibernate-mapping package="eg">
<class name="Cat" table="CATS" discriminator-value="C">
<id name="id" column="uid" type="long">
<generator class="hilo"/>
</id>
<discriminator column="subclass" type="character"/>
<property name="birthdate" type="date"/>
<property name="color" not-null="true"/>
<property name="sex" not-null="true" update="false"/>
<property name="weight"/>
<many-to-one name="mate" column="mate_id"/>
<set name="kittens">
<key column="mother_id"/>
<one-to-many class="Cat"/>
</set>
<subclass name="DomesticCat" discriminator-value="D">
<property name="name" type="string"/>
</subclass>
</class>
<class name="Dog">
<!-- mapping for Dog could go here -->
</class>
</hibernate-mapping>
我们现在开始讨论映射文档的内容。我们只描述Hibernate在运行时用到的文档元素和属性。映射文档还包括一些额外的可选属性和元素,它们在使用schema导出工具的时候会影响导出的数据库schema结果。(比如, not-null 属性。)
5.1.1. Doctype
所有的XML映射都需要定义如上所示的doctype。DTD可以从上述URL中获取,或者在hibernate-x.x.x/src/net/sf/hibernate目录中,或hibernate.jar文件中找到。Hibernate总是会在它的classptah中首先搜索DTD文件。
5.1.2. hibernate-mapping
这个元素包括三个可选的属性。schema属性,指明了这个映射所引用的表所在的schema名称。假若指定了这个属性,表名会加上所指定的schema的名字扩展为全限定名。假若没有指定,表名就不会使用全限定名。default-cascade指定了未明确注明cascade属性的Java属性和集合类Java会采取什么样的默认级联风格。auto-import属性默认让我们在查询语言中可以使用非全限定名的类名。
<hibernate-mapping
schema="schemaName"
default-cascade="none|save-update"
auto-import="true|false"
package="package.name"
/>
schema (可选): 数据库schema名称。
default-cascade (可选 - 默认为 none): 默认的级联风格。
auto-import (可选 - 默认为 true): 指定是否我们可以在查询语言中使用非全限定的类名(仅限于本映射文件中的类)。
package (可选): 指定一个包前缀,如果在映射文档中没有指定全限定名,就使用这个包名。
假若你有两个持久化类,它们的非全限定名是一样的(就是在不同的包里面--译者注),你应该设置auto-import="false"。假若说你把一个“import过”的名字同时对应两个类, Hibernate会抛出一个异常。
5.1.3. class
你可以使用class元素来定义一个持久化类:
<class
name="ClassName"
table="tableName"
discriminator-value="discriminator_value"
mutable="true|false"
schema="owner"
proxy="ProxyInterface"
dynamic-update="true|false"
dynamic-insert="true|false"
select-before-update="true|false"
polymorphism="implicit|explicit"
where="arbitrary sql where condition" (11)
persister="PersisterClass" (12)
batch-size="N" (13)
optimistic-lock="none|version|dirty|all" (14)
lazy="true|false" (15)
/>
name: 持久化类(或者接口)的Java全限定名。
table: 对应的数据库表名。
discriminator-value(辨别值) (可选 - 默认和类名一样):一个用于区分不同的子类的值,在多态行为时使用。
mutable(可变) (可选, 默认值为 true): 表明该类的实例可变(不可变)。
schema (可选): 覆盖在根<hibernate-mapping>元素中指定的schema名字。
proxy (可选): 指定一个接口,在延迟装载时作为代理使用。你可以在这里使用该类自己的名字。
dynamic-update(动态更新) (可选,默认为false): 指定用于UPDATE 的SQL将会在运行时动态生成,并且只更新那些改变过的字段。
dynamic-insert(动态插入) (可选, 默认为false): 指定用于INSERT的 SQL 将会在运行时动态生成,并且只包含那些非空值字段。
select-before-update (可选,默认值为false): 指定Hibernate除非确定对象的确被修改了,不会执行SQL UPDATE操作。在特定场合(实际上,只会发生在一个临时对象关联到一个新的session中去,执行update()的时候),这说明Hibernate会在UPDATE之前执行一次额外的SQL SELECT操作,来决定是否应该进行UPDATE。
polymorphism(多形,多态) (可选, 默认值为 implicit (隐式)): 界定是隐式还是显式的使用查询多态。
(11) where (可选) 指定一个附加的SQLWHERE 条件,在抓取这个类的对象时会一直增加这个条件。
(12) persister (可选): 指定一个定制的ClassPersister。
(13) batch-size (可选,默认是1) 指定一个用于根据标识符抓取实例时使用的"batch size"(批次抓取数量)。
(14) optimistic-lock(乐观锁定) (可选,默认是version): 决定乐观锁定的策略。
(15) lazy(延迟) (可选): 假若设置 lazy="true",就是设置这个类自己的名字作为proxy接口的一种等价快捷形式。
若指明的持久化类实际上是一个接口,也可以被完美地接受。其后你可以用<subclass>来指定该接口的实际实现类名。你可以持久化任何static(静态的)内部类。记得应该使用标准的类名格式,就是说比如:Foo$Bar。
不可变类,mutable="false"不可以被应用程序更新或者删除。这可以让Hibernate做一些小小的性能优化。
可选的proxy属性可以允许延迟加载类的持久化实例。Hibernate开始会返回实现了这个命名接口的CGLIB代理。当代理的某个方法被实际调用的时候,真实的持久化对象才会被装载。参见下面的“用于延迟装载的代理”。
Implicit (隐式)的多态是指,如果查询中给出的是任何超类、该类实现的接口或者该类的名字,都会返回这个类的实例;如果查询中给出的是子类的名字,则会返回子类的实例。 Explicit (显式)的多态是指,只有在查询中给出的明确是该类的名字时才会返回这个类的实例;同时只有当在这个<class>的定义中作为<subclass>或者<joined-subclass>出现的子类,才会可能返回。 大多数情况下,默认的polymorphism="implicit"都是合适的。 显式的多态在有两个不同的类映射到同一个表的时候很有用。(允许一个“轻型”的类,只包含部分表字段)。
persister属性可以让你定制这个类使用的持久化策略。你可以指定你自己实现的net.sf.hibernate.persister.EntityPersister的子类,你甚至可以完全从头开始编写一个net.sf.hibernate.persister.ClassPersister接口的实现,可能是用储存过程调用、序列化到文件或者LDAP数据库来实现的。参阅net.sf.hibernate.test.CustomPersister,这是一个简单的例子(“持久化”到一个Hashtable)。
请注意dynamic-update和dynamic-insert的设置并不会继承到子类,所以在<subclass>或者<joined-subclass>元素中可能需要再次设置。这些设置是否能够提高效率要视情形而定。请用你的智慧决定是否使用。
使用select-before-update通常会降低性能.当是在防止数据库不必要的触发update触发器,这就很有用了。
如果你打开了dynamic-update,你可以选择几种乐观锁定的策略:
version(版本检查) 检查version/timestamp字段
all(全部) 检查全部字段
dirty(脏检查)只检察修改过的字段
none(不检查)不使用乐观锁定
我们非常强烈建议你在Hibernate中使用version/timestamp字段来进行乐观锁定。对性能来说,这是最好的选择,并且这也是唯一能够处理在session外进行操作的策略(就是说,当使用Session.update()的时候)。
5.1.4. id
被映射的类必须声明对应数据库表主键字段。大多数类有一个JavaBeans风格的属性,为每一个实例包含唯一的标识。<id> 元素定义了该属性到数据库表主键字段的映射。
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
Hibernate说明文档.rar (45个子文件)
Hibernate说明文档
结合struts和hibernate谈J2EE架构的数据表示.txt 4KB
Hibernate2 参考文档之十八.txt 8KB
Struts+Hibernate模板开发笔记.txt 35KB
Hibernate2 参考文档之十六.txt 6KB
Hibernate的JNDI绑定分析.txt 2KB
Hibernate2 参考文档之一.txt 30KB
使用JDBC和Hibernate来写入Blob型数据到Oracle中.txt 6KB
Hibernate深度探险.txt 4KB
Hibernate入门 - 包作用详解.txt 4KB
Hibernate2 参考文档之三.txt 15KB
Hibernate2 参考文档之九.txt 8KB
Hibernate分页查询原理解读.txt 3KB
Hibernate2 参考文档之二.txt 3KB
Hibernate入门篇之新增特性.txt 13KB
新建 文本文档之十二.txt 9KB
用oracle的trigger生成主键的时候和hibernate冲突的讨论.txt 4KB
Hibernate Iterator JCS分析.txt 3KB
Hibernate入门 - Transaction.txt 7KB
在filter里关闭session.txt 8KB
Hibernate入门 - 基础配置.txt 5KB
父子关系及inverse 详解.txt 8KB
Hibernate2 参考文档之十五.txt 2KB
新建 文本文档之六.txt 22KB
Hibernate的批量删除的效率分析.txt 1KB
Hibernate2 参考文档之二十.txt 4KB
Hibernate2 参考文档之十.txt 18KB
update和saveOrUpdate详解.txt 5KB
Hibernate2 参考文档之七.txt 9KB
Hibernate2 参考文档之十一.txt 11KB
Hibernate2 参考文档之十九.txt 17KB
Hibernate2 参考文档之四.txt 8KB
OR Mapping性能.txt 2KB
Hibernate2 参考文档之十七.txt 8KB
Hibernate2 参考文档之十三.txt 4KB
新建 文本文档之十四.txt 5KB
在Weblogic上配置Hibernate为JNDI.txt 6KB
Hibernate为什么如此成功?.txt 3KB
Hibernate2 参考文档之五.txt 37KB
Hibernate2 参考文档之八.txt 24KB
Hibernate中代码自动生成小结.txt 3KB
关于unsaved-value 的再问.txt 5KB
十分钟在jb里面运行hibernate的简单例子。.txt 6KB
用户自定义ID Generator的例子.txt 4KB
整合Hibernate的EJB架构分析.txt 2KB
www.pudn.com.txt 218B
共 45 条
- 1
资源评论
御道御小黑
- 粉丝: 58
- 资源: 1万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功