logo资料库

hibernate官方入门教程中文版.pdf

第1页 / 共22页
第2页 / 共22页
第3页 / 共22页
第4页 / 共22页
第5页 / 共22页
第6页 / 共22页
第7页 / 共22页
第8页 / 共22页
资料共22页,剩余部分请下载后查看
hibernate官方入门教程 第一部分 - 第一个Hibernate程序 首先我们将创建一个简单的控制台(console-based)Hibernate程序。我们使用内置数据库(in-memory database) (HSQL DB),所以我们不必安装任何数据库服务器。 让我们假设我们希望有一个小程序可以保存我们希望关注的事件(Event)和这些事件的信息。 (译者注: 在本教程的后面部分,我们将直接使用Event而不是它的中文翻译“事件”,以免混淆。) 我们做的第一件事是建立我们的开发目录,并把所有需要用到的Java库文件放进去。 从Hibernate网站的下 载页面下载Hibernate分发版本。 解压缩包并把/lib下面的所有库文件放到我们新的开发目录下面的/lib目 录下面。 看起来就像这样: . +lib antlr.jar cglib-full.jar asm.jar asm-attrs.jars commons-collections.jar commons-logging.jar ehcache.jar hibernate3.jar jta.jar dom4j.jar log4j.jar This is the minimum set of required libraries (note that we also copied hibernate3.jar, the main archive) for Hibernate. See the README.txt file in the lib/ directory of the Hibernate distribution for more information about required and optional third-party libraries. (Actually, Log4j is not required but preferred by many developers.) 这个是Hibernate运行所需要的最小库文件集合(注意我们也拷贝了 Hibernate3.jar,这个是最重要的库)。 可以在Hibernate分发版本的lib/目录下查看README.txt,以获取 更多关于所需和可选的第三方库文件信息 (事实上,Log4j并不是必须的库文件但是许多开发者都喜欢用 它)。 接下来我们创建一个类,用来代表那些我们希望储存在数据库里面的event. 2.2.1. 第一个class 我们的第一个持久化类是 一个简单的JavaBean class,带有一些简单的属性(property)。 让我们来看一
下代码: import java.util.Date; public class Event { private Long id; private String title; private Date date; Event() {} public Long getId() { return id; } private void setId(Long id) { this.id = id; } public Date getDate() { return date; } public void setDate(Date date) { this.date = date; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } } 你可以看到这个class对属性(property)的存取方法(getter and setter method) 使用标准的JavaBean
命名约定,同时把内部字段(field)隐藏起来(private visibility)。 这个是个受推荐的设计方式,但并不 是必须这样做。 Hibernate也可以直接访问这些字段(field),而使用访问方法(accessor method)的好 处是提供了程序重构的时候健壮性(robustness)。 id 属性(property) 为一个Event实例提供标识属性(identifier property)的值- 如果我们希望使用 Hibernate的所有特性,那么我们所有的持久性实体类(persistent entity class)(这里也包括一些次要依赖 类) 都需要一个标识属性(identifier property)。而事实上,大多数应用程序(特别是web应用程序)都需 要识别特定的对象,所以你应该 考虑使用标识属性而不是把它当作一种限制。然而,我们通常不会直接操 作一个对象的标识符(identifier), 因此标识符的setter方法应该被声明为私有的(private)。这样当一个 对象被保存的时候,只有Hibernate可以为它分配标识符。 你会发现Hibernate可以直接访问被声明为 public,private和protected等不同级别访问控制的方法(accessor method)和字段(field)。 所以选择 哪种方式来访问属性是完全取决于你,你可以使你的选择与你的程序设计相吻合。 所有的持久类(persistent classes)都要求有无参的构造器(no-argument constructor); 因为 Hibernate必须要使用Java反射机制(Reflection)来实例化对象。构造器(constructor)的访问控制可以 是私有的(private), 然而当生成运行时代理(runtime proxy)的时候将要求使用至少是package级别的 访问控制,这样在没有字节码编入 (bytecode instrumentation)的情况下,从持久化类里获取数据会更有 效率一些。 我们把这个Java源代码文件放到我们的开发目录下面一个叫做src的目录里。 这个目录现在应该看起来像 这样: . +lib +src Event.java 在下一步里,我们将把这个持久类(persisten class)的信息通知Hibernate 2.2.2. 映射文件 Hibernate需要知道怎样去加载(load)和存储(store)我们的持久化类的对象。这里正是Hibernate映射 文件(mapping file)发挥作用的地方。 映射文件告诉Hibernate它应该访问数据库里面的哪个表(table) 和应该使用表里面的哪些字段(column)。 一个映射文件的基本结构看起来像这样:
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> [...] 注意Hibernate的DTD是非常复杂的。 你可以在你的编辑器或者IDE里面使用它来自动提示并完成(auto- completion)那些用来映射的XML元素(element)和属性(attribute)。 你也可以用你的文本编辑器打开 DTD-这是最简单的方式来浏览所有元素和参数,查看它们的缺省值以及它们的注释,以得到一个整体的 概观。 同时也要注意Hibernate不会从web上面获取DTD文件,虽然XML里面的URL也许会建议它这样做, 但是Hibernate会首先查看你的程序的classpath。 DTD文件被包括在hibernate3.jar,同时也在Hibernate 分发版的src/路径下。 在以后的例子里面,我们将通过省略DTD的声明来缩短代码长度。但是显然,在实际的程序中,DTD声明 是必须的。 在两个hibernate-mapping标签(tag)中间, 我们包含了一个 class元素(element)。所有的持久性实体类 (persistent entity classes)(再次声明, 这里也包括那些依赖类,就是那些次要的实体)都需要一个这样的 映射,来映射到我们的SQL database。 我们到现在为止做的一切是告诉Hibernate怎样从数据库表(table)EVENTS里持久化和 加载Event类的对 象,每个实例对应数据库里面的一行。现在我们将继续讨论有关唯一标识属性(unique identifier property)的映射。 另外,我们不希望去考虑怎样产生这个标识属性,我们将配置Hibernate的标识符生成 策略(identifier generation strategy)来产生代用主键。
id元素是标识属性(identifer property)的声明, name="id" 声明了Java属性(property)的名字 - Hibernate将使用getId()和setId()来访问它。 字段参数(column attribute)则告诉Hibernate我们使 用EVENTS表的哪个字段作为主键。 嵌套的generator元素指定了标识符的生成策略 - 在这里我们使 用increment,这个是非常简单的在内存中直接生成数字的方法,多数用于测试(或教程)中。 Hibernate 同时也支持使用数据库生成(database generated),全局唯一性(globally unique)和应用程序指定 (application assigned) (或者你自己为任何已有策略所写的扩展) 这些方式来生成标识符。 最后我们还必须在映射文件里面包括需要持久化属性的声明。缺省的情况下,类里面的属性都被视为非持 久化的: 和id元素类似,property元素的name参数 告诉Hibernate使用哪个getter和setter方法。 为什么date属性的映射包括column参数,但是title却没有? 当没有设定column参数的时候,Hibernate缺 省使用属性名作为字段(column)名。对于title,这样工作得很好。 然而,date在多数的数据库里,是 一个保留关键字,所以我们最好把它映射成另外一个名字。 下一件有趣的事情是title属性缺少一个type参数。 我们声明并使用在映射文件里面的type,并不像我们假 想的那样,是Java data type, 同时也不是SQL database type。这些类型被称作Hibernate mapping types, 它们把数据类型从Java转换到SQL data types。如果映射的参数没有设置的话,Hibernate也将尝 试去确定正确的类型转换和它的映射类型。 在某些情况下这个自动检测(在Java class上使用反射机制) 不会产生你所期待或者 需要的缺省值。这里有个例子是关于date属性。Hibernate无法知道这个属性应该被 映射成下面这些类型中的哪一个: SQLdate,timestamp,time。 我们通过声明属性映射timestamp来表 示我们希望保存所有的关于日期和时间的信息。 这个映射文件(mapping file)应该被保存为Event.hbm.xml,和我们的EventJava 源文件放在同一个目录
下。映射文件的名字可以是任意的,然而hbm.xml已经成为Hibernate开发者社区的习惯性约定。 现在目录 应该看起来像这样: . +lib +src Event.java Event.hbm.xml 我们继续进行Hibernate的主要配置。 2.2.3. Hibernate配置 我们现在已经有了一个持久化类和它的映射文件,是时候配置Hibernate了。在我们做这个之前,我们需要 一个数据库。 HSQL DB,一个java-based内嵌式SQL数据库(in-memory SQL Database),可以从 HSQL DB的网站上下载。 实际上,你仅仅需要下载/lib/目录中的hsqldb.jar。把这个文件放在开发文件夹 的lib/目录里面。 在开发目录下面创建一个叫做data的目录 - 这个是HSQL DB存储它的数据文件的地方。 Hibernate是你的程序里连接数据库的那个应用层,所以它需要连接用的信息。连接(connection)是通过 一个也由我们配置的JDBC连接池(connection pool)。 Hibernate的分发版里面包括了一些open source 的连接池,但是我们已经决定在这个教程里面使用内嵌式连接池。 如果你希望使用一个产品级的第三方连 接池软件,你必须拷贝所需的库文件去你的classpath并使用不同的连接池设置。 为了配置Hibernate,我们可以使用一个简单的hibernate.properties文件, 或者一个稍微复杂的 hibernate.cfg.xml,甚至可以完全使用程序来配置Hibernate。 多数用户喜欢使用XML配置文件: org.hsqldb.jdbcDriver jdbc:hsqldb:data/tutorial
sa 1 org.hibernate.dialect.HSQLDialect true create 注意这个XML配置使用了一个不同的DTD。我们配置Hibernate的SessionFactory- 一个关联于特定数据 库全局性的工厂(factory)。如果你要使用多个数据库,通常应该在多个配置文件中使用多个 进行配置(在更早的启动步骤中进行)。 最开始的4个property元素包含必要的JDBC连接信息。dialectproperty 表明Hibernate应该产生针对特定 数据库语法的SQL语句。hbm2ddl.auto选项将自动生成数据库表定义(schema)- 直接插入数据库中。 当然这个选项也可以被关闭(通过去除这个选项)或者通过Ant任务SchemaExport来把数据库表定义导入一 个文件中进行优化。 最后,为持久化类加入映射文件。 把这个文件拷贝到源代码目录下面,这样它就位于classpath的root路径上。Hibernate在启动时会自动 在它 的根目录开始寻找名为hibernate.cfg.xml的配置文件。 2.2.4. 用Ant编译 在这个教程里面,我们将用Ant来编译程序。你必须先安装Ant-可以从Ant download page 下载它。怎样 安装Ant不是这个教程的内容,请参考Ant manual。 当你安装完了Ant,我们就可以开始创建编译脚本,它 的文件名是build.xml,把它直接放在开发目录下面。 完善Ant
注意Ant的分发版通常功能都是不完整的(就像Ant FAQ里面说得那样),所以你常常不得 不需要自己动手来完善Ant。 例如:如果你希望在你的build文件里面使用JUnit功能。为了 让JUnit任务被激活(这个教程里面我们并不需要这个任务), 你必须拷贝junit.jar 到ANT_HOME/lib目录下或者删除ANT_HOME/lib/ant-junit.jar这个插件。 一个基本的build文件看起来像这样
分享到:
收藏