﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-The man can be destroyed,but never be defeated!-文章分类-Hibernate</title><link>http://www.blogjava.net/simida/category/743.html</link><description /><language>zh-cn</language><lastBuildDate>Fri, 02 Mar 2007 06:33:03 GMT</lastBuildDate><pubDate>Fri, 02 Mar 2007 06:33:03 GMT</pubDate><ttl>60</ttl><item><title>Java开源项目Hibernate快速入门[转载]</title><link>http://www.blogjava.net/Simida/articles/1971.html</link><dc:creator>游昌平</dc:creator><author>游昌平</author><pubDate>Sat, 12 Mar 2005 12:30:00 GMT</pubDate><guid>http://www.blogjava.net/Simida/articles/1971.html</guid><wfw:comment>http://www.blogjava.net/Simida/comments/1971.html</wfw:comment><comments>http://www.blogjava.net/Simida/articles/1971.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Simida/comments/commentRss/1971.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Simida/services/trackbacks/1971.html</trackback:ping><description><![CDATA[<SPAN id=ArticleContent1_ArticleContent1_lblContent><FONT size=2>其实Hibernate本身是个独立的框架，它不需要任何web server或application server的支持。然而，大多数的Hibernate入门介绍都加入了很多非Hibernate的东西，比如: Tomcat, Eclipse, Log4J,Struts, XDoclet, 甚至JBoss。这容易让人产生Hibernate复杂难懂的误解，特别是打击了初学者的积极性。 <BR><BR>　　在这篇文章将不涉及Eclipse, log4j, Struts, Tomcat, XDoclet，和JBoss。本文的目的是演示一下Hibernate的安装过程以及最基本的功能，从而给初学者一个低得不能再低的入门门槛。<BR><BR>　　<STRONG>下载文件</STRONG><BR><BR>　　你需要Java SDK、 Hibernate包、Ant包、和JDBC Driver。<BR><BR>　　1、Hibernate包下载地址:<BR>http://prdownloads.sourceforge.net/hibernate/?sort_by=date&amp;sort=desc<BR><BR>　　2、Ant包下载地址:<BR>http://apache.130th.net/ant/binaries/apache-ant-1.6.1-bin.zip<BR><BR>　　3、JDBC Driver要根据你用的database来定，一般database官方网站上都会有。Hibernate支持常用的database，比如 MySQL, Oracle, PostgreSQL, 和MS-SQL Server。这些数据库都有JDBC Driver: <BR><BR>　　Oracle JDBC Driver下载地址(下载前必须同意Oracle协议书)<BR>http://otn.oracle.com/software/htdocs/distlic.html?/software/tech/java/sqlj_jdbc/htdocs/jdbc9201.html<BR><BR>　　MySQL JDBC Driver下载地址<BR>http://dev.mysql.com/downloads/connector/j/3.0.html<BR><BR>　　PostgreSQL JDBC Driver下载地址<BR>http://jdbc.postgresql.org/download.html<BR><BR>　　MS-SQL Server JDBC Driver下载地址<BR>http://www.microsoft.com/downloads/details.aspx?FamilyID=9f1874b6-f8e1-4bd6-947c-0fc5bf05bf71&amp;displaylang=en<BR><BR>　　4、将Hibernate包和Ant包分别解压至c:\dev\下(此目录不重要，你可以换其它任何目录)。<BR><BR>　　<STRONG>配置环境</STRONG><BR><BR>　　1、你需要添加一个新的环境变量: ANT_HOME，让它指向c:\dev\＜你的ANT包所在目录＞。并在PATH环境变量里添加%ANT_HOME%\bin。<BR><BR>　　2、你需要添加一个新的环境变量: JAVA_HOME，让它指向你的j2sdk根目录。并在PATH环境变量里添加%JAVA_HOME%\bin。<BR><BR>　　3、创建一个项目目录，比如c:\workspace\My1stHibernate。<BR><BR>　　在项目目录下，另外创建三个目录: src, classes, lib。<BR><BR>　　在lib目录下，创建两个目录: hibernate和db。<BR><BR>　　这样你有了如下的文件结构:<BR><BR></FONT>
<TABLE borderColor=#ffcc66 width="90%" align=center bgColor=#e6e4dd border=1>
<TBODY>
<TR>
<TD><FONT size=2>c:\workspace\My1stHibernate\<BR>c:\workspace\My1stHibernate\src<BR>c:\workspace\My1stHibernate\classes<BR>c:\workspace\My1stHibernate\lib<BR>c:\workspace\My1stHibernate\lib\hibernate<BR>c:\workspace\My1stHibernate\lib\db</FONT></TD></TR></TBODY></TABLE><BR><FONT size=2>　　4、将c:\dev\＜你的Hibernate包所在目录＞\hibernate2.jar文件copy到c:\workspace\My1stHibernate\lib\hibernate下。<BR><BR>　　将c:\dev\＜你的Hibernate包所在目录＞\lib\下的所有文件同样copy到c:\workspace\My1stHibernate\lib\hibernate下。<BR><BR>　　将你的JDBC Driver文件(一般是一个jar文件)copy到c:\workspace\My1stHibernate\lib\db下。<BR><BR></FONT><SPAN class=f14><FONT size=2>　　<STRONG>创建数据库</STRONG><BR><BR>　　1、用你最喜爱的database软件，创建一个hibernate_test的数据库。<BR><BR>　　2、在此数据库下，新建一个table名为CUSTOMER<BR><BR></FONT>
<TABLE borderColor=#ffcc66 width="90%" align=center bgColor=#e6e4dd border=1>
<TBODY>
<TR>
<TD><FONT size=2>CREATE TABLE CUSTOMER<BR>(<BR>　CID INTEGER NOT NULL PRIMARY KEY, USERNAME VARCHAR(12) NOT NULL, PASSWORD VARCHAR(12) <BR>);</FONT></TD></TR></TBODY></TABLE><BR><FONT size=2>　　<STRONG>编写Java文件</STRONG><BR><BR></FONT>
<TABLE borderColor=#ffcc66 width="90%" align=center bgColor=#e6e4dd border=1>
<TBODY>
<TR>
<TD><FONT size=2>public class Customer {<BR>　private int id;<BR>　private String username;<BR>　private String password;<BR><BR>　public int getId() {<BR>　　return id;<BR>　}<BR><BR>　public String getPassword() {<BR>　　return password;<BR>　}<BR><BR>　public String getUsername() {<BR>　　return username;<BR>　}<BR><BR>　public void setId(int id) {<BR>　　this.id = id;<BR>　}<BR><BR>　public void setPassword(String password) {<BR>　　this.password = password;<BR>　}<BR><BR>　public void setUsername(String username) {<BR>　　this.username = username;<BR>　}<BR><BR>}</FONT></TD></TR></TBODY></TABLE><BR><FONT size=2>　　将此类存为c:\workspace\My1stHibernate\src\Customer.java文件。<BR><BR>　　<STRONG>编写Test类</STRONG><BR><BR></FONT>
<TABLE borderColor=#ffcc66 width="90%" align=center bgColor=#e6e4dd border=1>
<TBODY>
<TR>
<TD><FONT size=2>import net.sf.hibernate.*;<BR>import net.sf.hibernate.cfg.*;<BR><BR>public class Test {<BR><BR>　public static void main(String[] args) {<BR>　　try {<BR>　　　SessionFactory sf = new Configuration().configure().buildSessionFactory();<BR>　　　Session session = sf.openSession();<BR>　　　Transaction tx = session.beginTransaction();<BR><BR>　　　for (int i = 0; i ＜ 200; i++) {<BR>　　　　Customer customer = new Customer();<BR>　　　　customer.setUsername("customer" + i);<BR>　　　　customer.setPassword("customer");<BR>　　　　session.save(customer);<BR>　　　}<BR><BR>　　　tx.commit();<BR>　　　session.close();<BR>　　} catch (HibernateException e) {<BR>　　　e.printStackTrace();<BR>　　}<BR>　}<BR>}</FONT></TD></TR></TBODY></TABLE><BR><FONT size=2>　　将此类存为c:\workspace\My1stHibernate\src\Test.java文件。<BR><BR></FONT></SPAN><SPAN class=f14><FONT size=2>　　<STRONG>创建Hibernate映射文件</STRONG><BR><BR>　　因为这里只有一个Class --- Customer 和一个Table --- CUSTOMER，你只需要建立一个映射文件--- Customer.hbm.xml，来对应Customer类和CUSTOMER表之间的关系。<BR><BR></FONT>
<TABLE borderColor=#ffcc66 width="90%" align=center bgColor=#e6e4dd border=1>
<TBODY>
<TR>
<TD><FONT size=2>＜?xml version="1.0"?＞<BR>＜!DOCTYPE hibernate-mapping PUBLIC<BR>"-//Hibernate/Hibernate Mapping DTD//EN"<BR>"http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd"＞<BR><BR>＜hibernate-mapping＞<BR>＜class name="Customer" table="CUSTOMER"＞<BR>＜id name="id" column="CID"＞<BR>＜generator class="increment" /＞<BR>＜/id＞<BR>＜property name="username" column="USERNAME" /＞<BR>＜property name="password" column="PASSWORD" /＞<BR>＜/class＞<BR>＜/hibernate-mapping＞</FONT></TD></TR></TBODY></TABLE><BR><FONT size=2>　　把此文件存为c:\workspace\My1stHibernate\src\Customer.hbm.xml，和Customer.java放在同一目录下。<BR><BR>　　<STRONG>编写Ant build.xml文件</STRONG><BR><BR>　　你不一定要知道这个build.xml的细节，其实Ant也不是Hibernate所必须的。这里用Ant是为了简化一些任务，比如: 编译、copy、运行，等。<BR><BR></FONT>
<TABLE borderColor=#ffcc66 width="90%" align=center bgColor=#e6e4dd border=1>
<TBODY>
<TR>
<TD><FONT size=2>＜?xml version="1.0" ?＞<BR><BR>＜project name="My1stHibernate" default="build" basedir="."＞<BR><BR>＜property name="base.dir" value="." /＞<BR>＜property name="src.dir" value="src" /＞<BR>＜property name="lib.dir" value="lib" /＞<BR>＜property name="build.dir" value="classes" /＞<BR><BR>＜path id="myclasspath"＞<BR>＜fileset dir="${lib.dir}"＞<BR>＜include name="**/*.jar" /＞<BR>＜/fileset＞<BR>＜pathelement location="${build.dir}" /＞<BR>＜/path＞<BR><BR>＜target name="init"＞<BR>＜mkdir dir="${build.dir}" /＞<BR>＜/target＞<BR><BR>＜target name="build" depends="init" description="compile the source files"＞<BR>＜javac classpathref="myclasspath" srcdir="${src.dir}" destdir="${build.dir}" /＞<BR>＜copy todir="${build.dir}" ＞<BR>＜fileset dir="${src.dir}" ＞<BR>＜exclude name="**/*.java"/＞<BR>＜/fileset＞<BR>＜/copy＞<BR>＜/target＞<BR><BR>＜target name="run" depends="build"＞<BR>＜java classpathref="myclasspath" classname="Test" fork="true" /＞<BR>＜/target＞<BR><BR>＜target name="clean"＞<BR>＜delete includeEmptyDirs="true"＞<BR>＜fileset dir="${build.dir}" /＞<BR>＜/delete＞<BR>＜/target＞<BR><BR>＜/project＞</FONT></TD></TR></TBODY></TABLE><BR><FONT size=2>　　<STRONG>配置Hibernate描述文件</STRONG><BR><BR>　　Hibernate描述文件可以是一个properties或xml 文件，其中最重要的是定义数据库的连接。我这里列出的是一个XML格式的hibernate.cfg.xml描述文件。<BR><BR></FONT>
<TABLE borderColor=#ffcc66 width="90%" align=center bgColor=#e6e4dd border=1>
<TBODY>
<TR>
<TD><FONT size=2>＜?xml version="1.0" encoding="utf-8" ?＞<BR>＜!DOCTYPE hibernate-configuration<BR>PUBLIC "-//Hibernate/Hibernate Configuration DTD//EN"<BR>"http://hibernate.sourceforge.net/hibernate-configuration-2.0.dtd"＞<BR><BR>＜hibernate-configuration＞<BR><BR>＜session-factory name="java:/hibernate/HibernateFactory"＞<BR><BR>＜property name="show_sql"＞true＜/property＞<BR>＜property name="connection.driver_class"＞<BR>oracle.jdbc.driver.OracleDriver ＜!-- 这里是Oracle 9i的JDBC driver class名 --＞<BR>＜/property＞<BR>＜property name="connection.url"＞<BR>jdbc:oracle:oci8:@hibernate_test ＜!-- 这里是Oracle的hibernate_test数据库URL --＞ <BR>＜/property＞<BR>＜property name="connection.username"＞<BR>你的数据库用户名<BR>＜/property＞<BR>＜property name="connection.password"＞<BR>你的数据库密码<BR>＜/property＞<BR>＜property name="dialect"＞<BR>net.sf.hibernate.dialect.Oracle9Dialect ＜!-- 这里是Oracle 9i的Dialect --＞<BR>＜/property＞<BR><BR>＜mapping resource="Customer.hbm.xml" /＞ ＜!-- 指定Customer的映射文件 --＞<BR><BR>＜/session-factory＞<BR><BR>＜/hibernate-configuration＞</FONT></TD></TR></TBODY></TABLE><BR><FONT size=2>　　如果你用的不是Oracle 9i，可到C:\dev\＜你的Hibernate包所在目录＞\src\hibernate.properties文件里找到你的数据库，然后替换以上相对应的值。<BR><BR>　　<STRONG>开始运行</STRONG><BR><BR>　　到c:\workspace\My1stHibernate下，运行ant run。如果你严格依照以上步骤，应该看到<BR><BR></FONT>
<TABLE borderColor=#ffcc66 width="90%" align=center bgColor=#e6e4dd border=1>
<TBODY>
<TR>
<TD><FONT size=2>run:<BR>[java] log4j:WARN No appenders could be found for logger (net.sf.hibernate.cfg.Environment).<BR>[java] log4j:WARN Please initialize the log4j system properly.<BR>[java] Hibernate: insert into CUSTOMER (USERNAME, PASSWORD, CID) values (?, ?, ?)<BR>BUILD SUCCESSFUL</FONT></TD></TR></TBODY></TABLE><BR><FONT size=2>　　到你的hibernate_test数据库看一下，在CUSTMOR表里新添了200条记录，但你没有写任何JDBC code。<BR><BR>　　以后如果你要更换数据库，只需要改变hibernate.cfg.xml描述文件里相应的值即可。</FONT></SPAN><BR><FONT size=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;文章出自：<A href="http://blog.csdn.net/ba5590484/archive/2005/01/29/272826.aspx">http://blog.csdn.net/ba5590484/archive/2005/01/29/272826.aspx</A></FONT></SPAN><img src ="http://www.blogjava.net/Simida/aggbug/1971.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Simida/" target="_blank">游昌平</a> 2005-03-12 20:30 <a href="http://www.blogjava.net/Simida/articles/1971.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用 Hibernate 将 Java 对象持久保存到 IBM DB2 通用数据库中[转载]</title><link>http://www.blogjava.net/Simida/articles/1970.html</link><dc:creator>游昌平</dc:creator><author>游昌平</author><pubDate>Sat, 12 Mar 2005 12:24:00 GMT</pubDate><guid>http://www.blogjava.net/Simida/articles/1970.html</guid><wfw:comment>http://www.blogjava.net/Simida/comments/1970.html</wfw:comment><comments>http://www.blogjava.net/Simida/articles/1970.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Simida/comments/commentRss/1970.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Simida/services/trackbacks/1970.html</trackback:ping><description><![CDATA[<P><FONT size=2>&nbsp;</FONT></P>
<P><STRONG class=subhead><BR><FONT size=2>引言</FONT></STRONG><BR></P>
<P><FONT size=2>让我们面对现实吧，如果您在企业应用程序中以手工方式编写 SQL 语句的代码，那么您将花费大量的开发时间去更新和维护持久性层。要是能够方便地将现有 Java™ 对象持久保存到关系数据库（如 IBM® DB2® Universal Database™，UDB）岂不是很好？</FONT></P>
<P><FONT size=2>幸运的是存在这样的办法。对象／关系（Object/Relational，O/R）映射工具是一些成熟的工具，它们能够将对象映射到关系数据库中的行，从而不再需要复杂的持久层，并且使开发人员只需编写最少的 SQL，在多数情况下不需编写任何 SQL。</FONT></P>
<P><FONT size=2>Hibernate 是按照 LGPL 许可证发布的开放式源代码应用程序，它是“用于 Java 的超高性能的对象／关系持久性和查询服务”。在本文中，我们将为您说明如何使用 Hibernate 方便地（一行 SQL 代码都不用写）将 Java 对象持久保存到 DB2 数据库中。</FONT></P>
<P><FONT size=2>为了演示 Hibernate 的工作机制，我们将创建一个简单的类模型，它由两个类组成：Employee 和 Department。为了简单起见，一名员工（employee）有一个部门（department），而部门没有到员工的引用。有关类图参阅</FONT><A href="http://www-900.ibm.com/developerWorks/cn/dmdd/library/techarticles/0306bhogal/0306bhogal.shtml#fig1"><FONT color=#002c99 size=2>图 1</FONT></A><FONT size=2>。</FONT></P>
<P class=caption><A name=fig1><FONT size=2>图 1. Employee/Department 类图</FONT></A></P>
<P><FONT size=2><BR></FONT>&nbsp;</P>
<P><FONT size=2><IMG height=359 alt="Employee/Department 类图" src="http://www-900.ibm.com/developerWorks/cn/dmdd/library/techarticles/0306bhogal/images/ClassDiagram1.gif" width=597></FONT></P>
<P><FONT size=2>我们将使用 WebSphere® Studio 5.0 的 Application Developer 配置和一个称为 Hibernator 的插件来开发应用程序，Hibernator 能简化一些配置 Hibernate 的工作。</FONT></P><A id=1 name=1></A>
<P><FONT size=2><STRONG class=subhead>设置 WebSphere Studio 和 Java 项目</STRONG><BR></FONT></P>
<P><FONT size=2>首先，让我们花些时间准备实验所需的要素：</FONT></P>
<UL class=standard>
<LI><FONT size=2>在 WebSphere Studio 中创建一个新的 Java 项目。 </FONT>
<LI><FONT size=2>从 </FONT><A href="http://sourceforge.net/projects/hibernate/"><FONT color=#002c99 size=2>http://sourceforge.net/projects/hibernate/</FONT></A><FONT size=2> 下载 Hibernate。在撰写本文时，Hibernate 的版本是 1.2.4。 </FONT>
<LI><FONT size=2>解压缩从 SourceForge 得到的 Hibernate 压缩文档，将其中的内容解压缩到一个临时目录。 </FONT>
<LI><FONT size=2>将名为 <CODE>hibernate.jar</CODE> 的 JAR 文件导入到项目的基本目录。 </FONT>
<LI><FONT size=2>从 Hibernate 分发包中的 lib 目录导入以下 jar 文件： </FONT>
<UL class=standard>
<LI><FONT size=2><CODE>commons-lang.jar</CODE> </FONT>
<LI><FONT size=2><CODE>commons-collections.jar</CODE> </FONT>
<LI><FONT size=2><CODE>commons-logging.jar</CODE> </FONT>
<LI><FONT size=2><CODE>xml-apis.jar</CODE> </FONT>
<LI><CODE><FONT size=2>xerces.jar</FONT></CODE></LI></UL>
<LI><FONT size=2>将 <CODE>hibernate.jar</CODE> 添加到您的 Java 构建路径（Java Build Path）（用鼠标右键单击 <B>project -&gt; Properties -&gt; Java Build Path -&gt; Libraries -&gt; Add JARs...</B>，然后指向您所导入的 <CODE>hibernate.jar</CODE>）。 </FONT>
<LI><FONT size=2>从 SourceForge（</FONT><A href="http://sourceforge.net/projects/hibernator/"><FONT color=#002c99 size=2>http://sourceforge.net/projects/hibernator/</FONT></A><FONT size=2>）下载 Hibernate Eclipse 插件。您会看到，这个插件使得同步现有的 Java 类和定义我们的 O-R 映射规则的 Hibernate 映射文件更容易。在撰写本文时，该插件的版本是 0.9.3。 </FONT>
<LI><FONT size=2>将这个插件的压缩文件解压缩到 <CODE>[WSAD 5 InstallDir]\eclipse\plugins\</CODE> 目录。 </FONT>
<LI><FONT size=2>要与 DB2 UDB 进行交互，我们还需要导入 DB2 JDBC 数据库驱动程序。导入缺省情况下位于 <CODE>C:\program files\IBM\SQLLIB\java\</CODE> 目录的 db2java.zip 文件。确保将 <CODE>db2java.zip</CODE> 添加到类路径中。 </FONT>
<LI><FONT size=2>我们已经在本文</FONT><A href="http://www-900.ibm.com/developerWorks/cn/dmdd/library/techarticles/0306bhogal/0306bhogal.shtml#11"><FONT color=#002c99 size=2>所附带的代码</FONT></A><FONT size=2>中包含了一些 JUnit 测试。如果要运行这些测试，需要导入缺省情况下位于 <CODE>[WSAD5InstallDir]\eclipse\plugins\org.junit_3.7.0</CODE> 目录的 <CODE>junit.jar</CODE> 文件。 </FONT>
<LI><FONT size=2>我们必须重新启动 WebSphere Studio，以便它注册我们所添加的插件。 </FONT></LI></UL><A id=2 name=2></A>
<P><FONT size=2><STRONG class=subhead>配置 hibernate.properties</STRONG><BR></FONT></P>
<P><FONT size=2>为了促进与 DB2 UDB 的通信，我们需要让 Hibernate 知道一些我们的数据库属性。为此，我们将创建一个名为 <CODE>hibernate.properties</CODE> 的文件，这个文件必须出现在我们应用程序的类路径中。在我们的示例中，我们将把这个属性文件放到项目的基本目录中，这个目录包含在类路径中。您可能需要针对您自己的数据库设置更改下列属性值。</FONT></P>
<P>
<TABLE cellSpacing=1 cellPadding=5 width=600 border=1>
<TBODY>
<TR vAlign=top>
<TD class=standard bgColor=#ffffcc><PRE class=code><FONT size=2>hibernate.connection.driver_class = COM.ibm.db2.jdbc.app.DB2Driver
hibernate.connection.url = jdbc:db2:empl
hibernate.connection.username = db2admin
hibernate.connection.password = db2admin
hibernate.dialect = cirrus.hibernate.sql.DB2Dialect
</FONT></PRE></TD></TR></TBODY></TABLE></P>
<P><FONT size=2>如果您曾经不得已编写过检索 JDBC 连接的代码，那么前四个参数对您来说应该是很熟悉的。hibernate.dialect 属性告诉 hibetnate 我们在使用 DB2“方言”（dialect）。设置这个“方言”允许 Hibernate 在缺省情况下启用一些特定于 DB2 的功能，这样您就不用手工设置它们了。</FONT></P><A id=3 name=3></A>
<P><FONT size=2><STRONG class=subhead>创建数据库模式</STRONG><BR></FONT></P>
<P><FONT size=2>上面的属性文件引用了我们还未创建的名为 empl 的数据库。让我们继续向前，完成这项工作。让我们转到 DB2 命令行处理器：</FONT></P><PRE class=code><FONT size=2>db2=&gt; create db empl

db2=&gt; connect to empl user db2admin using db2admin
</FONT></PRE>
<P><FONT size=2>此外，我们需要用到一些表：</FONT></P><PRE class=code><FONT size=2>db2=&gt; create table Employee (
	EID int NOT NULL PRIMARY KEY, 
	FirstName varchar(30) NOT NULL,
	LastName varchar(30) NOT NULL,
	Email varchar(30) NOT NULL,
	ManagerEID int, DepartmentID int NOT NULL)


db2=&gt; create table Department(
DepartmentID int NOT NULL PRIMARY KEY,
	Name varchar(30) NOT NULL,
	City varchar(30) NOT NULL,
	State varchar(30) NOT NULL)
</FONT></PRE><A id=4 name=4></A>
<P><FONT size=2><STRONG class=subhead>创建要被映射的 JavaBeans</STRONG><BR></FONT></P>
<P><FONT size=2>回想一下，您阅读本文目的正是要将 Java 对象映射到数据库。那我们就来定义这些对象：</FONT></P>
<H2><FONT size=2>创建新的类 Department：</FONT></H2>
<P>
<TABLE cellSpacing=1 cellPadding=5 width=600 border=1>
<TBODY>
<TR vAlign=top>
<TD class=standard bgColor=#ffffcc><PRE class=code><FONT size=2>package com.ibm.hibernate_article;

public class Department
{	
	private int departmentID;	
	private String name;	
	private String city;	
	private String state;}
</FONT></PRE></TD></TR></TBODY></TABLE></P>
<H2><FONT size=2>创建新的类 Employee：</FONT></H2>
<P>
<TABLE cellSpacing=1 cellPadding=5 width=600 border=1>
<TBODY>
<TR vAlign=top>
<TD class=standard bgColor=#ffffcc><PRE class=code><FONT size=2>package com.ibm.hibernate_article;

public class Employee
{	

	private int employeeId;	
	private String firstName;	
	private String lastName;	
	private String email;	
	private Employee manager;	
	private Department department;}
</FONT></PRE></TD></TR></TBODY></TABLE></P>
<P><FONT size=2>对于我们新创建的两个类：</FONT></P>
<OL class=standard>
<LI><FONT size=2>在大纲视图中，用鼠标右键单击类名。 </FONT>
<LI><FONT size=2>选择 <B>Generate Getter and Setter...</B>。 </FONT>
<LI><FONT size=2>选择 <B>All</B>。 </FONT>
<LI><FONT size=2>单击 <B>OK</B>。 </FONT></LI></OL>
<P><FONT size=2>请记住，所有的 setter 和 getter 都必须存在，不过它们的可视性无关紧要。这样，如果您需要维护不变的对象，那么您可以在构造该对象期间设置其状态，并且将所有 setter 方法设为私有。除了所创建的任何其它构造器之外，您还必须提供一个缺省构造器；不过，缺省构造器的可视性也可以设为私有。setter 和 getter 方法以及缺省构造器之所以必须存在，是因为 Hibernate 遵循 JavaBeans 语法并且使用这些方法特征符来在 O/R 映射期间持久保持数据。</FONT></P><A id=5 name=5></A>
<P><FONT size=2><STRONG class=subhead>创建 XML 映射</STRONG><BR></FONT></P>
<P><FONT size=2>既然 Java 类和数据库表已经准备就绪，现在我们需要定义 O/R 映射。Hibernate 通过读取包含映射定义的 XML 文件来实现这个目标。</FONT></P>
<P><FONT size=2>让我们首先为 Employee 类创建映射。</FONT></P>
<OL class=standard>
<LI><FONT size=2>在编辑器中打开 <CODE>Employee.java</CODE> 文件。 </FONT>
<LI><FONT size=2>单击 <B>Window -&gt; Show View -&gt; Other -&gt; Hibernator -&gt; Hibernator</B>（请参阅</FONT><A href="http://www-900.ibm.com/developerWorks/cn/dmdd/library/techarticles/0306bhogal/0306bhogal.shtml#fig2"><FONT color=#002c99 size=2>图 2</FONT></A><FONT size=2>）。 </FONT>
<P class=caption><A name=fig2><FONT size=2>图 2. 显示 Hibernator 视图</FONT></A></P><BR>
<P><FONT size=2><IMG height=434 alt="显示 Hibernator 视图" src="http://www-900.ibm.com/developerWorks/cn/dmdd/library/techarticles/0306bhogal/images/showview.gif" width=298></FONT></P>
<LI><FONT size=2>在 Hibernator 视图中用鼠标右键单击，然后单击 <B>Save</B>（</FONT><A href="http://www-900.ibm.com/developerWorks/cn/dmdd/library/techarticles/0306bhogal/0306bhogal.shtml#fig3"><FONT color=#002c99 size=2>图 3</FONT></A><FONT size=2>）。 </FONT>
<P class=caption><A name=fig3><FONT size=2>图 3. 用 Hibernator 插件生成 O/R 映射 XML 文件</FONT></A></P><BR>
<P><FONT size=2><IMG height=395 alt="用 Hibernator 插件生成 O/R 映射 XML 文件" src="http://www-900.ibm.com/developerWorks/cn/dmdd/library/techarticles/0306bhogal/images/ormapping2.gif" width=473></FONT></P></LI></OL>
<P><FONT size=2>我们还必须做一些编辑工作，但该视图实际上没有提供编辑功能，它只是生成 <CODE>.hbm.xml</CODE> 文件。这样，我们将需要在常规的文件编辑器中打开 <CODE>Employee.hbm.xml</CODE> 文件。</FONT></P>
<H2><FONT size=2>分析映射文件</FONT></H2>
<P><FONT size=2>该插件生成了一个文件，内容如下：</FONT></P>
<P>
<TABLE cellSpacing=1 cellPadding=5 width=600 border=1>
<TBODY>
<TR vAlign=top>
<TD class=standard bgColor=#ffffcc><PRE class=code><?xml version="1.0"?>

<FONT size=2>  
<HIBERNATE-MAPPING>    
  <CLASS table="employee" name="com.ibm.hibernate_article.Employee">
    <MANY-TO-ONE name="department" />        
    <property name="email"></property>        
    <property name="employeeId"></property>        
    <property name="firstName"></property>        
    <property name="lastName"></property>        
    <MANY-TO-ONE name="manager" />    
  </CLASS>
  
</HIBERNATE-MAPPING>
<!-- parsed in 0ms -->
</FONT></PRE></TD></TR></TBODY></TABLE></P>
<P><FONT size=2>您会注意到，在 DOCTYPE 中定义的文档类型定义（document type definition，DTD）文件存在于指定的 URL（即 <CODE>http://hibernate.sourceforge.net/hibernate-mapping.dtd</CODE>）。如果该映射文件存在于类路径中，那么 Hibernate 将总是首先从那里引用它。因为该映射文件在 hibernate.jar 文件中，所以将会在您的类路径中，因此，您将不必担心需要手工将它导入。这个文件用来定义 XML 文件中允许的有效标记。</FONT></P>
<P><CODE><HIBERNATE-MAPPING></CODE><FONT size=2>标记是这个 XML 文件中的基本标记。这个标记有两个可选的属性，但我们的应用程序不需要它们。请参阅 Hibernate 文档，了解关于这些特征的更多信息。</FONT></P>
<P><CODE><CLASS></CODE><FONT size=2>元素代表一个持久的 Java 类。它有一个 name（名称）属性，这个属性引用我们正在映射的 Java 类的全限定（用点隔开）类名。它还有一个 table（表）属性，这个属性引用我们的类所映射到的数据库表（即员工表）。该插件没有为我们生成 table 属性，所以我们将在下一节中添加它。</FONT></P>
<P><CODE><CLASS></CODE><FONT size=2>元素还必须包含一个 <CODE><ID></CODE>元素，用来指定哪个字段是该数据库表的主键，并指定如何生成该主键。我们同样将在下一节中讨论这个问题。</FONT></P>
<P><FONT size=2>Hibernate 文档提到：“<CODE><property></CODE> 元素声明了持久的类的 JavaBean 样式属性”。该属性主要用于基本类型或字符串类型的实例变量。在我们的示例中，员工的名字必须用一个 <CODE><property></CODE>元素来代表。</FONT></P>
<P><FONT size=2>many-to-one（多对一）元素用于“与另一个持久类的普通关联……。关系模型是一种多对一（many-to-one）关联。（它实际上就是一个对象引用。）”在我们的示例中，Employee 类与 Department 类之间存在 many-to-one 关联。</FONT></P>
<H2><FONT size=2>修改映射文件</FONT></H2>
<P><FONT size=2>我们的 <CODE>employeeId</CODE> 实例变量将映射到数据库中的 <CODE>EID</CODE> 列。因为 <CODE>EID</CODE> 将成为我们的主键，所以我们需要除去为 <CODE>employeeId</CODE> 生成的 property 元素，并且用 <CODE>id</CODE> 元素替代它：</FONT></P>
<P>
<TABLE cellSpacing=1 cellPadding=5 width=600 border=1>
<TBODY>
<TR vAlign=top>
<TD class=standard bgColor=#ffffcc><PRE class=code><ID name=" employeeId " column="EID"><FONT size=2>	
	<GENERATOR class=assigned />
</ID>
</FONT></PRE></TD></TR></TBODY></TABLE></P>
<P><CODE><ID></CODE><FONT size=2>元素的 name 属性引用我们的类中的 JavaBean 参数的名称。column 属性引用数据库中我们映射到的列。generator 元素的 class 属性被设置成“assigned”，意思是我们打算自己指定对象中主键的值。对于自动生成主键，还有其它一些 Hibernate 选项可供选择。您可以在 Hibernate 文档中找到关于这些选项的更多信息。</FONT></P>
<P><FONT size=2>现在，我们需要进一步修改该插件所生成的代码，并着手定义每一个 <CODE><property></CODE>和 <CODE><MANY-TO-ONE></CODE>标记将映射到哪些列：</FONT></P>
<P>
<TABLE cellSpacing=1 cellPadding=5 width=600 border=1>
<TBODY>
<TR vAlign=top>
<TD class=standard bgColor=#ffffcc><PRE class=code><FONT size=2><property name="email" column="Email"></property>
<property name="firstName" column="FirstName"></property>
<property name="lastName" column="LastName"></property>

<MANY-TO-ONE name="department" column="departmentID" />
<MANY-TO-ONE name="manager" column="managerEID" />
</FONT></PRE></TD></TR></TBODY></TABLE></P>
<P><FONT size=2>这样，修改后的文档内容如下：</FONT></P>
<P>
<TABLE cellSpacing=1 cellPadding=5 width=600 border=1>
<TBODY>
<TR vAlign=top>
<TD class=standard bgColor=#ffffcc><PRE class=code><?xml version="1.0"?>

<FONT size=2>  
<HIBERNATE-MAPPING>    
  <CLASS table="employee" name="com.ibm.hibernate_article.Employee">		
  
  	<ID name="employeeId" column="EID">			
  		<GENERATOR class=assigned />		
  	</ID>               		
  	
  	<property name="email" column="Email"></property>		
  	<property name="firstName" column="FirstName"></property>		
  	<property name="lastName" column="LastName"></property>  		
  	
  	<MANY-TO-ONE name="department" column="departmentID" />		
  	<MANY-TO-ONE name="manager" column="managerEID" />     
  
  </CLASS>
  
</HIBERNATE-MAPPING>
</FONT></PRE></TD></TR></TBODY></TABLE></P>
<P><FONT size=2>我们将对 <CODE>Department.hbm.xml</CODE> 做本质上一样的处理。最后得到的结果如下：</FONT></P>
<P>
<TABLE cellSpacing=1 cellPadding=5 width=600 border=1>
<TBODY>
<TR vAlign=top>
<TD class=standard bgColor=#ffffcc><PRE class=code><?xml version="1.0"?>

<FONT size=2>  
<HIBERNATE-MAPPING>    
  <CLASS table="department" name="com.ibm.hibernate_article.Department">
      	<ID name="departmentID" column="DepartmentID">
      			<GENERATOR class=assigned />		
      		</ID>        
      	<property name="city" column="City"></property>        
      	<property name="name" column="Name"></property>        
      	<property name="state" column="State"></property>    
  </CLASS>
  
</HIBERNATE-MAPPING>
</FONT></PRE></TD></TR></TBODY></TABLE><A id=6 name=6></A></P>
<P><FONT size=2><STRONG class=subhead>创建数据源和会话</STRONG><BR></FONT></P>
<P><FONT size=2>我们需要将 XML 映射装入到某种对象表示中，这样 Hibernate 才可以使用它们。具体做法是创建 <CODE>cirrus.hibernate.Datastore</CODE> 类的一个实例。然后我们告诉这个 Datastore 实例为给定的类存储映射信息，办法是调用 storeClass 方法并给这个方法提供给定类的 Class 对象。storeClass 方法知道使用全限定类名在同一个包内查找相应的 <CODE>.hbm.xml</CODE> 映射文件。</FONT></P>
<P><FONT size=2>在拥有 Datastore 对象之后，我们需要用它来构建 SessionFactory。这个 SessionFactory 将负责创建一些 Session 对象。Hibernate 文档将会话定义为“单线程的、存在时间短的对象，代表应用程序与持久存储之间的对话”。会话包装 JDBC 连接，充当 <CODE>Transaction</CODE> 对象的工厂，并管理应用程序中的持久对象。会话可以跨越多个事务，所以它不必像事务那样代表一个工作原子单元。</FONT></P>
<P><FONT size=2>让我们创建一个静态的初始化程序，它将负责创建 SessionFactory 对象。当第一次引用该类时，这个静态的初始化程序将装入一次。在静态地装入这个初始化程序之后，我们将不再需要重新装入 <CODE>Employee</CODE> 和 <CODE>Department</CODE> 类映射。</FONT></P>
<P>
<TABLE cellSpacing=1 cellPadding=5 width=600 border=1>
<TBODY>
<TR vAlign=top>
<TD class=standard bgColor=#ffffcc><PRE class=code><FONT size=2>private SessionFactory sessionFactory;

static {	
	try	
	{		
		Datastore ds = Hibernate.createDatastore();
		ds.storeClass(Employee.class);		
		ds.storeClass(Department.class);		
		sessionFactory = ds.buildSessionFactory();	
	}	
	catch (Exception e)	
	{		
		throw new RuntimeException("couldn't get connection");	
	}
}
</FONT></PRE></TD></TR></TBODY></TABLE></P>
<P><FONT size=2>在上述代码中，Datastore 对象通过调用 <CODE>buildSessionFactory</CODE> 方法获取 <CODE>SessionFactory</CODE> 的一个实例。如果没有给 <CODE>buildSessionFactory</CODE> 方法提供任何参数，它会在运行时类路径中查找缺省属性文件（即我们前面创建的 <CODE>hibernate.properties</CODE> 文件）查找。另一种办法是，如果在代码中需要对 properties 进行这种控制，可以将 <CODE>Properties</CODE> 对象传递给 <CODE>buildSessionFactory</CODE> 方法。</FONT></P>
<P><FONT size=2>在该静态的初始化程序初始化 <CODE>SessionFactory</CODE> 对象之后，我们就可以调用 <CODE>openSession()</CODE> 方法。这个静态方法将为我们返回一个新的会话对象。如果您调用 <CODE>openSession</CODE> 时没有提供参数，<CODE>SessionFactory</CODE> 将为您自动管理 <CODE>Connection</CODE>。许多连接参数（如池的大小、语句高速缓存以及空闲时间）都可以通过 <CODE>hibernate.properties</CODE> 文件中的参数（或提供给 <CODE>SessionFactory</CODE> 的 properties 对象）进行配置。有关更多详细信息，请参阅 Hibernate 文档。</FONT></P>
<P><FONT size=2>如果您的程序已经有一个现有的连接管理基础结构，那么您可以给 <CODE>openSession(Connection con)</CODE> 方法提供一个连接，Hibernate 将使用您提供的连接。</FONT></P><A id=7 name=7></A>
<P><FONT size=2><STRONG class=subhead>操作数据库对象</STRONG><BR></FONT></P>
<P><FONT size=2>这一节描述如何写到数据库中，如何从数据库装入对象以及如何更新和查询数据库。</FONT></P>
<H2><FONT size=2>写到数据库</FONT></H2>
<P><FONT size=2>要写到数据库，我们将使用 <CODE>SessionFactory</CODE> 对象打开一个新的会话。然后，我们将创建想持久保存的对象并将它保存到会话中。接着，我们刷新（flush）会话，在连接上调用提交（commit），最后关闭（close）会话。</FONT></P>
<P><FONT size=2>刷新会话会强制 Hibernate 把内存中的数据和数据库同步起来。Hibernate 将定期自动刷新，但不能保证在什么时候进行。于是，我们将内存中的数据显式刷新到数据库，从而确保数据立即写入数据库。</FONT></P>
<P><FONT size=2>在关闭会话之前，还必须确保提交了数据库连接。</FONT></P>
<P>
<TABLE cellSpacing=1 cellPadding=5 width=600 border=1>
<TBODY>
<TR vAlign=top>
<TD class=standard bgColor=#ffffcc><PRE class=code><FONT size=2>Session session = sessionFactory.openSession();

department = new Department();
department.setCity("Austin");
department.setState("TX");
department.setName("IBM Global Services");
department.setDepartmentID(211);

session.save(department);
session.flush();
session.connection().commit();
session.close();
</FONT></PRE></TD></TR></TBODY></TABLE></P>
<H2><FONT size=2>从数据库装入对象</FONT></H2>
<P><FONT size=2>装入对象就是使用对象的标识将对象调回到内存中的过程。这与我们在</FONT><A href="http://www-900.ibm.com/developerWorks/cn/dmdd/library/techarticles/0306bhogal/0306bhogal.shtml#8"><FONT color=#002c99 size=2>查询数据库</FONT></A><FONT size=2>中讨论的查询对象不同。</FONT></P>
<P><FONT size=2>为了从数据库装入对象，我们同样需要一个会话。我们还需要想装入的对象的主键。就我们前面所编写的示例来说，如果想将 <CODE>Department</CODE> 装回到对象中，我们可以用表示 <CODE>Department</CODE> 的 <CODE>Class</CODE> 对象来调用 <CODE>session.load</CODE> 方法，我们的主键是“211”。</FONT></P>
<P>
<TABLE cellSpacing=1 cellPadding=5 width=600 border=1>
<TBODY>
<TR vAlign=top>
<TD class=standard bgColor=#ffffcc><PRE class=code><FONT size=2>Session session = sessionFactory.openSession();

Department dept = (Department) session.load(Department.class, new Integer(211));
session.close();
</FONT></PRE></TD></TR></TBODY></TABLE></P>
<H2><FONT size=2>更新数据库</FONT></H2>
<P><FONT size=2>要更新一个对象，可以在创建该对象的那个会话中进行，也可以在一个完全不同的会话中进行。在同一个会话中更新对象很容易；只要修改对象的状态就行了。要在不同的会话中更新对象，则必须装入（或查询）该对象，然后更新它。</FONT></P>
<P><FONT size=2><B>同一个会话</B><BR></FONT></P>
<P>
<TABLE cellSpacing=1 cellPadding=5 width=600 border=1>
<TBODY>
<TR vAlign=top>
<TD class=standard bgColor=#ffffcc><PRE class=code><FONT size=2>session.save(department);

session.flush();

department.setName("newName");

session.flush();
</FONT></PRE></TD></TR></TBODY></TABLE></P>
<P><FONT size=2><B>不同的会话</B><BR></FONT></P>
<P>
<TABLE cellSpacing=1 cellPadding=5 width=600 border=1>
<TBODY>
<TR vAlign=top>
<TD class=standard bgColor=#ffffcc><PRE class=code><FONT size=2>//first session
Department department = new Department();
department.setDepartmentId(211);
department.setName("someName");
. 
. // set other stuff on department
.

session.save(department);
session.flush();
session.connection().commit();
session.close();

//later session
laterSession = sessionFactory.openSession();
Department dept = (Department) session.load(Department.class, new Integer(211));
dept.setName("aDifferentName");
laterSession.flush();
session.connection().commit();
laterSession.close();
</FONT></PRE></TD></TR></TBODY></TABLE><A id=8 name=8></A></P>
<P><FONT size=2><STRONG class=subhead>查询数据库</STRONG><BR></FONT></P>
<P><FONT size=2>查询数据库有几种方式。最简单的方式是使用 <CODE>session.find</CODE> 方法。您必须使用 Hibernate 简单但却功能强大的面向对象的查询语言来给 <CODE>session.find</CODE> 提供一个查询。下面的示例演示了一个非常简单的查询。如果要进行更复杂的查询，请参阅 Hibernate 文档获取更多详细信息。</FONT></P>
<P>
<TABLE cellSpacing=1 cellPadding=5 width=600 border=1>
<TBODY>
<TR vAlign=top>
<TD class=standard bgColor=#ffffcc><PRE class=code><FONT size=2>Department department = new Department();
department.setDepartmentId(211);
department.setName("someName");
. 
. // set other stuff on department
.

session.save(department);
List list = session.find
("from dept in class com.ibm.hibernate_article.Department where dept.city='Austin' ");
</FONT></PRE></TD></TR></TBODY></TABLE><A id=9 name=9></A></P>
<P><FONT size=2><STRONG class=subhead>进行测试</STRONG><BR></FONT></P>
<P><FONT size=2>既然我们有了会话对象并且知道了如何进行一些操作，那我们就可以在我们简单的对象模型上编写一些 CRUD 测试来看看 Hibernate 的实际运行情况。这是一种比 JUnit 测试好得多的测试方法。您可以随意看看本文所附的源代码中的 <CODE>HibernateTest.java</CODE> 测试用例。</FONT></P><A id=10 name=10></A>
<P><FONT size=2><STRONG class=subhead>结束语</STRONG><BR></FONT></P>
<P><FONT size=2>在本文中，我们仅仅粗浅地讨论了如何使用 Hibernate。我们在几个 POJO（Plain Old Java Object，传统的 Java 对象）的上下文中介绍 Hibernate API。不过，请注意广泛的 Hibernate API 涵盖了更高级的主题，如 one-to-many（一对多）映射、事务以及集合。既然您已“涉足”Hibernate，那应该能更自在地探索如何在编程工作中使用开放式源代码产品了吧。</FONT></P>
<P><FONT size=2>我们在一些项目中使用了 Hibernate，使用时遇到了一些障碍。我们发现，SourceForge 上的 Hibernate 论坛对于解答我们的问题是不可或缺的。在该论坛上，Hibernate 的主要开发人员非常活跃，他们几乎会解答所有贴子。</FONT></P>
<P><FONT size=2>论坛的网址为：<BR></FONT><A href="http://sourceforge.net/forum/forum.php?forum_id=128638"><FONT color=#002c99 size=2>http://sourceforge.net/forum/forum.php?forum_id=128638</FONT></A></P>
<P><FONT size=2>Hibernate Web 页面的网址：<BR></FONT><A href="http://hibernate.bluemars.net/"><FONT color=#002c99 size=2>http://hibernate.bluemars.net/</FONT></A><BR><FONT size=2>&nbsp;</FONT></P>
<P><FONT size=2><STRONG>作者</STRONG><BR></FONT></P>
<P class=standard><A href="http://www-900.ibm.com/developerWorks/cn/dmdd/library/techarticles/0306bhogal/0306bhogal.shtml#authorname"><FONT color=#002c99 size=2>Javid Jamae</FONT></A><FONT size=2> <BR>独立软件顾问，Jamae Consulting<BR>德克萨斯州奥斯汀</FONT></P>
<P class=standard><A href="http://www-900.ibm.com/developerWorks/cn/dmdd/library/techarticles/0306bhogal/0306bhogal.shtml#authorname"><FONT color=#002c99 size=2>Kulvir Singh Bhogal</FONT></A><FONT size=2> <BR>IBM Software Services for WebSphere <BR>德克萨斯州奥斯汀<BR>2003 年 10 月<BR><BR><STRONG>本文章来自IBM DeveloperWorks.</STRONG><BR></FONT><A href="http://www-900.ibm.com/developerWorks/cn/dmdd/library/techarticles/0306bhogal/0306bhogal.shtml"><FONT size=2>http://www-900.ibm.com/developerWorks/cn/dmdd/library/techarticles/0306bhogal/0306bhogal.shtml</FONT></A></P></property></property></property><img src ="http://www.blogjava.net/Simida/aggbug/1970.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Simida/" target="_blank">游昌平</a> 2005-03-12 20:24 <a href="http://www.blogjava.net/Simida/articles/1970.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>