在本章中,你将学习构建并运行第1章中的示例所需的步骤。还要重新构建一个略微复杂的应用程序。本书中的所有代码都可以从Apress站点(www.apress.com)下载。
表3-1本书中使用的工具
工具 |
版本 |
下载位置 |
Hibernate |
3.2.0 |
http://hibernate.org |
Hibernate Tools |
3.1 |
http://hibernate.org |
Ant |
1.6.5 |
http://ant.apache.org |
HSQLDB |
1.8.0.2 |
http://hsqldb.org |
3.1.1 Hibernate和Hibernate Tools
通过http://hibernate.org上左边的菜单链接Download可以找到Hibernate的最新版本。应该选择Hibernate core3.2.0版本或更高版本(默然说话:现在应该是3.3.x了)。
同样应该选择下载Hibernate Tools 3.1及以上版本。它为Ant构建工具和免费的Eclipse IDE提供了各种插件。在附录B中我们将讨论Eclipse特性。
这个数据库是用Java编写的,而且是可以免费获得的开放源代码软件。我们的示例使用1.8.0.2版本,更高版本也适用。HSQL原来称为“Hypersonic”。在一些HSQL文档中可能会看到这个词,应该把它看作“HSQL”的同义词。Hibernate Query Language的缩写HQL与HSQL太相似,所以为了避免混淆,我们将HSQL称为HSQLDB。
如果你希望自己的数据库运行示例,那么应该处理以下方面的差异:
v Hibernate方法类
v JDBC驱动程序
v 数据库的连接URL
v 数据库的用户名
v 数据库的密码
在本章后面会介绍在哪里进行这些设置。你还会注意到,在指定数据库连接URL的地方,我们常会附加一个shutdown=true属性。这是为了纠正一个小问题:在Connection对象关闭前,HSQLDB并不将修改写到磁盘(当连接由Hibernate自己的连接池逻辑管理时,不会发生这种情况)。在非嵌入式数据库中,不需要这么做。
如果你不熟悉Ant,那么需要专门研究一下Ant这个主题。我们推荐Christopher M. Judd和Brian Sam-Bodden撰写的《Enterprise Java Development on a Budget》(Apress 2004年),这本书对Ant等开放源码工具做了很好的介绍。
尽管对Ant的详细讨论超出了本书的范围,但是我们将讨论脚本使用的Hibernate任务。
代码清单3-1给出构建本章示例所用的Ant脚本-build.xml
<?xml version="1.0" encoding="UTF-8"?>
<project name="sample">
<project file="build.properties" />
<project name="src" location="src" />
<project name="bin" location="bin" />
<project name="sql" location="sql" />
<project name="hibernate.tools" value="${hibernate.tools.home}${hibernate.tools.path}" location="src" />
<path id="classpath.base">
<pathelement location="${src}" />
<pathelement location="${bin}" />
<pathelement location="${hibernate.home}/hibernate3.jar" />
<fileset dir="${hibernate.home}/lib" includes="**/*.jar" />
<pathelement location="${hsql.home}/lib/hsqldb.jar" />
</path>
<path id="classpath.tools">
<path refid="classpath.base" />
<pathelement location="${hibernate.tools}/hibernate-tools.jar" />
</path>
<taskdef name="htools" classname="org.hibernate.tool.ant.HibernateToolTask" classpathref="classpath.tools" />
<target name="exportDDL" depends="compile">
<htools destdir="${sql}" >
<classpath refid="classpath.tools" />
<configuration configurationfile="${src}/hibernate.cfg.xml" />
<hbm2ddl drop="true" outputfilename="sample.sql" />
</htools>
</target>
<target name="compile">
<javac srcdir="${src}" destdir="${bin}" classpathref="classpath.base" />
</target>
<target name="populateMessages" depends="compile">
<java classname="sample.PopulateMessages" classpathref="classpath.base" />
</target>
<target name="listMessages" depends="compile">
<java classname="sample.ListMessages" classpathref="classpath.base" />
</target>
<target name="createUsers" depends="compile">
<java classname="sample.CreateUser" classpathref="classpath.base" >
<arg value="dave" />
<arg value="dodgy" />
</java>
<java classname="sample.CreateUser" classpathref="classpath.base" >
<arg value="jeff" />
<arg value="jammy" />
</java>
</target>
<target name="createCategories" depends="compile">
<java classname="sample.CreateCategory" classpathref="classpath.base" >
<arg value="retro" />
</java>
<java classname="sample.CreateCategory" classpathref="classpath.base" >
<arg value="kitsch" />
</java>
</target>
<target name="postAdverts" depends="compile">
<java classname="sample.PostAdvert" classpathref="classpath.base" >
<arg value="dave" />
<arg value="retro" />
<arg value="Sinclair Spectrum for sale" />
<arg value="48k original box and packaging" />
</java>
<java classname="sample.PostAdvert" classpathref="classpath.base" >
<arg value="dave" />
<arg value="kitsch" />
<arg value="Commemorative Plates" />
<arg value="Kitten and puppies design" />
</java>
<java classname="sample.PostAdvert" classpathref="classpath.base" >
<arg value="jeff" />
<arg value="retro" />
<arg value="Atari 2600 wanted" />
<arg value="Must have original joysticks." />
</java>
<java classname="sample.PostAdvert" classpathref="classpath.base" >
<arg value="jeff" />
<arg value="kitsch" />
<arg value="Inflatable Sofa" />
<arg value="Leopard skin pattern. Nice." />
</java>
</target>
<target name="listAdverts" depends="compile">