没有合适的资源?快使用搜索试试~ 我知道了~
首页Hibernate中文API入门与映射详解
Hibernate中文API入门与映射详解
需积分: 10 0 下载量 14 浏览量
更新于2024-07-24
收藏 1.79MB PDF 举报
Hibernate中文API帮助文档是一份详细的指南,专为使用Hibernate进行关系型持久化编程的Java开发者设计。这份文档适用于版本3.5.3-Final,作者包括Gavin King、Christian Bauer等多位知名技术专家。文档结构清晰,分为教程、体系结构和配置三个主要部分。 教程部分首先引导读者通过实际操作建立第一个Hibernate应用程序,从设置环境、创建基础类、定义映射文件,到配置Maven项目、编写启动和辅助类,一步步展示如何使用Hibernate进行对象的加载和存储。随后,章节深入讲解了关联映射,如单向和双向集合关联,以及如何让它们正常工作,涉及到值类型集合和事件管理器web应用程序的示例。 体系结构部分详细介绍了Hibernate的工作原理,涵盖了实例状态管理、JMX集成、JCA支持、上下文相关的会话等核心概念。这有助于开发者理解Hibernate如何在后台管理和优化数据访问。 配置章节是文档的核心内容,介绍了编程方式配置SessionFactory,包括如何获取JDBC连接,以及众多可选配置属性。这些属性涵盖了SQL方言的选择、外连接抓取策略、处理二进制流、二级缓存和查询缓存的配置,还有查询语言的替换、统计机制、日志设置等方面,确保用户能够根据具体需求调整 Hibernate 的行为。 这份文档提供了全面的Hibernate使用教程和深度配置指南,对于想要掌握Hibernate框架的Java开发者来说,无论是入门学习还是进阶实践,都是极其宝贵的参考资料。通过阅读和实践文档中的内容,开发者可以熟练地将Hibernate应用到实际项目中,实现高效、优雅的数据库操作。
资源详情
资源推荐
![](https://csdnimg.cn/release/download_crawler_static/6429725/bg10.jpg)
第1章教程
4
}
}
你可以看到这个类对属性的存取方法(getter and setter method)使用了标准
JavaBean 命名约定,同时把类属性(field)的访问级别设成私有的(private)。这是推荐的
设计,但并不是必须的。Hibernate 也可以直接访问这些 field,而使用访问方法(accessor
method)的好处是提供了重构时的健壮性(robustness)。
对一特定的 event, id 属性持有唯一的标识符(identifier)的
值。如果我们希望使用 Hibernate 提供的所有特性,那么所有的持久化实体
(persistent entity)类(这里也包括一些次要依赖类)都需要一个这样的标识符属性。而事实
上,大多数应用程序(特别是 web 应用程序)都需要通过标识符来区别对象,所以你应该考虑使
用标识符属性而不是把它当作一种限制。然而,我们通常不会操作对象的标识(identity),因
此它的 setter 方法的访问级别应该声明 private。这样当对象被保存的时候,只有 Hibernate
可以为它分配标识符值。你可看到Hibernate可以直接访问 public,private 和 protected 的访
问方法和 field。所以选择哪种方式完全取决于你,你可以使你的选择与你的应用程序设计相吻
合。
所有的持久化类(persistent classes)都要求有无参的构造器,因为 Hibernate 必须使用 Java
反射机制来为你创建对象。构造器(constructor)的访问级别可以是 private,然而当生成运行
时代理(runtime proxy)的时候则要求使用至少是 package 级别的访问控制,这样在没有字节
码指令(bytecode instrumentation)的情况下,从持久化类里获取数据会更有效率。
把这个文件保存到 src/main/java/org/hibernate/tutorial/domain 目录下。
1.1.3.映射文件
Hibernate 需要知道怎样去加载(load)和存储(store)持久化类的对象。这正是 Hibernate 映
射文件发挥作用的地方。映射文件告诉 Hibernate 它应该访问数据库(database)里面的哪个表
(table)及应该使用表里面的哪些字段(column)。
一个映射文件的基本结构看起来像这样:
<?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 package="org.hibernate.tutorial.domain">
[...]
</hibernate-mapping
>
注意 Hibernate 的 DTD 是非常复杂的。你的编辑器或者 IDE 里使用它来自动完成那些用来映
射的 XML 元素(element)和属性(attribute)。你也可以在文本编辑器里打开 DTD — 这是
最简单的方式来概览所有的元素和 attribute,并查看它们的缺省值以及注释。注意 Hibernate
![](https://csdnimg.cn/release/download_crawler_static/6429725/bg11.jpg)
映射文件
5
不会从 web 加载 DTD 文件,但它会首先在应用程序的 classpath 中查找。DTD 文件已包括在
hibernate3.jar 里,同时也在 Hibernate 发布包的 src/ 目录下。
重要
为缩短代码长度,在以后的例子里我们会省略 DTD 的声明。当然,在实际的应用
程序中,DTD 声明是必需的。
在 hibernate-mapping 标签(tag)之间, 含有一个 class 元素。所有的持久化实体类(再次声
明,或许接下来会有依赖类,就是那些次要的实体)都需要一个这样的映射,来把类对象映射到
SQL 数据库里的表:
<hibernate-mapping package="org.hibernate.tutorial.domain">
<class name="Event" table="EVENTS">
</class>
</hibernate-mapping
>
到目前为止,我们告诉了 Hibernate 怎样把 Events 类的对象
持久化到数据库的 EVENTS 表里,以及怎样从 EVENTS 表加载到
Events 类的对象。每个实例对应着数据库表中的一行。现在我们将继续讨论有关唯一标识符属性
到数据库表的映射。另外,由于我们不关心怎样处理这个标识符,我们就配置由 Hibernate 的标
识符生成策略来产生代理主键字段:
<hibernate-mapping package="org.hibernate.tutorial.domain">
<class name="Event" table="EVENTS">
<id name="id" column="EVENT_ID">
<generator class="native"/>
</id>
</class>
</hibernate-mapping
>
id 元素是对 identifier 属性的声明。name="id" 映射属性声明了 JavaBean 属性的名称并告诉
Hibernate 使用 getId() 和 setId() 方法来访问这个属性。column 属性告诉 Hibernate EVENTS
表的哪个字段持有主键值。
嵌套的 generator 元素指定标识符的生成策略(也就是标识符值是怎么产生的)。在这个例子
里,我们选择 native,它提供了取决于数据库方言的可移植性。Hibernate 数据库生成的、全局
性唯一的以及应用程序分配的标识符。标识符值的生成也是 Hibernate 的扩展功能之一,你可以
插入自己的策略。
![](https://csdnimg.cn/release/download_crawler_static/6429725/bg12.jpg)
第1章教程
6
提示
native is no longer consider the best strategy in terms of portability.
for further discussion, see 第26.4节 “标识符的生成”
最后我们在映射文件里面包含需要持久化属性的声明。默认情况下,类里面的属性都被视为非持
久化的:
<hibernate-mapping package="org.hibernate.tutorial.domain">
<class name="Event" table="EVENTS">
<id name="id" column="EVENT_ID">
<generator class="native"/>
</id>
<property name="date" type="timestamp" column="EVENT_DATE"/>
<property name="title"/>
</class>
</hibernate-mapping
>
和 id 元素一样,property 元素的 name 属性告诉 Hibernate 使用哪个 getter 和 setter 方法。
在此例中,Hibernate 会寻找 getDate()、setDate()、getTitle() 和 setTitle() 方法。
注意
为什么 date 属性的映射含有 column attribute,而 title 却没有?当没有设定
column attribute 的时候,Hibernate 缺省地使用 JavaBean 的属性名作为字段
名。对于 title,这样工作得很好。然而,date 在多数的数据库里,是一个保留关
键字,所以我们最好把它映射成一个不同的名字。
另一有趣的事情是 title 属性缺少一个 type attribute。我们在映射文件里声明并使用的类型,
却不是我们期望的那样,是 Java 数据类型,同时也不是 SQL 数据库的数据类型。这些类型就是
所谓的 Hibernate 映射类型(mapping types),它们能把 Java 数据类型转换到 SQL 数据类
型,反之亦然。再次重申,如果在映射文件中没有设置 type 属性的话,Hibernate 会自己试着去
确定正确的转换类型和它的映射类型。在某些情况下这个自动检测机制(在 Java 类上使用反射
机制)不会产生你所期待或需要的缺省值。date 属性就是个很好的例子,Hibernate 无法知道这
个属性(java.util.Date 类型的)应该被映射成:SQL date,或 timestamp,还是 time 字段。在
此例中,把这个属性映射成 timestamp 转换器,这样我们预留了日期和时间的全部信息。
![](https://csdnimg.cn/release/download_crawler_static/6429725/bg13.jpg)
Hibernate 配置
7
提示
当处理映射文件时,Hibernate 用反射(reflection)来决定这个映射类型。这需
要时间和资源,所以如果你注重启动性能,你应该考虑显性地定义所用的类型。
把这个映射文件保存为 src/main/resources/org/hibernate/tutorial/domain/Event.hbm.xml。
1.1.4.Hibernate 配置
此时,你应该有了持久化类和它的映射文件。现在是配置 Hibernate 的时候了。首先让我们设立
HSQLDB 使其运行在“服务器模式”。
注意
数据在程序运行期间需要保持有效。
在开发的根目录下创建一个 data 目录 - 这是 HSQL DB 存储数据文件的地方。此时在 data 目
录中运行 java -classpath ../lib/hsqldb.jar org.hsqldb.Server 就可启动数据库。你可以在 log
中看到它的启动,及绑定到 TCP/IP 套接字,这正是我们的应用程序稍后会连接的地方。如果你
希望在本例中运行一个全新的数据库,就在窗口中按下 CTRL + C 来关闭 HSQL 数据库,并删除
data/ 目录下的所有文件,再重新启动 HSQL 数据库。
Hibernate 将为你的应用程序连接到数据库,所以它需要知道如何获取连接。在这个教程里,我
们使用一个独立连接池(和 javax.sql.DataSource 相反)。Hibernate 支持两个第三方的开源
JDBC 连接池:c3p0 [https://sourceforge.net/projects/c3p0] 和 proxool [http://
proxool.sourceforge.net/]。然而,在本教程里我们将使用 Hibernate 内置的连接池。
小心
嵌入的 Hibernate 连接池不用于产品环境。它缺乏连接池里的几个功能。
为了保存 Hibernate 的配置,我们可以使用一个简单的 hibernate.properties 文件,或者一个
稍微复杂的 hibernate.cfg.xml,甚至可以完全使用程序来配置 Hibernate。多数用户更喜欢使用
XML 配置文件:
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
![](https://csdnimg.cn/release/download_crawler_static/6429725/bg14.jpg)
第1章教程
8
<!-- Database connection settings -->
<property name="connection.driver_class"
>org.hsqldb.jdbcDriver</property>
<property name="connection.url"
>jdbc:hsqldb:hsql://localhost</property>
<property name="connection.username"
>sa</property>
<property name="connection.password"
></property>
<!-- JDBC connection pool (use the built-in) -->
<property name="connection.pool_size"
>1</property>
<!-- SQL dialect -->
<property name="dialect"
>org.hibernate.dialect.HSQLDialect</property>
<!-- Enable Hibernate's automatic session context management -->
<property name="current_session_context_class"
>thread</property>
<!-- Disable the second-level cache -->
<property name="cache.provider_class"
>org.hibernate.cache.NoCacheProvider</property>
<!-- Echo all executed SQL to stdout -->
<property name="show_sql"
>true</property>
<!-- Drop and re-create the database schema on startup -->
<property name="hbm2ddl.auto"
>update</property>
<mapping resource="org/hibernate/tutorial/domain/Event.hbm.xml"/>
</session-factory>
</hibernate-configuration
>
注意
请注意,这个配置文件指定了一个不同的 DTD。
注意这个 XML 配置使用了一个不同的 DTD。在这里,我们配置了 Hibernate 的SessionFactory
— 一个关联于特定数据库全局的工厂(factory)。如果你要使用多个数据库,就要用多个的
<session-factory>,通常把它们放在多个配置文件中(为了更容易启动)。
签名 4 个 property 元素包含了 JDBC 连接所必需的配置。方言 property 元素指定了 Hibernate
生成的特定 SQL 语句。
剩余317页未读,继续阅读
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://profile-avatar.csdnimg.cn/default.jpg!1)
card123456
- 粉丝: 0
- 资源: 1
上传资源 快速赚钱
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助
![](https://csdnimg.cn/release/wenkucmsfe/public/img/voice.245cc511.png)
最新资源
- Hadoop生态系统与MapReduce详解
- MDS系列三相整流桥模块技术规格与特性
- MFC编程:指针与句柄获取全面解析
- LM06:多模4G高速数据模块,支持GSM至TD-LTE
- 使用Gradle与Nexus构建私有仓库
- JAVA编程规范指南:命名规则与文件样式
- EMC VNX5500 存储系统日常维护指南
- 大数据驱动的互联网用户体验深度管理策略
- 改进型Booth算法:32位浮点阵列乘法器的高速设计与算法比较
- H3CNE网络认证重点知识整理
- Linux环境下MongoDB的详细安装教程
- 压缩文法的等价变换与多余规则删除
- BRMS入门指南:JBOSS安装与基础操作详解
- Win7环境下Android开发环境配置全攻略
- SHT10 C语言程序与LCD1602显示实例及精度校准
- 反垃圾邮件技术:现状与前景
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
![](https://img-home.csdnimg.cn/images/20220527035711.png)
![](https://img-home.csdnimg.cn/images/20220527035711.png)
![](https://img-home.csdnimg.cn/images/20220527035111.png)
安全验证
文档复制为VIP权益,开通VIP直接复制
![](https://csdnimg.cn/release/wenkucmsfe/public/img/green-success.6a4acb44.png)