转自:http://www.knowsky.com/365675.html
个人测试,该插件使用的主要步骤:
下载 eclipse的hibernate synchronizer 插件,然后在空白区域 右键-->new-->hibernate-->hibernate Configuration File-->生成hibernate.cfg.xml,然后右键hibernate.cfg.xml文件,--->new-->hibernate-->hibernate Mapping File-->生成每个数据表和类的映射文件,例如Tbapconfig.hbm.xml,然后右键这些hbm文件-->hibernate synchronizer -->synchronizer Files-->然后在src下会生成两个包,其中一个为base,base里边的java文件为自动生成的,会随着hbm配置文件的改变而改变,因此文件不能修改;另一个包中的java文件可任意修改。
介绍
最近我开始使用Eclipse作为我的开发环境,部分原因是因为在我进行开发的许多平台上都可以使用Eclipse来工作,还有部分原因是因为Eclipse是展示人人皆可作出贡献的开放、可扩展环境的优势的一个极好的例子。我开始研究其他人提供的对Eclipse的扩展。例如,当用到xml文件时,我使用XMLBuddy插件。该插件对于我的工作很有助益。因为最近一直在写Developer's Notebook,所以我很想知道是不是已经有人写了关于Hibernate的插件,事实上,有好几个这样的插件正在开发。在这篇文章中,我们将探索其中之一:Hibernate Synchronizer.
Hibernate Synchronizer
在我找的和Hibernate有关的插件中,Hibernate Synchronizer最令我感爱好,因为它为我在Developer's Notebook书中采用的以映射为中心的工作流(mapping-centric workflow)提供了最好的支持。(可以用多种方法使用Hibernate,你可能会试试其它一些插件,它们提供的方法可能正是你自己特定环境所要求的)。事实上,当使用Hibernate Synchronizer时,假如你改变了映射文件,你不需要为更新相应的java文件而劳心费神。当你编辑映射文件时,和Eclipse采取的方法类似,该插件自动更新你的java代码。还不止于此,还提供了比Hibernate内建的代码生成工具更多的功能:它为每个映射对象创建一对类( a pair of classes),其中一个是基础类,当你改变映射内容时,它可以随意重写这个类;另一个类作为该基础类的子类,在子类中,你可以添加具体的商业逻辑和另一些代码。使用这个插件生成java代码时,不用象使用Hibernate内置的代码生成工具那样,担心其它代码(如商业逻辑的代码)会在你的眼皮底下消失。
对于以Hibernate影射文档为基础的方法,还有一些其它的好处,Hibernate Synchronizer有一个新编辑器,当编辑这类文件时,为Eclipse添加了智能辅助和自动完成功能。一个比较好的、以DTD驱动的XML编辑器,如以前提及的XMLBuddy,也可以完成部分功能。与此相比,Hibernate Synchronizer利用对影射文档语义的了解,提供了更进一步的功能。例如,提供了对属性和影射关系的可视化显示,创建新元素的向导界面,象以上提及的一样,缺省设置情况下,当你编辑影射文档时,编辑器会自动生成数据访问类(data-access class).
当然还有其它一些功能,在Eclipse的新建(New)菜单中,提供了一个向导,可以用来创建Hibernate配置文件和映射文件,在包资源浏览器(package eXPlorer)和其它一些合适的地方增加了上下文菜单,方便调用和Hibernate相关的功能。
好了,在这些抽象的描述之后,到了开始做实事的时候,当然,这正是你爱好所在,不然你就不会读这篇文章。怎么安装和使用呢?下边一一解释。
安装
Hibernate Synchronizer可以用Eclipse内置的更新治理器(Update Manager)来安装。对Eclipse 2.1和即将发布的Eclipse 3的用户提供了不同的更新站点。(因为用Eclipse作要害性的工作,我仍使用作为产品发行的2.1版。当我写这篇文章的时候,Eclipse 3已经进入了“候选发布”阶段。我希望当我今夏晚些时候从JavaOne回来时,我可以更新到版本3的产品发行版。提及这个的主要原因是因为我想强调一下,这些指南是以Eclipse 2的角度的来讲解,毫无疑问,一些命令和窗口会在版本3中发生变化,因此,当你使用Eclipse 3时,你应当做一些相应的调整。我印象中Hibernate Synchronizer自己的install instrUCtions是针对Eclipse 3,也许这对你有所帮助。
启动Eclipse,顺次单击帮助(Help) ->软件更新(Software Updates) -> 更新治理器(Update Manager)来打开更新治理器,当安装/更新(Install/Update)透视图打开之后,在功能更新视图(Feature Updates)中用右键单击(假如你用的单键,你需要control-click)。选择新建(New) -> 站点书签(Site Bookmark),如图1中所示。
图 1 在更新治理器中添加Hibernate Synchronizer插件的更新地址
在弹出对话框中,输入适合你的Eclipse版本的插件地址:
·Eclipse 2.1: http://www.binamics.com/hibernatesync/ eclipse 2.1
·Eclipse 3: http://www.binamics.com/hibernatesync
还需要为新建的书签命名,"Hibernate Synchronizer"就是个很贴切的名字。图2中显示的是在Eclipse 2.1.2中填完所有需要的信息后的对话框。填完之后,你可单击完成(Finish)按钮来完成增加书签。
图 2. Hibernate Synchronizer插件更新站点书签
单击完成(Finish)后,新建的书签就会出现在功能更新(Feature Updates) 视图中,如图3中所示.
图 3. Hibernate Synchronizer站点已经可以使用
为了实际安装该插件,单击该书签左边的三角形符号,然后再次单击在书签下边出现的条目左边的三角形符号,继续这个过程,一直到书签下边出现的条目中出现该插件的图标。单击该条目,就会出现一个可以让你安装的界面,如图4所示。
图 4. 预备开始安装插件
单击Install Now,让Eclipse引导你完成安装(如图5-10).
图 5. 安装Hibernate Synchronizer
图 6. 许可协议
你可以看看下边Trade-Offs部分对许可协议的一些讨论。当你打算在实际的项目中使用该插件时,想必你会仔细研究该协议。我认为也许好一点,不过该插件基于GPL协议,而不是开放 源代码 ,令人迷惑。
7. 选择安装位置,缺省的已经很好了
图 8. 安装没有签名插件时的标准警告
图 9 正在进行安装
图 10. 完成安装
现在已经完成安装,你需要退出,然后重新启动Eclipse以使所做的更改生效。看上边的对话框似乎说能够自动重新启动Eclipse。,以我的经验,Eclipse只会退出,还是需要你自己手工重新启动。这可能是Max OS X平台上Eclipse 2.1的一个局限。Eclipse 3已经许诺把对OS X的支持列入第一级别。无论如何,这只是个小问题。假如你需要重新启动Eclipse,现在就可以这样做。安装完之后,接着需要对其对其进行配置,以便在项目中使用。
配置
重新启动Eclipse后,关闭安装/更新透视图。打开一个使用Hibernate的Java工程.假如你已经完成了Developer's Notebook,一书中的例子,那么就有几个目录可供你选择,这里以书中第三章中的例子来说明。第三章是可以在线免费获得的样章,你还可以从该书的站点下载所有例子的 源代码 。
假如你打算使用其中的一个例子来新建一个Eclipse工程,选择文件(File) ->新建( New )-> 工程( PR oject),选定工程类型,然后单击下一步(Next),填入该工程名(我填的是"Hibernate Ch3",如图11所示),不要复选使用缺省检查框(Use default),这样你可以告诉Eclipse从哪里找到已经存在的工程目录,单击浏览按钮(Browse)来定位目录。选定工程目录后可以单击完成(Finish)来创建工程。不过,一般情况下我喜欢单击下一步(Next)来复查Eclipse为此工程所作的设置(当然,假如发现有些配置不对,总是可以选择回退来修改这些设置。不过,我总是发现,假如有一个库文件丢失或是其它一些原因,会有非常多的错误和警告信息)。
图 11. 创建一个需要使用Hibernate的新工程
在当前情况下,我的谨慎有点多余。Eclipse准确的算出了目录是如何组织以及是用来干什么的,找到我为使用Hibernate和 HSQLDB 数据库 而下载的第三方库(下载和安装的具体过程可以参看书中第一章)。如此聪明的适应能力是Eclipse优点之一。图12显示新工程已经打开,预备好可以用来做实验。从这个图中也可以推断Eclipse不喜欢调整窗口大小使其小到形成合适的屏幕布局。从现在开始,显示的屏幕截图只显示窗口的一部分,而不是完整的窗口。
图 12. 使用Chapter 3例子的工程
下一个需要做的工作是创建一个Hibernate配置文件,提供给Hibernate Synchronizer使用。在src目录中已经有了一个hibernate.properties文件,这是书中例子使用的配置。这里有个问题,坏消息是Hibernate Synchronizer只能使用XML样式的Hibernate配置文件。这样,就需要把hibernate.properties中的内容移植到XML样式的配置文件hibernate.cfg.xml中。好消息是,这正是Hibernate Synchronizer创建配置文件向导第一次大显身手的时候。选择文件(File) ->新建(New) -> 其它(Other),然后在弹出对话框选取刚可用的Hibernate类,选取 Hibernate Configuration File,然后单击下一步(Next).
图13 打开Hibernate配置文件向导
添加Driver Class 的方法有点希奇,你需要单击Browse按钮,然后开始输入driver的类名(译者注:你需要确定该driver类在该工程的类路径中)。假如你输入"jdbcD",窗口就会出现这个选择,很轻易就可以从中选取一个。具体如图15所示。
图15 指定HSQLDB的driver类
只要添加如图14中那些属性值就可以。完成后单击Finish来完成创建配置文件。Hibernate Synchronizer 现在已经可以开始使用了。完成创建文件后,配置文件会打开,这时候你就可以看看Hibernate xml 格式的配置文件的结构和细节。
图16 生成的配置文件
要想测试配置文件是否可用,有一个又快又简单的方法:使用向导来创建一个影射文件。选择文件(File) -> 新建(New) -> 其它(Other),选取Hibernate类别,然后再选Hibernate 影射文件,单击下一步(Next)。向导出现的时候,其中有些属性已经自动填入了在配置文件中相应属性的值,单击Refresh(确保可以通过这些信息和你的 数据库 相连)。和 数据库连接 后,会显示库中的表,这里只有一个TRACK表。第一次使用的时候,不知什么原因,需要你指定包含HSQLDB驱动的.jar文件的路径。好在你只需要指定一次。只要你认为工作正常(译者注:显示了 数据库 中有权限访问的表),单击Cancel。试验中使用已有的影射文件,不需要实际创建一个。
生成代码
这可能是你一直在等待的部分。我们能用这个插件来做什么?好,马上就开始。为Hibernate影射 文档 提供一个新的菜单条目。
右击(假如是单键鼠标,在按住Control键的同时点鼠标键)一个影射文档,菜单条目中会显示几个和Hibernate相关的选择(如图17所示),其中有一个和synchronize有关,这是一个手工方法,可以让Hibernate Synchronizer产生和该影射文档相对应的数据访问对象。
图17 Synchronizer插件为影射文档提供的几个菜单项
Add Mapping Reference 选项也很有用,当你单击该项时,会把相应的影射文件增加到Hibernate配置文件中,表明该文件是影射文档,因此你不需要在 源代码 中增加任何信息要求相应的影射文件进行设置。现在让我们看看选取Synchronize Files后的结果。
事情开始变得有趣,出现了两个子包,一个是“base”的DAO,Hibernate Synchronizer所有,可以在任何时候重写,一个是继续那些DAO类的商业对象,不会被覆盖,也就给了我们一个机会,可以在其中加入商业逻辑(具体如图18中所示)。
图18 同步后的DAO,图中显示的是我们可以编辑的子类
和Hibernate的代码生成工具相比,用该插件生成了更多的类。这是优点,也可能是一些潜在的缺点,将在Trade-Offs 部分进行讨论。你可以在工程配置文件中选取要生成的类和它们所在的包的结构。我可以证实这点,但现在的发行版有个bug ,,无法访问Mac OS X上的配置界面。针对该bug的一个补丁已经做好了,但仍没有发布。
基于Hibernate Synchronizer网页上的例子,和以下这个类一起,用那些新的数据访问对象来试着把一些数据放入 数据库 中。看起来和标准的Hibernate代码生成工具生成的版本(在Hibernate: A Developer's Notebook一书的39-40页)很相似,甚至更简单一些。因为Hibernate Synchronizer生成的类为你的每个数据库操作都创建和提交一个新事务,因此在与此类似的简单情况下,你不需要自己来设置事务(当然,假如你需要把一组操作作为一个单独事务,有很多方法可以做到这点)这里是新版本的代码。
package com.oreilly.hh;import java .sql.Time;
import java .util.Date;import net.sf.hibernate.HibernateException;
import com.oreilly.hh.dao.TrackDAO;import com.oreilly.hh.dao._RootDAO;
/** * Try creating some data using the Hibernate Synchronizer ap PR oach.
*/public class CreateTest2 {
public static void main(String[] args) throws HibernateException {
// Load the configuration file
_RootDAO.initialize();
// Create some sample data
TrackDAO dao = new TrackDAO();
Track track = new Track("Russian Trance", "vol2/album610/track02.mp3",
Time.valueOf("00:03:30"), new Date(), (short)0);
dao.save(track);
track = new Track("Video Killed the Radio Star",
"vol2/album611/track12.mp3", Time.valueOf("00:03:49"), new Date(),
(short)0);
dao.save(track);
// We don't even need a track variable, of course:
dao.save(new Track("Gravity's Angel", "/vol2/album175/track03.mp3",
Time.valueOf("00:06:06"), new Date(), (short)0));
}}
当我写这个的时候,有Ecl ip se在手边真是太好了 ,我已经忘了当写书中例子的时候多么想念智能代码完成功能,有另外几件事情JDT也发挥了作用。
为了在Eclipse中运行这个简单的程序,需要设置一个新的运行配置。用CreateTest2. java 作为当前文件,选择运行(Run )-> 运行...(Run...)。然后单击新建(New),因为该类有一个main() 方法,Eclipse推断出要运行该工程的当前类。Eclipse为新的运行配置取的名字,CreateTest2,很合适。屏幕窗口看起来如图19中所示,单击运行来在 数据库 中创建一些数据。
图19 预备在Eclipse中运行创建数据的测试程序
假如你确实按照上边说的来做,你会发现第一次的尝试运行失败。Hibernate抱怨配置文件中连一个映射文件都没有参考,为了运行程序,至少需要一个这样的文件。这也是为什么XMLBuddy在图16底部用黄色下划线发出警告。可以很轻易修改该错误,你只要在包资源浏览器(Package EXPlorer)中的Track.hbm.xml这个影射 文档 上单击右键,在Hibernate Synchronizer子菜单中选取Add Mapping Reference(如图17中所示),这样XMLBuddy就不会再抱怨XML文件有错误,程序也可以继续向前。不幸的是,没有向前推进我们所愿的那样远,下一个问题又出来了。Eclipse中显示的下一个错误是“不能在JNDI中找到JTA UserTransaction initial context”。不止我一个人犯这种错误,因为在a forum thread中有这样的讨论,而且到目前为止仍然没有找到一个解决方法。
既然我知道不需要使用JTA,我倒是很想知道为什么Hibernate竟然会使用JTA?打开Hibernate配置文件,如图16所示,看看是不是Hibernate Synchronizer在其中加入了可疑的内容。看了配置文件后,可以确定,有一些行看起来是罪魁祸首:
<property name="hibernate.transaction.factory_class">
net.sf.hibernate.transaction.JTATransactionFactory
</property>
<property name="jta.UserTransaction">
java :comp/UserTransaction </property>
一旦把那些行变成注释后,再次运行程序。这次,也就是第三次运行成功。我在自己计算机上运行没有一点错误,数据已经保存到 数据库 中。运行 ant db 这个target(在Developer's Notebook一书的第一章有相应的解释)可以把表中所有的数据显示出来(不可否认,这也许有点简单),如图20中所示。假如你跟着这篇文章中顺序来做的,而不是跟着书中步骤一步一步来的,你需要先运行ant schema来创建数据库中的表,或是删除以前试验留下的数据。
图20 在Eclipse中运行Ant
你可以在Eclipse内运行Ant的target,方法是用右键单击包资源浏览器(Package Explorer)中的build.xml 文件,选择菜单中的运行Ant(Run Ant),然后在弹出对话框中选择你要运行的target,如图21所示。这个功能很cool。
图21 在Eclipse中运行Ant
查询数据相当简单、直白,即使Hibernate Synchronizer产生了很多辅助方法来使用指定查询,我认为这些没有什么用处,都是运行查询,然后返回包含结果的列表,而不是返回一个Query对象,让你直接使用该对象。这使你不能使用任何Query提供的、方便的、类型安全(type-safe)的参数设置方法,因为这个,我打算让_RootDAO对象提供一个 session 对象,可以用“老式”的方法来使用Hibernate。公平来说,我认为假如编辑Hibernate Synchronizer 用来生成代码所使用的 模板 ,就可以生成想要的任何方法,假如有一个项目,要用到该插件,可以肯定我会试着这么做。
实际上,进一步考虑,当你得到一个活动的Session时,你只能使用Query,而这些DAO对象已经提供为相应功能最佳的实现。假如你和我在例子中使用查询的方法一样,那就需要你自己来实现session治理。你能够把session治理内嵌于你自己所写的那一半DAO中,这样可以给你提供两方面的好处。(译者注:和有base的 java POJO对象一样,对于DAO,该插件也生成一对类,一个base DAO给该插件用,一个是继续该base DAO的自定义DAO,你可以在其中添加商业逻辑)。这也是Hibernate Synchronizer把类分隔开来如此有用的另一个原因。对该插件的远见在下边做了一点研究
不管怎么说,下边是我第一次使用的代码,和书中48-49页上的代码功能
最近我开始使用Eclipse作为我的开发环境,部分原因是因为在我进行开发的许多平台上都可以使用Eclipse来工作,还有部分原因是因为Eclipse是展示人人皆可作出贡献的开放、可扩展环境的优势的一个极好的例子。我开始研究其他人提供的对Eclipse的扩展。例如,当用到xml文件时,我使用XMLBuddy插件。该插件对于我的工作很有助益。因为最近一直在写Developer's Notebook,所以我很想知道是不是已经有人写了关于Hibernate的插件,事实上,有好几个这样的插件正在开发。在这篇文章中,我们将探索其中之一:Hibernate Synchronizer.
Hibernate Synchronizer
在我找的和Hibernate有关的插件中,Hibernate Synchronizer最令我感爱好,因为它为我在Developer's Notebook书中采用的以映射为中心的工作流(mapping-centric workflow)提供了最好的支持。(可以用多种方法使用Hibernate,你可能会试试其它一些插件,它们提供的方法可能正是你自己特定环境所要求的)。事实上,当使用Hibernate Synchronizer时,假如你改变了映射文件,你不需要为更新相应的java文件而劳心费神。当你编辑映射文件时,和Eclipse采取的方法类似,该插件自动更新你的java代码。还不止于此,还提供了比Hibernate内建的代码生成工具更多的功能:它为每个映射对象创建一对类( a pair of classes),其中一个是基础类,当你改变映射内容时,它可以随意重写这个类;另一个类作为该基础类的子类,在子类中,你可以添加具体的商业逻辑和另一些代码。使用这个插件生成java代码时,不用象使用Hibernate内置的代码生成工具那样,担心其它代码(如商业逻辑的代码)会在你的眼皮底下消失。
对于以Hibernate影射文档为基础的方法,还有一些其它的好处,Hibernate Synchronizer有一个新编辑器,当编辑这类文件时,为Eclipse添加了智能辅助和自动完成功能。一个比较好的、以DTD驱动的XML编辑器,如以前提及的XMLBuddy,也可以完成部分功能。与此相比,Hibernate Synchronizer利用对影射文档语义的了解,提供了更进一步的功能。例如,提供了对属性和影射关系的可视化显示,创建新元素的向导界面,象以上提及的一样,缺省设置情况下,当你编辑影射文档时,编辑器会自动生成数据访问类(data-access class).
当然还有其它一些功能,在Eclipse的新建(New)菜单中,提供了一个向导,可以用来创建Hibernate配置文件和映射文件,在包资源浏览器(package eXPlorer)和其它一些合适的地方增加了上下文菜单,方便调用和Hibernate相关的功能。
好了,在这些抽象的描述之后,到了开始做实事的时候,当然,这正是你爱好所在,不然你就不会读这篇文章。怎么安装和使用呢?下边一一解释。
安装
Hibernate Synchronizer可以用Eclipse内置的更新治理器(Update Manager)来安装。对Eclipse 2.1和即将发布的Eclipse 3的用户提供了不同的更新站点。(因为用Eclipse作要害性的工作,我仍使用作为产品发行的2.1版。当我写这篇文章的时候,Eclipse 3已经进入了“候选发布”阶段。我希望当我今夏晚些时候从JavaOne回来时,我可以更新到版本3的产品发行版。提及这个的主要原因是因为我想强调一下,这些指南是以Eclipse 2的角度的来讲解,毫无疑问,一些命令和窗口会在版本3中发生变化,因此,当你使用Eclipse 3时,你应当做一些相应的调整。我印象中Hibernate Synchronizer自己的install instrUCtions是针对Eclipse 3,也许这对你有所帮助。
启动Eclipse,顺次单击帮助(Help) ->软件更新(Software Updates) -> 更新治理器(Update Manager)来打开更新治理器,当安装/更新(Install/Update)透视图打开之后,在功能更新视图(Feature Updates)中用右键单击(假如你用的单键,你需要control-click)。选择新建(New) -> 站点书签(Site Bookmark),如图1中所示。
图 1 在更新治理器中添加Hibernate Synchronizer插件的更新地址
在弹出对话框中,输入适合你的Eclipse版本的插件地址:
·Eclipse 2.1: http://www.binamics.com/hibernatesync/ eclipse 2.1
·Eclipse 3: http://www.binamics.com/hibernatesync
还需要为新建的书签命名,"Hibernate Synchronizer"就是个很贴切的名字。图2中显示的是在Eclipse 2.1.2中填完所有需要的信息后的对话框。填完之后,你可单击完成(Finish)按钮来完成增加书签。
图 2. Hibernate Synchronizer插件更新站点书签
单击完成(Finish)后,新建的书签就会出现在功能更新(Feature Updates) 视图中,如图3中所示.
图 3. Hibernate Synchronizer站点已经可以使用
为了实际安装该插件,单击该书签左边的三角形符号,然后再次单击在书签下边出现的条目左边的三角形符号,继续这个过程,一直到书签下边出现的条目中出现该插件的图标。单击该条目,就会出现一个可以让你安装的界面,如图4所示。
图 4. 预备开始安装插件
单击Install Now,让Eclipse引导你完成安装(如图5-10).
图 5. 安装Hibernate Synchronizer
图 6. 许可协议
你可以看看下边Trade-Offs部分对许可协议的一些讨论。当你打算在实际的项目中使用该插件时,想必你会仔细研究该协议。我认为也许好一点,不过该插件基于GPL协议,而不是开放 源代码 ,令人迷惑。
7. 选择安装位置,缺省的已经很好了
图 8. 安装没有签名插件时的标准警告
图 9 正在进行安装
图 10. 完成安装
现在已经完成安装,你需要退出,然后重新启动Eclipse以使所做的更改生效。看上边的对话框似乎说能够自动重新启动Eclipse。,以我的经验,Eclipse只会退出,还是需要你自己手工重新启动。这可能是Max OS X平台上Eclipse 2.1的一个局限。Eclipse 3已经许诺把对OS X的支持列入第一级别。无论如何,这只是个小问题。假如你需要重新启动Eclipse,现在就可以这样做。安装完之后,接着需要对其对其进行配置,以便在项目中使用。
配置
重新启动Eclipse后,关闭安装/更新透视图。打开一个使用Hibernate的Java工程.假如你已经完成了Developer's Notebook,一书中的例子,那么就有几个目录可供你选择,这里以书中第三章中的例子来说明。第三章是可以在线免费获得的样章,你还可以从该书的站点下载所有例子的 源代码 。
假如你打算使用其中的一个例子来新建一个Eclipse工程,选择文件(File) ->新建( New )-> 工程( PR oject),选定工程类型,然后单击下一步(Next),填入该工程名(我填的是"Hibernate Ch3",如图11所示),不要复选使用缺省检查框(Use default),这样你可以告诉Eclipse从哪里找到已经存在的工程目录,单击浏览按钮(Browse)来定位目录。选定工程目录后可以单击完成(Finish)来创建工程。不过,一般情况下我喜欢单击下一步(Next)来复查Eclipse为此工程所作的设置(当然,假如发现有些配置不对,总是可以选择回退来修改这些设置。不过,我总是发现,假如有一个库文件丢失或是其它一些原因,会有非常多的错误和警告信息)。
图 11. 创建一个需要使用Hibernate的新工程
在当前情况下,我的谨慎有点多余。Eclipse准确的算出了目录是如何组织以及是用来干什么的,找到我为使用Hibernate和 HSQLDB 数据库 而下载的第三方库(下载和安装的具体过程可以参看书中第一章)。如此聪明的适应能力是Eclipse优点之一。图12显示新工程已经打开,预备好可以用来做实验。从这个图中也可以推断Eclipse不喜欢调整窗口大小使其小到形成合适的屏幕布局。从现在开始,显示的屏幕截图只显示窗口的一部分,而不是完整的窗口。
图 12. 使用Chapter 3例子的工程
下一个需要做的工作是创建一个Hibernate配置文件,提供给Hibernate Synchronizer使用。在src目录中已经有了一个hibernate.properties文件,这是书中例子使用的配置。这里有个问题,坏消息是Hibernate Synchronizer只能使用XML样式的Hibernate配置文件。这样,就需要把hibernate.properties中的内容移植到XML样式的配置文件hibernate.cfg.xml中。好消息是,这正是Hibernate Synchronizer创建配置文件向导第一次大显身手的时候。选择文件(File) ->新建(New) -> 其它(Other),然后在弹出对话框选取刚可用的Hibernate类,选取 Hibernate Configuration File,然后单击下一步(Next).
图13 打开Hibernate配置文件向导
添加Driver Class 的方法有点希奇,你需要单击Browse按钮,然后开始输入driver的类名(译者注:你需要确定该driver类在该工程的类路径中)。假如你输入"jdbcD",窗口就会出现这个选择,很轻易就可以从中选取一个。具体如图15所示。
图15 指定HSQLDB的driver类
只要添加如图14中那些属性值就可以。完成后单击Finish来完成创建配置文件。Hibernate Synchronizer 现在已经可以开始使用了。完成创建文件后,配置文件会打开,这时候你就可以看看Hibernate xml 格式的配置文件的结构和细节。
图16 生成的配置文件
要想测试配置文件是否可用,有一个又快又简单的方法:使用向导来创建一个影射文件。选择文件(File) -> 新建(New) -> 其它(Other),选取Hibernate类别,然后再选Hibernate 影射文件,单击下一步(Next)。向导出现的时候,其中有些属性已经自动填入了在配置文件中相应属性的值,单击Refresh(确保可以通过这些信息和你的 数据库 相连)。和 数据库连接 后,会显示库中的表,这里只有一个TRACK表。第一次使用的时候,不知什么原因,需要你指定包含HSQLDB驱动的.jar文件的路径。好在你只需要指定一次。只要你认为工作正常(译者注:显示了 数据库 中有权限访问的表),单击Cancel。试验中使用已有的影射文件,不需要实际创建一个。
生成代码
这可能是你一直在等待的部分。我们能用这个插件来做什么?好,马上就开始。为Hibernate影射 文档 提供一个新的菜单条目。
右击(假如是单键鼠标,在按住Control键的同时点鼠标键)一个影射文档,菜单条目中会显示几个和Hibernate相关的选择(如图17所示),其中有一个和synchronize有关,这是一个手工方法,可以让Hibernate Synchronizer产生和该影射文档相对应的数据访问对象。
图17 Synchronizer插件为影射文档提供的几个菜单项
Add Mapping Reference 选项也很有用,当你单击该项时,会把相应的影射文件增加到Hibernate配置文件中,表明该文件是影射文档,因此你不需要在 源代码 中增加任何信息要求相应的影射文件进行设置。现在让我们看看选取Synchronize Files后的结果。
事情开始变得有趣,出现了两个子包,一个是“base”的DAO,Hibernate Synchronizer所有,可以在任何时候重写,一个是继续那些DAO类的商业对象,不会被覆盖,也就给了我们一个机会,可以在其中加入商业逻辑(具体如图18中所示)。
图18 同步后的DAO,图中显示的是我们可以编辑的子类
和Hibernate的代码生成工具相比,用该插件生成了更多的类。这是优点,也可能是一些潜在的缺点,将在Trade-Offs 部分进行讨论。你可以在工程配置文件中选取要生成的类和它们所在的包的结构。我可以证实这点,但现在的发行版有个bug ,,无法访问Mac OS X上的配置界面。针对该bug的一个补丁已经做好了,但仍没有发布。
基于Hibernate Synchronizer网页上的例子,和以下这个类一起,用那些新的数据访问对象来试着把一些数据放入 数据库 中。看起来和标准的Hibernate代码生成工具生成的版本(在Hibernate: A Developer's Notebook一书的39-40页)很相似,甚至更简单一些。因为Hibernate Synchronizer生成的类为你的每个数据库操作都创建和提交一个新事务,因此在与此类似的简单情况下,你不需要自己来设置事务(当然,假如你需要把一组操作作为一个单独事务,有很多方法可以做到这点)这里是新版本的代码。
package com.oreilly.hh;import java .sql.Time;
import java .util.Date;import net.sf.hibernate.HibernateException;
import com.oreilly.hh.dao.TrackDAO;import com.oreilly.hh.dao._RootDAO;
/** * Try creating some data using the Hibernate Synchronizer ap PR oach.
*/public class CreateTest2 {
public static void main(String[] args) throws HibernateException {
// Load the configuration file
_RootDAO.initialize();
// Create some sample data
TrackDAO dao = new TrackDAO();
Track track = new Track("Russian Trance", "vol2/album610/track02.mp3",
Time.valueOf("00:03:30"), new Date(), (short)0);
dao.save(track);
track = new Track("Video Killed the Radio Star",
"vol2/album611/track12.mp3", Time.valueOf("00:03:49"), new Date(),
(short)0);
dao.save(track);
// We don't even need a track variable, of course:
dao.save(new Track("Gravity's Angel", "/vol2/album175/track03.mp3",
Time.valueOf("00:06:06"), new Date(), (short)0));
}}
当我写这个的时候,有Ecl ip se在手边真是太好了 ,我已经忘了当写书中例子的时候多么想念智能代码完成功能,有另外几件事情JDT也发挥了作用。
为了在Eclipse中运行这个简单的程序,需要设置一个新的运行配置。用CreateTest2. java 作为当前文件,选择运行(Run )-> 运行...(Run...)。然后单击新建(New),因为该类有一个main() 方法,Eclipse推断出要运行该工程的当前类。Eclipse为新的运行配置取的名字,CreateTest2,很合适。屏幕窗口看起来如图19中所示,单击运行来在 数据库 中创建一些数据。
图19 预备在Eclipse中运行创建数据的测试程序
假如你确实按照上边说的来做,你会发现第一次的尝试运行失败。Hibernate抱怨配置文件中连一个映射文件都没有参考,为了运行程序,至少需要一个这样的文件。这也是为什么XMLBuddy在图16底部用黄色下划线发出警告。可以很轻易修改该错误,你只要在包资源浏览器(Package EXPlorer)中的Track.hbm.xml这个影射 文档 上单击右键,在Hibernate Synchronizer子菜单中选取Add Mapping Reference(如图17中所示),这样XMLBuddy就不会再抱怨XML文件有错误,程序也可以继续向前。不幸的是,没有向前推进我们所愿的那样远,下一个问题又出来了。Eclipse中显示的下一个错误是“不能在JNDI中找到JTA UserTransaction initial context”。不止我一个人犯这种错误,因为在a forum thread中有这样的讨论,而且到目前为止仍然没有找到一个解决方法。
既然我知道不需要使用JTA,我倒是很想知道为什么Hibernate竟然会使用JTA?打开Hibernate配置文件,如图16所示,看看是不是Hibernate Synchronizer在其中加入了可疑的内容。看了配置文件后,可以确定,有一些行看起来是罪魁祸首:
<property name="hibernate.transaction.factory_class">
net.sf.hibernate.transaction.JTATransactionFactory
</property>
<property name="jta.UserTransaction">
java :comp/UserTransaction </property>
一旦把那些行变成注释后,再次运行程序。这次,也就是第三次运行成功。我在自己计算机上运行没有一点错误,数据已经保存到 数据库 中。运行 ant db 这个target(在Developer's Notebook一书的第一章有相应的解释)可以把表中所有的数据显示出来(不可否认,这也许有点简单),如图20中所示。假如你跟着这篇文章中顺序来做的,而不是跟着书中步骤一步一步来的,你需要先运行ant schema来创建数据库中的表,或是删除以前试验留下的数据。
图20 在Eclipse中运行Ant
你可以在Eclipse内运行Ant的target,方法是用右键单击包资源浏览器(Package Explorer)中的build.xml 文件,选择菜单中的运行Ant(Run Ant),然后在弹出对话框中选择你要运行的target,如图21所示。这个功能很cool。
图21 在Eclipse中运行Ant
查询数据相当简单、直白,即使Hibernate Synchronizer产生了很多辅助方法来使用指定查询,我认为这些没有什么用处,都是运行查询,然后返回包含结果的列表,而不是返回一个Query对象,让你直接使用该对象。这使你不能使用任何Query提供的、方便的、类型安全(type-safe)的参数设置方法,因为这个,我打算让_RootDAO对象提供一个 session 对象,可以用“老式”的方法来使用Hibernate。公平来说,我认为假如编辑Hibernate Synchronizer 用来生成代码所使用的 模板 ,就可以生成想要的任何方法,假如有一个项目,要用到该插件,可以肯定我会试着这么做。
实际上,进一步考虑,当你得到一个活动的Session时,你只能使用Query,而这些DAO对象已经提供为相应功能最佳的实现。假如你和我在例子中使用查询的方法一样,那就需要你自己来实现session治理。你能够把session治理内嵌于你自己所写的那一半DAO中,这样可以给你提供两方面的好处。(译者注:和有base的 java POJO对象一样,对于DAO,该插件也生成一对类,一个base DAO给该插件用,一个是继续该base DAO的自定义DAO,你可以在其中添加商业逻辑)。这也是Hibernate Synchronizer把类分隔开来如此有用的另一个原因。对该插件的远见在下边做了一点研究
不管怎么说,下边是我第一次使用的代码,和书中48-49页上的代码功能