﻿<?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-大道至简-文章分类-Hibernate</title><link>http://www.blogjava.net/hellotony/category/8467.html</link><description>道生一，一生二，二生三，三生万物。万物负阴而抱阳，冲气以为和。</description><language>zh-cn</language><lastBuildDate>Tue, 27 Feb 2007 12:18:33 GMT</lastBuildDate><pubDate>Tue, 27 Feb 2007 12:18:33 GMT</pubDate><ttl>60</ttl><item><title>Hibernate3中的更新与删除</title><link>http://www.blogjava.net/hellotony/articles/36676.html</link><dc:creator>Tony</dc:creator><author>Tony</author><pubDate>Tue, 21 Mar 2006 10:38:00 GMT</pubDate><guid>http://www.blogjava.net/hellotony/articles/36676.html</guid><wfw:comment>http://www.blogjava.net/hellotony/comments/36676.html</wfw:comment><comments>http://www.blogjava.net/hellotony/articles/36676.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/hellotony/comments/commentRss/36676.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hellotony/services/trackbacks/36676.html</trackback:ping><description><![CDATA[
		<font size="2">
			在Hibernate2中对某个表进行更新和删除，必须先把它Load出来，在后更改，然后再保存。<br />这个过程对于批量操作或者对于表关系比较复杂的情况，是很复杂的。<br />在Hibernate3中HQL语句中已经支持update 和delete 了<br />但是要注意的是update和delete的HQL不是面向对象的了。你用对象方式的语句返回会出错。<br />下面是一个简单的例子。<br />用对象的方式，不用HQL：<br /></font>
		<div style="border: 1px solid rgb(0, 0, 0); padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: rgb(238, 238, 238);">
				<font size="2">
						<span style="color: rgb(0, 0, 0);">        Session session </span>
						<span style="color: rgb(0, 0, 0);">=</span>
						<span style="color: rgb(0, 0, 0);"> getSession();<br />        Customer host </span>
						<span style="color: rgb(0, 0, 0);">=</span>
						<span style="color: rgb(0, 0, 0);"> (Customer) session.load(Customer.</span>
						<span style="color: rgb(0, 0, 255);">class</span>
						<span style="color: rgb(0, 0, 0);">,hostEmail);<br />        Customer guest </span>
						<span style="color: rgb(0, 0, 0);">=</span>
						<span style="color: rgb(0, 0, 0);"> (Customer)session.load(Customer.</span>
						<span style="color: rgb(0, 0, 255);">class</span>
						<span style="color: rgb(0, 0, 0);">,guestEmail);<br />        ContactId id</span>
						<span style="color: rgb(0, 0, 0);">=</span>
						<span style="color: rgb(0, 0, 0);"> </span>
						<span style="color: rgb(0, 0, 255);">new</span>
						<span style="color: rgb(0, 0, 0);"> ContactId(host,guest);<br />        Contact contact </span>
						<span style="color: rgb(0, 0, 0);">=</span>
						<span style="color: rgb(0, 0, 0);"> (Contact)session.load(Contact.</span>
						<span style="color: rgb(0, 0, 255);">class</span>
						<span style="color: rgb(0, 0, 0);">,id);<br />        RelationShip relation </span>
						<span style="color: rgb(0, 0, 0);">=</span>
						<span style="color: rgb(0, 0, 0);"> (RelationShip)session.load(RelationShip.</span>
						<span style="color: rgb(0, 0, 255);">class</span>
						<span style="color: rgb(0, 0, 0);">, </span>
						<span style="color: rgb(0, 0, 0);">2</span>
						<span style="color: rgb(0, 0, 0);">);<br />        contact.setRelationShip(relation);<br />        contact.setUpdateTime(Calendar.getInstance().getTime());<br />        session.flush();<br />        session.close();</span>
				</font>
		</div>
		<font size="2">用HQL：<br /></font>
		<div style="border: 1px solid rgb(0, 0, 0); padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: rgb(238, 238, 238);">
				<font size="2">
						<span style="color: rgb(0, 0, 0);">        </span>
						<span style="color: rgb(0, 0, 255);">private</span>
						<span style="color: rgb(0, 0, 0);"> </span>
						<span style="color: rgb(0, 0, 255);">static</span>
						<span style="color: rgb(0, 0, 0);"> </span>
						<span style="color: rgb(0, 0, 255);">final</span>
						<span style="color: rgb(0, 0, 0);"> String HQL_BADGUY_TO_FRIEND </span>
						<span style="color: rgb(0, 0, 0);">=</span>
						<span style="color: rgb(0, 0, 0);"> </span>
						<span style="color: rgb(0, 0, 0);">"</span>
						<span style="color: rgb(0, 0, 0);">update Contact set relation_id = 1, <br />                updateTime = :updateTime where host = :hostEmail and guest = :guestEmail</span>
						<span style="color: rgb(0, 0, 0);">"</span>
						<span style="color: rgb(0, 0, 0);">;<br /><br />        Session session </span>
						<span style="color: rgb(0, 0, 0);">=</span>
						<span style="color: rgb(0, 0, 0);"> getSession();<br />        Query query </span>
						<span style="color: rgb(0, 0, 0);">=</span>
						<span style="color: rgb(0, 0, 0);"> session.createQuery(HQL_BADGUY_TO_FRIEND);<br />        query.setString(</span>
						<span style="color: rgb(0, 0, 0);">"</span>
						<span style="color: rgb(0, 0, 0);">hostEmail</span>
						<span style="color: rgb(0, 0, 0);">"</span>
						<span style="color: rgb(0, 0, 0);">,hostEmail);<br />        query.setString(</span>
						<span style="color: rgb(0, 0, 0);">"</span>
						<span style="color: rgb(0, 0, 0);">guestEmail</span>
						<span style="color: rgb(0, 0, 0);">"</span>
						<span style="color: rgb(0, 0, 0);">,guestEmail);<br />        query.setDate(</span>
						<span style="color: rgb(0, 0, 0);">"</span>
						<span style="color: rgb(0, 0, 0);">updateTime</span>
						<span style="color: rgb(0, 0, 0);">"</span>
						<span style="color: rgb(0, 0, 0);">,Calendar.getInstance().getTime());<br />        query.executeUpdate();<br />        session.close();</span>
				</font>
		</div>
		<font size="2">如果你把HQL写成这个样子：<br />update Contact as c set c.relationShip.relationId =1 ......<br />反而会出错，也就是说，你就按照native SQL去写就行了。<br />还有，如果能使用这样的功能<br /><strong>hibernate.query.factory_class  =  org.hibernate.hql.classic.ClassicQueryTranslatorFactory</strong><br />这个Hibernate配置属性要不去掉，要不换成<strong>org.hibernate.hql.ast.ASTQueryTranslatorFactory</strong><br />上面那个是支持Hibernate2的。<br />但
是有一点要注意，如果你用update语句来做的话，可能产生缓存同步问题，而且两种方法最后Hibernate执行的语句差不多，对于第一种方法
Hibernate也是就生成一条update语句，当然因为我是根据主键来update的，如果批量处理的话还是用Update HQL快。</font>
<img src ="http://www.blogjava.net/hellotony/aggbug/36676.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hellotony/" target="_blank">Tony</a> 2006-03-21 18:38 <a href="http://www.blogjava.net/hellotony/articles/36676.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>创建struts1.2 + Hibernate3.0 Web工程</title><link>http://www.blogjava.net/hellotony/articles/36673.html</link><dc:creator>Tony</dc:creator><author>Tony</author><pubDate>Tue, 21 Mar 2006 10:36:00 GMT</pubDate><guid>http://www.blogjava.net/hellotony/articles/36673.html</guid><wfw:comment>http://www.blogjava.net/hellotony/comments/36673.html</wfw:comment><comments>http://www.blogjava.net/hellotony/articles/36673.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hellotony/comments/commentRss/36673.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hellotony/services/trackbacks/36673.html</trackback:ping><description><![CDATA[
		<p>
				<font size="2">
						<strong>1. 环境说明</strong>
				</font>
		</p>
		<p>
				<font size="2">　　安装Eclipse和安装MyEclipse组件的过程在这里不进行介绍。可以参考其它资料完成Eclipse环境的安装与资源的配置。</font>
		</p>
		<p>
				<font size="2">　　接下来的篇幅将给出一个在MyEclipse开发环境下的一个Web工程实例。说明在MyEclipse的集成开发环境下，如何利用Struts进行Web工程开发。</font>
		</p>
		<p>
				<font size="2">例子工程的环境：</font>
		</p>
		<p>
				<font size="2">Windows 2000 Professional或者更高的版本。<br />J2SDK 5.0<br />Apache Tomcat 5.0<br />MySQL 4.0.14b<br />Eclipse-SDK-3.1<br />MyEclipse 4.0<br />SQLyog407(可选)</font>
		</p>
		<p>
				<font size="2">
						<strong>
								<a name="2">2. 例子工程说明</a>
						</strong>
				</font>
		</p>
		<p>
				<font size="2">　　本例子是利用struts架构，实现用户logon的Web工程。在这个工程中，用户可以访问三个页面，index.jsp、logon.jsp、menu.jsp。他们的关系如下图所示：</font>
		</p>
		<p>
				<font size="5">
						<a href="http://java.chinaitlab.com/UploadFiles_8734/200602/20060208104458573.jpg" target="_blank">
								<img src="http://java.chinaitlab.com/UploadFiles_8734/200602/20060208104458933.jpg" border="0" height="126" width="216" />
						</a>
				</font>
		</p>
		<p>
				<font size="2">　　其中，左上角的方框代表struts结构中/WEB-INF/struts-config.xml中定义的，&lt;global-
forwards&gt;，也就是在整个Web工程中，只要有logon的动作发生，都会使画面转移到logon.jsp。那么处理logon.jsp画
面的formbeen是上图上放右侧的模块表示的formbean来完成——logonForm。</font>
		</p>
		<p>
				<font size="2">　　LogonFrom处理后会有两个结果，“success”的时候，画面会转移到menu.jsp，失败的话，回到logon画面。</font>
		</p>
		<p>
				<font size="2">　　在logon画面，用户需要输入用户名和密码，点击submit，进行登录认证。输入内容的检测是在logonForm的bean中检查。判断
操作在logonAction的bean中完成，在logonAction的bean中，需要访问MySql数据库的Account表格，进行用户和密码
的查询。查询成功的话，证明用户认证通过。 </font>
		</p>
		<p>
				<font size="2">
						<strong>
								<a name="3">3. 建立工程</a>
						</strong>
				</font>
		</p>
		<p>
				<font size="2">
						<strong>
								<a name="4">3.1 v创建新的Web Project</a>
						</strong>
				</font>
		</p>
		<p>
				<font size="2">　　启动MyEclipse，通过Wizard，建立一个Web工程。如下图：</font>
		</p>
		<p>
				<font size="2">
						<a href="http://java.chinaitlab.com/UploadFiles_8734/200602/20060208104458276.jpg" target="_blank">
								<img src="http://java.chinaitlab.com/UploadFiles_8734/200602/20060208104458275.jpg" border="0" height="235" width="232" />
						</a>
				</font>
		</p>
		<p>
				<font size="2">　　点击project后，MyEclipse弹出工程的对话框，我们在所罗列的工程中选中MyEclipse下面的J2EE Projects的Web Project。如下图所示：</font>
		</p>
		<p>
				<font size="2">
						<a href="http://java.chinaitlab.com/UploadFiles_8734/200602/20060208104459529.jpg" target="_blank">
								<img src="http://java.chinaitlab.com/UploadFiles_8734/200602/20060208104459545.jpg" border="0" height="273" width="276" />
						</a>
				</font>
		</p>
		<p>
				<font size="2">　　在Wizard的下一页，必要的输入信息是Project Name、Context root URL。最后点击finish，一个空的WebProject就已经建立起来了</font>
		</p>
		<p>
				<font size="2">
						<strong>
								<a id="5" name="5">3.2 加载Struts</a>
						</strong>
				</font>
		</p>
		<p>
				<font size="2">　　在新创建的Web Project中加载struts。</font>
		</p>
		<p>
				<font size="2">　　在MyEclipse集成开发环境下，已经集成了struts开发的环境，用户可以根据自己的实际需要，加载struts的环境。加载过程如下图：</font>
		</p>
		<p>
				<font size="2">
						<a href="http://java.chinaitlab.com/UploadFiles_8734/200602/20060208104459553.jpg" target="_blank">
								<img src="http://java.chinaitlab.com/UploadFiles_8734/200602/20060208104459930.jpg" border="0" height="265" width="219" />
						</a>
				</font>
		</p>
		<p>
				<font size="2">　　右键点击刚刚创建好的工程，点击MyEclipse属性，在扩展的右键菜单里面，选择Add Struts Capabilities。</font>
		</p>
		<p>
				<font size="2">　　MyEclipse集成环境就会自动将Struts所需要的目录结构进行创建，并将需要的环境资源自动引用到相应的目录中去。</font>
		</p>
		<p>
				<font size="2">　　我们还要对自动生成的Struts进行修正，首先，修改WEB-INF/web.xml 将&lt;web-app&gt;标签中的属性删除。&lt;web-app XXXXXXXXXXXXXXX&gt; -&gt; &lt;web-app&gt;</font>
		</p>
		<font size="2">　　其次要添加本工程的标签定义库，添加&lt;taglib&gt;&lt;/taglib&gt; <br />&lt;taglib&gt;<br />    &lt;taglib-uri&gt;/WEB-INF/app.tld&lt;/taglib-uri&gt;<br />    &lt;taglib-location&gt;/WEB-INF/app.tld&lt;/taglib-location&gt;<br />  &lt;/taglib&gt;<br />  &lt;taglib&gt;<br />    &lt;taglib-uri&gt;/WEB-INF/struts-bean.tld&lt;/taglib-uri&gt;<br />    &lt;taglib-location&gt;/WEB-INF/struts-bean.tld<br />&lt;/taglib-location&gt;<br />  &lt;/taglib&gt;<br />  &lt;taglib&gt;<br />    &lt;taglib-uri&gt;/WEB-INF/struts-html.tld&lt;/taglib-uri&gt;<br />    &lt;taglib-location&gt;/WEB-INF/struts-html.tld<br />&lt;/taglib-location&gt;<br />  &lt;/taglib&gt;<br />  &lt;taglib&gt;<br />    &lt;taglib-uri&gt;/WEB-INF/struts-logic.tld&lt;/taglib-uri&gt;<br />    &lt;taglib-location&gt;/WEB-INF/struts-logic.tld<br />&lt;/taglib-location&gt;<br />  &lt;/taglib&gt;<br /><br /></font>
		<p>
				<font size="2">
						<strong>
								<a name="_Toc112057961">4. 完善工程</a>
						</strong>
				</font>
		</p>
		<p>
				<font size="2">
						<strong>
								<a name="_Toc112057962">4.1 添加index画面</a>
						</strong>
				</font>
		</p>
		<p>
				<font size="2">　　在加载完Struts结构之后，就可以在这个工程中添加内容了。我们可以添加一个画面JSP。添加JSP很简单，点击工程的右键，添加JSP。Wizard会弹出一个添加的对话框。如下图： </font>
		</p>
		<p>
				<font size="2">
						<a href="http://java.chinaitlab.com/UploadFiles_8734/200602/20060208104459980.jpg" target="_blank">
								<img src="http://java.chinaitlab.com/UploadFiles_8734/200602/20060208104459364.jpg" border="0" height="196" width="252" />
						</a>
				</font>
		</p>
		<p>
				<font size="2">　　在File Name栏中改变文件名称，改成index.jsp把这个jsp作为Web工程的第一个画面。</font>
		</p>
		<p>
				<font size="2">　　Template To Use 栏可以选择第五项（选择选择其他项也可以）。</font>
		</p>
		<p>
				<font size="2">　　对于新生成的jsp文件进行必要的修改。</font>
		</p>
		<p>
				<font size="2">Index.jsp文件：<br />&lt;taglib&gt;<br />&lt;%@ page language="java" pageEncoding="UTF-8"%&gt;<br /><br />&lt;%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %&gt;<br />&lt;%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %&gt;<br />&lt;%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic" %&gt;<br /><br />&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"&gt;<br />&lt;html&gt;<br />  &lt;head&gt;<br />    &lt;title&gt;My JSP 'index.jsp' starting page&lt;/title&gt;<br />    <br />    <span class="style1">&lt;meta http-equiv="pragma" content="no-cache"&gt;<br />    &lt;meta http-equiv="cache-control" content="no-cache"&gt;<br />    &lt;meta http-equiv="expires" content="0"&gt;<br />    &lt;meta http-equiv="keywords" content="<br />keyword1,keyword2,keyword3"&gt;<br />    &lt;meta http-equiv="description" content="This is my page"&gt;<br /></span>    <br />    &lt;!--<br />    &lt;link rel="stylesheet" type="text/css" href="styles.css"&gt;<br />    --&gt;<br />  &lt;/head&gt;<br />  <br />  &lt;body&gt;<br />  <span class="style2">&lt;h3&gt;&lt;bean:message key="index.heading"/&gt;&lt;/h3&gt;<br />	&lt;html:link page="/logon.jsp"&gt;&lt;bean:message key="index.logon"/&gt;&lt;/html:link&gt;</span><br />&lt;/body&gt;<br />&lt;/html&gt;<br /></font>
		</p>
		<p>
				<font size="2">　其中蓝色和橙色部分是修改的内容，蓝色部分是今后自动添加jsp文件必须修改的地方，让这个页面用到的tag都能在这个工程中定义的tag集合中找到。</font>
		</p>
		<p>
				<font size="2">　　橙色部分是画面的主要显示内容。&lt;h3&gt;&lt;/h3&gt;的内容是一段文本，内容被struts结构的静态文本集合中的
index.heading给替换掉了。这个文本的内容可以在工程的src\com\yourcompany\struts\
ApplicationResources.properties文件中找到。Struts结构推荐用户将页面上的静态文本用
ApplicationResources的形式替换。这样可以在大量的维护页面文字时候，感到便捷很多，同时，也大大减轻了多国语言版本网页的维护。</font>
		</p>
		<p>
				<font size="2">　　&lt;html:link page="/logon.jsp"&gt;相当于html语言中的&lt;a
herf=xxxxx&gt;。这个tag是在/WEB-INF/struts-html.tld中可以找到并在显示页面的时候，被转义成&lt;a
herf=xxxxx&gt; </font>
		</p>
		<p>
				<font size="2">
						<strong>
								<a name="_Toc112057963">4.2 添加logon画面</a>
						</strong>
				</font>
		</p>
		<p>
				<font size="2">　　添加方法跟添加index画面相同。修改内容稍微有些差别。</font>
		</p>
		<p>
				<font size="2">Logon.jsp的内容：<br /><br />&lt;taglib&gt;<br />&lt;%@ page language="java" pageEncoding="UTF-8"%&gt;<br /><br /><span class="style1">&lt;%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %&gt;<br />&lt;%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %&gt;<br />&lt;%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic" %&gt;</span><br /><br />&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"&gt;<br />&lt;html:html locale="true"&gt;<br />  &lt;head&gt;<br />    &lt;html:base /&gt;<br />    <br />    &lt;title&gt;logon.jsp&lt;/title&gt;<br />    <br />    &lt;meta http-equiv="pragma" content="no-cache"&gt;<br />    &lt;meta http-equiv="cache-control" content="no-cache"&gt;<br />    &lt;meta http-equiv="expires" content="0"&gt;    <br />    &lt;meta http-equiv="keywords" <br />content="keyword1,keyword2,keyword3"&gt;<br />    &lt;meta http-equiv="description" content="This is my page"&gt;<br />  &lt;/head&gt;<br />  <br />  &lt;body&gt;<br />    &lt;html:form <span class="style2">action="/logon.do"</span> method="post"  <span class="style2">focus="userName"</span>&gt;<br />      &lt;table border="0"&gt;<br />        &lt;tr&gt;<br />          &lt;td&gt;&lt;bean:message key="prompt.username"/&gt;&lt;/td&gt;<br />          &lt;td&gt;&lt;html:text <span class="style2">property="userName"</span> /&gt;&lt;/td&gt;<br />        &lt;/tr&gt;<br />        &lt;tr&gt;<br />          &lt;td&gt;Password:&lt;/td&gt;<br />          &lt;td&gt;&lt;html:password property="password" /&gt;&lt;/td&gt;<br />        &lt;/tr&gt;<br />        &lt;tr&gt;<br />          &lt;td colspan="2" align="center"&gt;&lt;html:submit /&gt;&lt;/td&gt;<br />        &lt;/tr&gt;<br />      &lt;/table&gt;<br />    &lt;/html:form&gt;<br />  &lt;/body&gt;<br />&lt;/html:html&gt;<br /></font>
		</p>
		<p>
				<font size="2">　　其中，蓝色部分是引用本工程的tag标示库，红色的部分是表单属性名称的修改，和指定action动作的名称。</font>
		</p>
		<p>
				<font size="2">
						<strong>
								<a name="_Toc112057964">4.3 修改WEB-INF/struts-config.xml</a>
						</strong>
				</font>
		</p>
		<p>
				<font size="2">　　画面上出现了form，那么根据struts的结构要求，就必须在WEB-INF/struts-config.xml中明确这个form的
formbean（表单内容校验的java
class）是什么。执行这个form的action（表单执行的内部逻辑）是什么，以及action的结果会产生怎样的画面迁移。这些都是在WEB-
INF/struts-config.xml中定义的。也就是标准的MVC架构所要求的。 <br /><span class="style1">&lt;taglib&gt;<br />&lt;struts-config&gt;<br />  &lt;form-beans &gt;<br />    &lt;form-bean name="logonForm" type="com.yourcompany.forms.<br />LogonForm" /&gt;<br />  &lt;/form-beans&gt;</span><br /><br />  <span class="style2">&lt;global-forwards &gt;<br />    &lt;forward name="logon" path="/logon.jsp" /&gt;<br />  &lt;/global-forwards&gt;</span><br /><br />  <span class="style3">&lt;action-mappings &gt;<br />    &lt;action<br />      path="/logon"<br />      type="com.yourcompany.actions.LogonAction"<br />      name="logonForm"<br />      scope="request"<br />      input="/logon.jsp"&gt;<br />      &lt;forward name="success" path="/menu.jsp" /&gt;<br />      &lt;forward name="fails" path="/logon.jsp" /&gt;<br />    &lt;/action&gt;<br />  &lt;/action-mappings&gt;<br /><br /></span>  &lt;message-resources parameter="com.yourcompany.struts.<br />ApplicationResources" /&gt;<br />&lt;/struts-config&gt;<br /><br /></font>
		</p>
		<p>
				<font size="2">　　其中&lt;action&gt;部分是说明action的属性。</font>
		</p>
		<p>
				<font size="2">　　Path 指定Action处理的URL</font>
		</p>
		<p>
				<font size="2">　　Type 指定Action的类名</font>
		</p>
		<p>
				<font size="2">　　Name 指定Action主力的ActionForm名，与&lt;form-beans &gt;元素的name属性匹配。</font>
		</p>
		<p>
				<font size="2">　　Scope 指定ActionForm存在的范围</font>
		</p>
		<p>
				<font size="2">　　Input 指定包含客户提交表单的网页，如果ActionForm的Validate方法返回错误，则因该把用户请求转发到这个网页。</font>
		</p>
		<p>
				<font size="2">　　Validate 如果取值为true，则表示ActionServlet应该调用ActionForm的validate方法</font>
		</p>
		<p>
				<font size="2">　　Forward 就是Action的execute方法执行完毕后，把客户请求在转发给相应的页面。</font>
		</p>
		<p>
				<font size="2">
						<strong>
								<a name="_Toc112057965">4.4 添加formbean和actionbean</a>
						</strong>
				</font>
		</p>
		<p>
				<font size="2">　　添加方法跟JSP相同，但是在选择superclass的时候，formbean要选择ActionForm作为类的父类。Actionbean的父类是Action</font>
		</p>
		<p>
				<font size="2">　　下面是各自的代码</font>
		</p>
		<p>
				<font size="2">LogonForm.java文件内容:<br /><br />&lt;taglib&gt;<br />package com.yourcompany.forms;<br />import javax.servlet.http.HttpServletRequest;<br /><br />import org.apache.struts.action.ActionForm;<br />import org.apache.struts.action.ActionMapping;<br /><br />public class LogonForm extends ActionForm {<br /><br />	private static final long serialVersionUID <br />= 7322786881443789688L;<br />	// ------------------------------<br />--------------------------- Instance Variables<br />    private String username = null;<br />    private String password = null;<br /><br />	// -------------------------<br />-------------------------------- Methods<br />    public String getUserName() {<br />		return (this.username);<br />    }<br /><br />    public void setUserName(String username) {<br />        this.username = username;<br />    }<br /><br />    public String getPassword() {<br />		return (this.password);<br />    }<br /><br />    public void setPassword(String password) {<br />        this.password = password;<br />    }<br /><br />	public void reset(ActionMapping mapping, <br />HttpServletRequest request) {<br />		this.password = null;<br />		this.username = null;<br />	}<br /><br />}<br /><br />LogonAction.java文件：<br />package com.yourcompany.actions;<br /><br />import javax.servlet.http.HttpServletRequest;<br />import javax.servlet.http.HttpServletResponse;<br /><br />import org.apache.struts.action.Action;<br />import org.apache.struts.action.ActionForm;<br />import org.apache.struts.action.ActionForward;<br />import org.apache.struts.action.ActionMapping;<br /><br />import com.yourcompany.forms.LogonForm;<br /><br />public class LogonAction extends Action {<br /><br />	public ActionForward execute(ActionMapping <br />mapping, ActionForm form,<br />			HttpServletRequest request, <br />HttpServletResponse response) {<br /><br />		String userName = null;<br />		String password = null;<br /><br />		if (form != null) {<br />			userName = ((LogonForm) form).getUserName();<br />			password = ((LogonForm) form).getPassword();<br />		}<br />		if(userName.equals(“test1”) &amp;&amp; password. <br />equals(“test1”)){<br />			return (mapping.findForward("success"));<br />}<br />else{<br />	return (mapping.findForward("fails"));<br />}<br />	}<br /><br />}<br /></font>
		</p>
		<p>
				<font size="2">
						<strong>
								<a name="_Toc112057966">4.5 添加menu画面</a>
						</strong>
				</font>
		</p>
		<font size="2">　　与添加index画面的方法相同。下面是menu.jsp文件的内容<br /><br />&lt;taglib&gt;<br />&lt;%@ page language="java" pageEncoding="UTF-8"%&gt;<br /><br />&lt;%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %&gt;<br />&lt;%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %&gt;<br />&lt;%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic" %&gt;<br /><br />&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"&gt;<br />&lt;html:html locale="true"&gt;<br />  &lt;head&gt;<br />    &lt;html:base /&gt;<br />        &lt;title&gt;menu.jsp&lt;/title&gt;<br />        &lt;meta http-equiv="pragma" content="no-cache"&gt;<br />    &lt;meta http-equiv="cache-control" content="no-cache"&gt;<br />    &lt;meta http-equiv="expires" content="0"&gt;    <br />    &lt;meta http-equiv="keywords" content="keyword1,keyword2,keyword3"&gt;<br />    &lt;meta http-equiv="description" content="This is my page"&gt;<br />  &lt;/head&gt;<br />    &lt;body&gt;<br />	  &lt;h3&gt;&lt;bean:message key="menu.message"/&gt;&lt;/h3&gt;<br />  &lt;/body&gt;<br />&lt;/html:html&gt;<br /><br /></font>
		<p>
				<font size="2">
						<strong>
								<a name="_Toc112057967">5. 调试工程</a>
						</strong>
				</font>
		</p>
		<p>
				<font size="2">如果本地机器已经安装了Tomcat5，那么可以在MyEclilpse的环境下调试工程了。</font>
		</p>
		<p>
				<font size="2">指定Tomcat5 的web application service 如下图：</font>
		</p>
		<p>
				<font size="2">
						<a href="http://java.chinaitlab.com/UploadFiles_8734/200602/20060208104459464.jpg" target="_blank">
								<img src="http://java.chinaitlab.com/UploadFiles_8734/200602/20060208104459652.jpg" border="0" height="183" width="264" />
						</a>
				</font>
		</p>
		<p>
				<font size="2">将Enable选项打开，并且指定Tomcat的安装目录。</font>
		</p>
		<p>
				<font size="2">配置目前的工程到Tomcat中去。</font>
		</p>
		<p>
				<font size="2">
						<a href="http://java.chinaitlab.com/UploadFiles_8734/200602/20060208104459814.jpg" target="_blank">
								<img src="http://java.chinaitlab.com/UploadFiles_8734/200602/20060208104459805.jpg" border="0" height="31" width="264" />
						</a>
				</font>
		</p>
		<p>
				<font size="2">点选工具栏上的被红线圈出的按钮</font>
		</p>
		<p>
				<font size="2">在弹出来的对话框中选择，我们创建的工程，和添加Tomcat5 的web application service</font>
		</p>
		<p>
				<font size="2">
						<a href="http://java.chinaitlab.com/UploadFiles_8734/200602/20060208104459884.jpg" target="_blank">
								<img src="http://java.chinaitlab.com/UploadFiles_8734/200602/20060208104459336.jpg" border="0" height="208" width="240" />
						</a>
				</font>
		</p>
		<p>
				<font size="2">然后就可以按下工具栏上的启动服务按钮，调试这个Web工程了。</font>
		</p>
		<p>
				<font size="2">
						<a href="http://java.chinaitlab.com/UploadFiles_8734/200602/20060208104459526.jpg" target="_blank">
								<img src="http://java.chinaitlab.com/UploadFiles_8734/200602/20060208104459955.jpg" border="0" height="29" width="240" />
						</a>
				</font>
		</p>
		<p>
				<font size="2">每一次改动工程中的文件后，要想看看改动后的效果，那么就在配置工程中，重新发布这个工程到tomecat5去。</font>
		</p>
		<p>
				<font size="2">
						<strong>
								<a name="_Toc112057968">
								</a>6. Tomcat下如何配置mysql的数据库连接池</strong>
				</font>
		</p>
		<p>
				<font size="2">
						<strong>
								<a name="_Toc112057969">
								</a>6.1 配置server.xml</strong>
				</font>
		</p>
		<p>
				<font size="2">配置Tomcat的server.xml文件，路径：【TOMCAT_HOME】\common\lib下的server.xml文件在&lt;/host&gt;之前加入以下内容以添加JNDI数据源： <br /><br />&lt;taglib&gt;<br />&lt;Context path="/<span class="style1">DBTest</span>" docBase="<span class="style1">DBTest</span>"<br />        debug="5" reloadable="true" crossContext="true"&gt;<br />  &lt;Logger className="org.apache.catalina.logger.FileLogger"<br />             prefix="localhost_DBTest_log." suffix=".txt"<br />             timestamp="true"/&gt;<br />  &lt;Resource name="<span class="style2">jdbc/TestDB</span>"<br />               auth="Container"<br />               type="javax.sql.DataSource"/&gt;<br />  &lt;ResourceParams name="<span class="style2">jdbc/TestDB</span>"&gt;<br />    &lt;parameter&gt;<br />      &lt;name&gt;factory&lt;/name&gt;<br />    &lt;value&gt;org.apache.commons.dbcp.BasicDataSourceFactory&lt;/value&gt;<br />    &lt;/parameter&gt;<br />    &lt;!-- Maximum number of dB connections in pool. Make sure you<br />         configure your mysqld max_connections large enough to handle<br />         all of your db connections. Set to 0 for no limit.<br />         --&gt;<br />    &lt;parameter&gt;<br />      &lt;name&gt;maxActive&lt;/name&gt;<br />      &lt;value&gt;100&lt;/value&gt;<br />    &lt;/parameter&gt;<br />    &lt;!-- Maximum number of idle dB connections to retain in pool.<br />         Set to 0 for no limit.<br />         --&gt;<br />    &lt;parameter&gt;<br />      &lt;name&gt;maxIdle&lt;/name&gt;<br />      &lt;value&gt;30&lt;/value&gt;<br />    &lt;/parameter&gt;<br />    &lt;!-- Maximum time to wait for a dB connection to become available<br />         in ms, in this example 10 seconds. An Exception is thrown if<br />         this timeout is exceeded.  Set to -1 to wait indefinitely.<br />         --&gt;<br />    &lt;parameter&gt;<br />      &lt;name&gt;maxWait&lt;/name&gt;<br />      &lt;value&gt;10000&lt;/value&gt;<br />    &lt;/parameter&gt;<br />    &lt;!-- MySQL dB username and password for dB connections  --&gt;<br />    &lt;parameter&gt;<br />     &lt;name&gt;username&lt;/name&gt;<br />     &lt;value&gt;root&lt;/value&gt;<br />    &lt;/parameter&gt;<br />    &lt;parameter&gt;<br />     &lt;name&gt;password&lt;/name&gt;<br />     &lt;value&gt; &lt;/value&gt;<br />    &lt;/parameter&gt;<br />    &lt;!-- Class name for mm.mysql JDBC driver --&gt;<br />    &lt;parameter&gt;<br />       &lt;name&gt;driverClassName&lt;/name&gt;<br />       &lt;value&gt;org.gjt.mm.mysql.Driver&lt;/value&gt;<br />    &lt;/parameter&gt;<br />    &lt;!-- The JDBC connection url for connecting to your MySQL dB.<br />         The autoReconnect=true argument to the url makes sure that the<br />         mm.mysql JDBC Driver will automatically reconnect if mysqld closed the<br />         connection.  mysqld by default closes idle connections after 8 hours.<br />         --&gt;<br />    &lt;parameter&gt;<br />      &lt;name&gt;url&lt;/name&gt; &lt;value&gt;jdbc:mysql://192.168.0.208:3306<br />/db_test_account?autoReconnect=true&lt;/value&gt;<br />    &lt;/parameter&gt;<br />  &lt;/ResourceParams&gt;<br />&lt;/Context&gt;<br /></font>
		</p>
		<p>
				<font size="2">注意:</font>
		</p>
		<p>
				<font size="2">*其中蓝色字体表示你这个应用的路径和别名,也就是你访问自己配置的这个web站点的名字,注意区分大小写,必须一致,否则系统无法正常运行(例:http://localhost:8080/DBTest)</font>
		</p>
		<p>
				<font size="2">*其中红色字体表示数据源的名字,注意将会被web.xml和你访问数据库的程序调用</font>
		</p>
		<p>
				<font size="2">
						<strong>
								<a name="_Toc112057970">
								</a>6.2 配置web.xml</strong>
				</font>
		</p>
		<p>
				<font size="2">配置Web用程序的web.xml文件 <br /><br />&lt;taglib&gt;<br />&lt;?xml version="1.0" encoding="ISO-8859-1"?&gt;<br />    &lt;!DOCTYPE web-app PUBLIC<br />    "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"<br />    "http://java.sun.com/dtd/web-app_2_3.dtd"&gt;<br />&lt;web-app&gt;<br />  &lt;description&gt;MySQL Test App&lt;/description&gt;<br />  &lt;resource-ref&gt;<br />      &lt;description&gt;DB Connection&lt;/description&gt;<br />      &lt;res-ref-name&gt;jdbc/TestDB&lt;/res-ref-name&gt;<br />      &lt;res-type&gt;javax.sql.DataSource&lt;/res-type&gt;<br />      &lt;res-auth&gt;Container&lt;/res-auth&gt;<br />  &lt;/resource-ref&gt;<br />&lt;/web-app&gt;<br /></font>
		</p>
		<p>
				<font size="2">
						<a name="_Toc112057971">
						</a>
						<strong>6.3 访问数据库的程序片段<br /><br /></strong>&lt;taglib&gt;<br />package swt.db.DBUtility;<br /><br />import javax.naming.*; <br />import javax.sql.*; <br />import java.sql.*; <br /><br />public class DBTest { <br /><br />  String foo = "Not Connected"; <br />  int bar = -1; <br />     <br />  public void init() { <br />    try{ <br />      Context ctx = new InitialContext(); <br />      if(ctx == null )  <br />          throw new Exception("Boom - No Context"); <br />      DataSource ds =  <br />            (DataSource)ctx.lookup( <br />               "java:comp/env/jdbc/TestDB"); <br />      if (ds != null) { <br />        Connection conn = ds.getConnection();      <br />        if(conn != null)  { <br />            foo = "Got Connection "+conn.toString(); <br />            Statement stmt = conn.createStatement(); <br />            ResultSet rst =  <br />                stmt.executeQuery( <br />                  " select UserName from t_account "); <br />            if(rst.next()) { <br />               foo=rst.getString(1); <br />               bar=208; <br />            } <br />            conn.close(); <br />        } <br />      } <br />    }catch(Exception e) { <br />      e.printStackTrace(); <br />    } <br /> } <br /> public String getFoo() { return foo; } <br /> public int getBar() { return bar;} <br />}</font>
		</p>
		<p>
				<font size="2">
						<a name="_Toc112057972">
						</a>
						<strong>6.4 Jsp页面(index.jsp)<br /><br /></strong>&lt;taglib&gt;<br />&lt;%@ page language="java" pageEncoding="UTF-8"%&gt;<br />&lt;%@ page import ="swt.db.DBUtility.*" %&gt;<br />&lt;html&gt; <br />  &lt;head&gt; <br />    &lt;title&gt;DB Test&lt;/title&gt; <br />  &lt;/head&gt; <br />  &lt;body&gt; <br />  &lt;% <br />    DBTest tst = new DBTest();<br />    tst.init(); <br />  %&gt; <br />  &lt;h2&gt;Results&lt;/h2&gt; <br />    Foo &lt;%= tst.getFoo() %&gt;&lt;br&gt; <br />    Bar &lt;%= tst.getBar() %&gt; <br />  &lt;/body&gt; <br />&lt;/html&gt;<br /><br /></font>
		</p>
		<p>
				<font size="2">启动Tomcat在浏览器上输入<a href="http://localhost:8080/DBTest" target="_blank"><u><font color="#0000ff">http://localhost:8080/DBTest</font></u></a><br /><br />备注：</font>
		</p>
		<p>
				<font size="2">连接池配置(Database Connection Pool (DBCP) Configurations)<br />DBCP使用的是Jakarta-Commons Database Connection Pool 要使用连接池需要如下的组件即jar文件</font>
		</p>
		<p>
				<font size="2">Jakarta-Commons DBCP 1.1 对应commons-dbcp-1.1.jar。<br />Jakarta-Commons Collections 2.0 对应commons-collections.jar。<br />Jakarta-Commons Pool 1.1 对应commons-pool-1.1.jar。<br />这三个jar文件要与你的JDBC驱动程序一起放到【TOMCAT_HOME】\common\lib目录下以便让tomcat和你的web应用都能够找到。</font>
		</p>
		<font size="2">
				<br />
				<br />
				<strong>7. Tomcat5.0下配置Hibernate3.0应用</strong>
		</font>
		<p>
				<font size="2">
						<strong>
								<a name="_Toc112057974">
								</a>7.1 在Tomcat下建立数据库连接池，如6中所示</strong>
				</font>
		</p>
		<p>
				<font size="2">
						<a name="_Toc112057975">
								<strong>7.2 在Struts应用中添加Hibernate3.0支持</strong>
						</a>
				</font>
		</p>
		<p>
				<font size="2">
						<a href="http://java.chinaitlab.com/UploadFiles_8734/200602/20060208104459802.jpg" target="_blank">
								<img src="http://java.chinaitlab.com/UploadFiles_8734/200602/20060208104500819.jpg" border="0" height="125" width="300" />
						</a>
				</font>
		</p>
		<p>
				<font size="2">
						<a href="http://java.chinaitlab.com/UploadFiles_8734/200602/20060208104500894.jpg" target="_blank">
								<img src="http://java.chinaitlab.com/UploadFiles_8734/200602/20060208104500623.jpg" border="0" height="197" width="240" />
						</a>
				</font>
		</p>
		<p>
				<font size="2">
						<a href="http://java.chinaitlab.com/UploadFiles_8734/200602/20060208104500293.jpg" target="_blank">
								<img src="http://java.chinaitlab.com/UploadFiles_8734/200602/20060208104500383.jpg" border="0" height="207" width="252" />
						</a>
				</font>
		</p>
		<p>
				<font size="2">注意：hibernate.cfg.xml文件一定要存放到跟目录下，默认的也就是/web应用/src,这个部署这个应用的时候hibernate.cfg.xml才会出现在classes目录下，也就是hibernate存放配置文件的默认录入下. </font>
		</p>
		<p>
				<font size="2">
						<a href="http://java.chinaitlab.com/UploadFiles_8734/200602/20060208104500107.jpg" target="_blank">
								<img src="http://java.chinaitlab.com/UploadFiles_8734/200602/20060208104500330.jpg" border="0" height="208" width="252" />
						</a>
				</font>
		</p>
		<p>
				<font size="2">由于我们采用Tomcat提供的数据库连接池，所以这里我们将是用自己创建的SessionFactory类。点击完成MyEclipse会自动把
Hibernate所需的的类库加入到当前应用中。接下来就是配置Hibernate连接数据库的所需的参数，以及性能参数（可选）。 </font>
		</p>
		<p>
				<font size="2">
						<a href="http://java.chinaitlab.com/UploadFiles_8734/200602/20060208104500485.jpg" target="_blank">
								<img src="http://java.chinaitlab.com/UploadFiles_8734/200602/20060208104500966.jpg" border="0" height="166" width="216" />
						</a>
				</font>
		</p>
		<p>
				<font size="2">既然我们选用应用服务器所提供的数据库连接池，那么在这里我们只须要指定数据源的名字：java:comp/env/jdbc/TestDB，其中
jdbc/TestDB就是我们在Tomcat中配置的数据源，也就是我们上面提到的jdbc/TestDB，资源名称一定要匹配。其他的参数由于已经在
Tomcat中配置过了，所以在这里就不用配置了，Dialect一定要指定跟我们数据库匹配的语言。
既然我们选用应用服务器所提供的数据库连接池，那么在这里我们只须要指定数据源的名字：java:comp/env/jdbc/TestDB，其中
jdbc/TestDB就是我们在Tomcat中配置的数据源，也就是我们上面提到的jdbc/TestDB，资源名称一定要匹配。其他的参数由于已经在
Tomcat中配置过了，所以在这里就不用配置了，Dialect一定要指定跟我们数据库匹配的语言。</font>
		</p>
		<p>
				<font size="2">
						<a href="http://java.chinaitlab.com/UploadFiles_8734/200602/20060208104500841.jpg" target="_blank">
								<img src="http://java.chinaitlab.com/UploadFiles_8734/200602/20060208104500606.jpg" border="0" height="111" width="240" />
						</a>
				</font>
		</p>
		<p>
				<font size="2">我们可以在这里配置Hibernate一些调整性能的参数（针对不同的数据库有些属性可能无效）。 </font>
		</p>
		<p>
				<font size="2">
						<a href="http://java.chinaitlab.com/UploadFiles_8734/200602/20060208104500580.jpg" target="_blank">
								<img src="http://java.chinaitlab.com/UploadFiles_8734/200602/20060208104500243.jpg" border="0" height="141" width="252" />
						</a>
				</font>
		</p>
		<font size="2">在这里我们设置show_sql为true，这样在开发调试过程成控制台可以打印真正在数据库端执行的sql语句便于查找问题。其他一些属性可以参阅<a href="http://www.hibernate.org/" target="_blank"><u><font color="#0000ff">http://www.hibernate.org</font></u></a>。<br />到这里Hibernate的配置已经基本完成，下面创建SessionFactory用来和数据库进行交互（Hibernate官方文档提供）。<br /><br />package com.db;<br /><br />import org.apache.commons.logging.Log;<br />import org.apache.commons.logging.LogFactory;<br />import org.hibernate.Session;<br />import org.hibernate.SessionFactory;<br />import org.hibernate.cfg.Configuration;<br /><br />public class HibernateUtil {<br /><br />    private static Log log = <br />LogFactory.getLog(HibernateUtil.class);<br /><br />    private static final SessionFactory sessionFactory;<br /><br />    static {<br />        try {<br />            sessionFactory = new Configuration().configure().<br />buildSessionFactory();<br />        } catch (Throwable ex) {<br />            log.error("Initial SessionFactory <br />creation failed.", ex);<br />            throw new ExceptionInInitializerError(ex);<br />        }<br />    }<br /><br />    public static final ThreadLocal session = new ThreadLocal();<br /><br />    public static Session currentSession()  {<br />        Session s = (Session) session.get();<br />        if (s == null) {<br />            s = sessionFactory.openSession();<br />            session.set(s);<br />        }<br />        return s;<br />    }<br /><br />    public static void closeSession() {<br />        Session s = (Session) session.get();<br />        if (s != null)<br />            s.close();<br />        session.set(null);<br />    }<br />}<br /></font>
		<p>
				<font size="2">后面将会提到如何使用HibernateUtil,下面建立我们所需的数据库<br />（略）我们可以使用208上的db_test_account这个数据库中的表message来测试我们的Hibernate配置是否成功。数据库样例： </font>
		</p>
		<p>
				<font size="2">
						<img src="http://java.chinaitlab.com/UploadFiles_8734/200602/20060208104500440.jpg" height="55" width="221" />
				</font>
		</p>
		<p>
				<font size="2">建表语句： </font>
		</p>
		<pre class="code">
				<font size="2">CREATE TABLE `message` (              <br />           `Id` varchar(50) NOT NULL default '0',   <br />           `text` varchar(50) default NULL,    <br />           `nextMessage` int(4) default NULL,  <br />           PRIMARY KEY  (`Id`)                 <br />          ) TYPE=MyISAM<br /></font>
		</pre>
		<p>
				<font size="2">创建O/R Mapping:</font>
		</p>
		<p>
				<font size="2">
						<img src="http://java.chinaitlab.com/UploadFiles_8734/200602/20060208104500419.jpg" height="249" width="166" />
				</font>
		</p>
		<p>
				<font size="2">
						<a href="http://java.chinaitlab.com/UploadFiles_8734/200602/20060208104501351.jpg" target="_blank">
								<img src="http://java.chinaitlab.com/UploadFiles_8734/200602/20060208104501850.jpg" border="0" height="313" width="282" />
						</a>
				</font>
		</p>
		<p>
				<font size="2">点击Edit </font>
		</p>
		<p>
				<font size="2">
						<a href="http://java.chinaitlab.com/UploadFiles_8734/200602/20060208104501965.jpg" target="_blank">
								<img src="http://java.chinaitlab.com/UploadFiles_8734/200602/20060208104501592.jpg" border="0" height="260" width="312" />
						</a>
				</font>
		</p>
		<p>
				<font size="2">点击New添加MySQL的驱动，保存 </font>
		</p>
		<p>
				<font size="2">
						<img src="http://java.chinaitlab.com/UploadFiles_8734/200602/20060208104501933.jpg" height="249" width="165" />
				</font>
		</p>
		<p>
				<font size="2">
						<a href="http://java.chinaitlab.com/UploadFiles_8734/200602/20060208104501809.jpg" target="_blank">
								<img src="http://java.chinaitlab.com/UploadFiles_8734/200602/20060208104501910.jpg" border="0" height="174" width="228" />
						</a>
				</font>
		</p>
		<p>
				<font size="2">激活Database Explorer，保存。 </font>
		</p>
		<p>
				<font size="2">
						<img src="http://java.chinaitlab.com/UploadFiles_8734/200602/20060208104501187.jpg" height="100" width="210" />
				</font>
		</p>
		<p>
				<font size="2">选择Database Explorer，创建数据库链接： </font>
		</p>
		<p>
				<font size="2">
						<img src="http://java.chinaitlab.com/UploadFiles_8734/200602/20060208104501296.jpg" height="110" width="316" />
				</font>
		</p>
		<p>
				<font size="2">点击创建新的数据库,添加所需必要的参数 </font>
		</p>
		<p>
				<font size="2">
						<a href="http://java.chinaitlab.com/UploadFiles_8734/200602/20060208104501870.jpg" target="_blank">
								<img src="http://java.chinaitlab.com/UploadFiles_8734/200602/20060208104501744.jpg" border="0" height="169" width="216" />
						</a>
				</font>
		</p>
		<p>
				<font size="2">保存，然后右键点击该数据库选择open database，测试是否配置成功，如果不能连接查看该连接的配置参数。<br /></font>
		</p>
		<p>
				<font size="2">
						<a href="http://java.chinaitlab.com/UploadFiles_8734/200602/20060208104501167.jpg" target="_blank">
								<img src="http://java.chinaitlab.com/UploadFiles_8734/200602/20060208104501996.jpg" border="0" height="247" width="211" />
						</a>
				</font>
		</p>
		<p>
				<font size="2">
						<a href="http://java.chinaitlab.com/UploadFiles_8734/200602/20060208104501838.jpg" target="_blank">
								<img src="http://java.chinaitlab.com/UploadFiles_8734/200602/20060208104501526.jpg" border="0" height="199" width="252" />
						</a>
				</font>
		</p>
		<p align="left">
				<font size="2">点击完成后MyEclipse会自动生成POJO和Map文件，并更新Hibernate的配置文件（主要是加载Map
文件）。ID
Generator选项可以根据你的需要进行选择，具体含义请参阅hibernate官方文档。下面建立一个测试用的jsp页面来看看Hibernate
是否好用。<br />//MyJsp.jsp<br /><br />&lt;%@ page language="java" import="com.db.*" pageEncoding="UTF-8"%&gt;<br />&lt;%<br />String path = request.getContextPath();<br />String basePath = request.getScheme()+":<br />//"+request.getServerName()+":"+request.getServerPort()+path+"/";<br />%&gt;<br /><br />&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"&gt;<br />&lt;html&gt;<br />  &lt;head&gt;<br />    &lt;base href="&lt;%=basePath%&gt;"&gt;<br />    <br />    &lt;title&gt;My JSP 'MyJsp.jsp' starting page&lt;/title&gt;<br />    <br />    &lt;meta http-equiv="pragma" content="no-cache"&gt;<br />    &lt;meta http-equiv="cache-control" content="no-cache"&gt;<br />    &lt;meta http-equiv="expires" content="0"&gt;<br />    &lt;meta http-equiv="keywords" content="<br />keyword1,keyword2,keyword3"&gt;<br />    &lt;meta http-equiv="description" content="This is my page"&gt;<br />    <br />    &lt;!--<br />    &lt;link rel="stylesheet" type="text/css" href="styles.css"&gt;<br />    --&gt;<br />  &lt;/head&gt;<br />  <br />  &lt;body&gt;<br />    &lt;%    <br />		org.hibernate.Session s = HibernateUtil.currentSession();<br />		String hql = " from Message where text='b'";<br />		try {<br />			org.hibernate.Query query = s.createQuery(hql);<br />			java.util.List msgList = query.list();<br />			hello.Message msg = (hello.Message) msgList.get(0);<br />			out.println(msg.getId());<br />			out.println(msg.getText());<br />			out.println(msg.getNextmessage());			<br />		} catch (org.hibernate.HibernateException e) {<br />			e.printStackTrace();<br />		}		<br />		HibernateUtil.closeSession();		<br />    %&gt;<br />  &lt;/body&gt;<br />&lt;/html&gt;<br /></font>
		</p>
		<p>
				<font size="2">正常的结果如下： </font>
		</p>
		<p>
				<font size="2">
						<a href="http://java.chinaitlab.com/UploadFiles_8734/200602/20060208104501444.jpg" target="_blank">
								<img src="http://java.chinaitlab.com/UploadFiles_8734/200602/20060208104502542.jpg" border="0" height="57" width="252" />
						</a>
				</font>
		</p>
		<font size="2">
				<br />
		</font>
		<p>
				<font size="2">
						<br />
				</font>
		</p>
		<p>
				<font size="2">
						<br />
				</font>
		</p>
		<font size="2">
				<br />
		</font>
<img src ="http://www.blogjava.net/hellotony/aggbug/36673.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hellotony/" target="_blank">Tony</a> 2006-03-21 18:36 <a href="http://www.blogjava.net/hellotony/articles/36673.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何从Hibernate2.1升级到Hibernate3.0？</title><link>http://www.blogjava.net/hellotony/articles/36672.html</link><dc:creator>Tony</dc:creator><author>Tony</author><pubDate>Tue, 21 Mar 2006 10:33:00 GMT</pubDate><guid>http://www.blogjava.net/hellotony/articles/36672.html</guid><wfw:comment>http://www.blogjava.net/hellotony/comments/36672.html</wfw:comment><comments>http://www.blogjava.net/hellotony/articles/36672.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hellotony/comments/commentRss/36672.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hellotony/services/trackbacks/36672.html</trackback:ping><description><![CDATA[
		<p>
				<font size="2">1.1 Hibernate API 变化 <br />
1.1.1 包名 <br />
1.1.2 org.hibernate.classic包 <br />
1.1.3 Hibernate所依赖的第三方软件包 <br />
1.1.4 异常模型 <br />
1.1.5 Session接口 <br />
1.1.6 createSQLQuery() <br />
1.1.7 Lifecycle 和 Validatable 接口 <br />
1.1.8 Interceptor接口 <br />
1.1.9 UserType和CompositeUserType接口 <br />
1.1.10 FetchMode类 <br />
1.1.11 PersistentEnum类 <br />
1.1.12 对Blob 和Clob的支持 <br />
1.1.13 Hibernate中供扩展的API的变化 <br />
1.2 元数据的变化 <br />
1.2.1 检索策略 <br />
1.2.2 对象标识符的映射 <br />
1.2.3 集合映射 <br />
1.2.4 DTD <br />
1.3 查询语句的变化 <br />
1.3.1 indices()和elements()函数 <br /></font>
		</p>
		<div id="a000854more">
				<div id="more">
						<p>
								<font size="2">尽管Hibernate 3.0
与Hibernate2.1的源代码是不兼容的，但是当Hibernate开发小组在设计Hibernate3.0时，为简化升级Hibernate版本
作了周到的考虑。对于现有的基于Hibernate2.1的Java项目，可以很方便的把它升级到Hibernate3.0。 </font>
						</p>
						<p>
								<font size="2">本文描述了Hibernate3.0版本的新变化，Hibernate3.0版本的变化包括三个方面： <br />
（1）API的变化，它将影响到Java程序代码。 <br />
（2）元数据，它将影响到对象-关系映射文件。 <br />
（3）HQL查询语句。 </font>
						</p>
						<p>
								<font size="2">值得注意的是， Hibernate3.0并不会完全取代Hibernate2.1。在同一个应用程序中，允许Hibernate3.0和Hibernate2.1并存。 </font>
						</p>
						<p>
								<font size="2">1.1 Hibernate API 变化 </font>
						</p>
						<p>
								<font size="2">1.1.1 包名 </font>
						</p>
						<p>
								<font size="2">Hibernate3.0的包的根路径为: “org.hibernate” ，而在Hibernate2.1中为“net.sf.hibernate”。这一命名变化使得Hibernate2.1和Hibernate3.0能够同时在同一个应用程序中运行。 </font>
						</p>
						<p>
								<font size="2">如果希望把已有的应用升级到Hibernate3.0，那么升级的第一步是把Java源程序中的所有“net.sf.hibernate”替换为“org.hibernate”。 </font>
						</p>
						<p>
								<font size="2">Hibernate2.1中的“net.sf.hibernate.expression”包被改名为
“org.hibernate.criterion”。假如应用程序使用了Criteria
API，那么在升级的过程中，必须把Java源程序中的所有“net.sf.hibernate.expression”替换为
“org.hibernate.criterion”。 </font>
						</p>
						<p>
								<font size="2">如果应用使用了除Hibernate以外的其他外部软件，而这个外部软件又引用了Hibernate的接口，那么在升级时必须十分小心。例如
EHCache拥有自己的CacheProvider：
net.sf.ehcache.hibernate.Provider，在这个类中引用了Hibernate2.1中的接口，在升级应用时，可以采用以下
办法之一来升级EHCache: </font>
						</p>
						<p>
								<font size="2">（1）手工修改net.sf.ehcache.hibernate.Provider类，使它引用Hibernate3.0中的接口。 <br />
（2）等到EHCache软件本身升级为使用Hibernate3.0后，使用新的EHCache软件。 <br />
（3）使用Hibernate3.0中内置的CacheProvider：org.hibernate.cache.EhCacheProvider。 </font>
						</p>
						<p>
								<font size="2">1.1.2 org.hibernate.classic包 </font>
						</p>
						<p>
								<font size="2">Hibernate3.0把一些被废弃的接口都转移到org.hibernate.classic中。 </font>
						</p>
						<p>
								<font size="2">1.1.3 Hibernate所依赖的第三方软件包 </font>
						</p>
						<p>
								<font size="2">在Hibernate3.0的软件包的lib目录下的README.txt文件中，描述了Hibernate3.0所依赖的第三方软件包的变化。 </font>
						</p>
						<p>
								<font size="2">1.1.4 异常模型 </font>
						</p>
						<p>
								<font size="2">在Hibernate3.0中，HibernateException异常以及它的所有子类都继承了java.lang.RuntimeException。因此在编译时，编译器不会再检查HibernateException。 </font>
						</p>
						<p>
								<font size="2">1.1.5 Session接口 </font>
						</p>
						<p>
								<font size="2">在Hibernate3.0中，原来Hibernate2.1的Session接口中的有些基本方法也被废弃，但为了简化升级，这些方法依然是可用的，可以通过org.hibernate.classic.Session子接口来访问它们，例如： <br />
org.hibernate.classic.Session session=sessionFactory.openSession(); <br />
session.delete("delete from Customer "); <br />
在Hibernate3.0中，org.hibernate.classic.Session接口继承了org.hibernate.Session接
口，在org.hibernate.classic.Session接口中包含了一系列被废弃的方法，如find()、interate()等。
SessionFactory接口的openSession()方法返回org.hibernate.classic.Session类型的实例。如果希
望在程序中完全使用Hibernate3.0，可以采用以下方式创建Session实例： </font>
						</p>
						<p>
								<font size="2">org.hibernate.Session session=sessionFactory.openSession(); </font>
						</p>
						<p>
								<font size="2">如果是对已有的程序进行简单的升级，并且希望仍然调用Hibernate2.1中Session的一些接口，可以采用以下方式创建Session实例： </font>
						</p>
						<p>
								<font size="2">org.hibernate.classic.Session session=sessionFactory.openSession(); </font>
						</p>
						<p>
								<font size="2">在Hibernate3.0中，Session接口中被废弃的方法包括： <br />
* 执行查询的方法：find()、iterate()、filter()和delete(String hqlSelectQuery) <br />
* saveOrUpdateCopy() </font>
						</p>
						<p>
								<font size="2">Hibernate3.0一律采用createQuery()方法来执行所有的查询语句，采用DELETE 查询语句来执行批量删除，采用merge()方法来替代 saveOrUpdateCopy()方法。 </font>
						</p>
						<p>
								<font size="2">提示：在Hibernate2.1中，Session的delete()方法有几种重载形式，其中参数为HQL查询语句的delete()方法在
Hibernate3.0中被废弃，而参数为Ojbect类型的的delete()方法依然被支持。delete(Object
o)方法用于删除参数指定的对象，该方法支持级联删除。 <br />
Hibernate2.1没有对批量更新和批量删除提供很好的支持，参见&lt;&lt;精通Hibernate&gt;&gt;一书的第13章的
13.1.1节（批量更新和批量删除），而Hibernate3.0对批量更新和批量删除提供了支持，能够直接执行批量更新或批量删除语句，无需把被更新
或删除的对象先加载到内存中。以下是通过Hibernate3.0执行批量更新的程序代码： <br />
Session session = sessionFactory.openSession(); <br />
Transaction tx = session.beginTransaction(); <br />
String hqlUpdate = "update Customer set name = :newName where name = :oldName"; <br />
int updatedEntities = s.createQuery( hqlUpdate ) <br />
.setString( "newName", newName ) <br />
.setString( "oldName", oldName ) <br />
.executeUpdate(); <br />
tx.commit(); <br />
session.close(); <br />
以下是通过Hibernate3.0执行批量删除的程序代码： <br />
Session session = sessionFactory.openSession(); <br />
Transaction tx = session.beginTransaction(); <br />
String hqlDelete = "delete Customer where name = :oldName"; <br />
int deletedEntities = s.createQuery( hqlDelete ) <br />
.setString( "oldName", oldName ) <br />
.executeUpdate(); <br />
tx.commit(); <br />
session.close(); </font>
						</p>
						<p>
								<font size="2">1.1.6 createSQLQuery() </font>
						</p>
						<p>
								<font size="2">在Hibernate3.0中，Session接口的createSQLQuery()方法被废弃，被移到org.hibernate.classic.Session接口中。Hibernate3.0采用新的SQLQuery接口来完成相同的功能。 </font>
						</p>
						<p>
								<font size="2">1.1.7 Lifecycle 和 Validatable 接口 </font>
						</p>
						<p>
								<font size="2">Lifecycle和Validatable 接口被废弃，并且被移到org.hibernate.classic包中。 </font>
						</p>
						<p>
								<font size="2">1.1.8 Interceptor接口 </font>
						</p>
						<p>
								<font size="2">在Interceptor 接口中加入了两个新的方法。
用户创建的Interceptor实现类在升级的过程中，需要为这两个新方法提供方法体为空的实现。此外，instantiate()方法的参数作了修
改，isUnsaved()方法被改名为isTransient()。 </font>
						</p>
						<p>
								<font size="2">1.1.9 UserType和CompositeUserType接口 </font>
						</p>
						<p>
								<font size="2">在UserType和CompositeUserType接口中都加入了一些新的方法，这两个接口被移到org.hibernate.usertype包中，用户定义的UserType和CompositeUserType实现类必须实现这些新方法。 <br />
Hibernate3.0提供了ParameterizedType接口，用于更好的重用用户自定义的类型。 <br />
1.1.10 FetchMode类 </font>
						</p>
						<p>
								<font size="2">FetchMode.LAZY 和 FetchMode.EAGER被废弃。取而代之的分别为FetchMode.SELECT 和FetchMode.JOIN。 </font>
						</p>
						<p>
								<font size="2">1.1.11 PersistentEnum类 </font>
						</p>
						<p>
								<font size="2">PersistentEnum被废弃并删除。已经存在的应用应该采用UserType来处理枚举类型。 </font>
						</p>
						<p>
								<font size="2">1.1.12 对Blob 和Clob的支持 </font>
						</p>
						<p>
								<font size="2">Hibernate对Blob和Clob实例进行了包装，使得那些拥有Blob或Clob类型的属性的类的实例可以被游离、序列化或反序列化，以及传递到merge()方法中。 </font>
						</p>
						<p>
								<font size="2">1.1.13 Hibernate中供扩展的API的变化 </font>
						</p>
						<p>
								<font size="2">org.hibernate.criterion、 org.hibernate.mapping、 org.hibernate.persister和org.hibernate.collection 包的结构和实现发生了重大的变化。多数基于Hibernate <br />
2.1 的应用不依赖于这些包，因此不会被影响。如果你的应用扩展了这些包中的类，那么必须非常小心的对受影响的程序代码进行升级。 </font>
						</p>
						<p>
								<font size="2">1.2 元数据的变化 </font>
						</p>
						<p>
								<font size="2">1.2.1 检索策略 </font>
						</p>
						<p>
								<font size="2">在Hibernate2.1中，lazy属性的默认值为“false”，而在Hibernate3.0中，lazy属性的默认值为“true”。在升级映射文件时，如果原来的映射文件中的有关元素，如<set>、<class>等没有显式设置lazy属性，那么必须把它们都显式的设置为lazy=“true”。如果觉得这种升级方式很麻烦，可以采取另一简单的升级方式：在<hibernate-mapping>元素中设置: default-lazy=“false”。 </hibernate-mapping></class></set></font>
						</p>
						<p>
								<font size="2">1.2.2 对象标识符的映射 </font>
						</p>
						<p>
								<font size="2">unsaved-value属性是可选的，在多数情况下，Hibernate3.0将把unsaved-value="0" 作为默认值。 </font>
						</p>
						<p>
								<font size="2">在Hibernate3.0中，当使用自然主键和游离对象时，不再强迫实现Interceptor.isUnsaved()方法。
如果没有设置这个方法，当Hibernate3.0无法区分对象的状态时，会查询数据库，来判断这个对象到底是临时对象，还是游离对象。不过，显式的使用
Interceptor.isUnsaved()方法会获得更好的性能，因为这可以减少Hibernate直接访问数据库的次数。 </font>
						</p>
						<p>
								<font size="2">1.2.3 集合映射 </font>
						</p>
						<p>
								<font size="2">
										<index>元素在某些情况下被<list-index>和<map-key>元素替代。此外，Hibernate3.0用<map-key-many-to-many> 元素来替代原来的<key-many-to-many>.元素，用<composite-map-key>元素来替代原来的<composite-index>元素。 </composite-index></composite-map-key></key-many-to-many></map-key-many-to-many></map-key></list-index></index>
								</font>
						</p>
						<p>
								<font size="2">1.2.4 DTD </font>
						</p>
						<p>
								<font size="2">对象-关系映射文件中的DTD文档，由原来的： <br />
http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd <br />
改为： <br />
http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd </font>
						</p>
						<p>
								<font size="2">1.3 查询语句的变化 </font>
						</p>
						<p>
								<font size="2">Hibernate3.0 采用新的基于ANTLR的HQL/SQL查询翻译器，不过，Hibernate2.1的查询翻译器也依然存在。在Hibernate的配置文件中，hibernate.query.factory_class属性用来选择查询翻译器。例如： <br />
（1）选择Hibernate3.0的查询翻译器： <br />
hibernate.query.factory_class= org.hibernate.hql.ast.ASTQueryTranslatorFactory <br />
（2）选择Hibernate2.1的查询翻译器 <br />
hibernate.query.factory_class= org.hibernate.hql.classic.ClassicQueryTranslatorFactory </font>
						</p>
						<p>
								<font size="2">提示：ANTLR是用纯Java语言编写出来的一个编译工具，它可生成Java语言或者是C++的词法和语法分析器，并可产生语法分析树并对该树进行遍历。ANTLR由于是纯Java的，因此可以安装在任意平台上，但是需要JDK的支持。 <br />
Hibernate开发小组尽力保证Hibernate3.0的查询翻译器能够支持Hibernate2.1的所有查询语句。不过，对于许多已经存在的应用，在升级过程中，也不妨仍然使用Hibernate2.1的查询翻译器。 <br />
值得注意的是，
Hibernate3.0的查询翻译器存在一个Bug：不支持某些theta-style连结查询方言：如Oracle8i的OracleDialect
方言、Sybase11Dialect。解决这一问题的办法有两种：（1）改为使用支持ANSI-style连结查询的方言，如
Oracle9Dialect,（2）如果升级的时候遇到这一问题，那么还是改为使用Hibernate2.1的查询翻译器。 </font>
						</p>
						<p>
								<font size="2">1.3.1 indices()和elements()函数 </font>
						</p>
						<p>
								<font size="2">在HQL的select子句中废弃了indices()和elements()函数，因为这两个函数的语法很让用户费解，可以用显式的连接查询语句
来替代 select elements(...) 。而在HQL的where子句中，仍然可以使用elements()函数。 </font>
						</p>
				</div>
		</div>
<img src ="http://www.blogjava.net/hellotony/aggbug/36672.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hellotony/" target="_blank">Tony</a> 2006-03-21 18:33 <a href="http://www.blogjava.net/hellotony/articles/36672.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>升级Hibernate3的几点体会</title><link>http://www.blogjava.net/hellotony/articles/36671.html</link><dc:creator>Tony</dc:creator><author>Tony</author><pubDate>Tue, 21 Mar 2006 10:32:00 GMT</pubDate><guid>http://www.blogjava.net/hellotony/articles/36671.html</guid><wfw:comment>http://www.blogjava.net/hellotony/comments/36671.html</wfw:comment><comments>http://www.blogjava.net/hellotony/articles/36671.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hellotony/comments/commentRss/36671.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hellotony/services/trackbacks/36671.html</trackback:ping><description><![CDATA[
		<font size="2">之前都是用Hibernate2的，原来也没想着升级，那天突然发现项目里要做批量删除的功能，心想不如升级Hibernate3体验一下罢！<br />
谁知把lib一改，全乱了！首先是hibernate包的路径改了，要把所有的“net.sf.hibernate”替换为“org.hibernate”。<br />
然后就是处理下面几个废弃的方法：find()、iterate()、filter()、delete(String
hqlSelectQuery)和saveOrUpdateCopy()。Hibernate3一律采用createQuery()方法来执行所有的查询
语句，采用DELETE 查询语句来执行批量删除，采用merge()方法来替代
saveOrUpdateCopy()方法。——又是一次全文搜索和替换！<br />
这样，IDE基本没有报错信息了！但一旦运行就会报Connection timed
out，后来发现hibernate的config文件和map文件都必须把dtd改为3.0。否则xerces会到hibernate.org上找
3.0dtd,如果你没有联网，则会报出java.net.ConnectException。<br />
另外，还要记得添加antlr-2.7.5H3.jar，要不会报java.lang.NoClassDefFoundError: antlr/ANTLRException。<br />
花了大半天时间，系统基本正常了！粗略检查了一下，浏览和修改功能都正常，但有一个问题，竟然无法插入新记录啊！<br />
出现的异常为：<br />
org.hibernate.exception.ConstraintViolationException: could not insert<br />
后来在所有元素中设置: default-lazy="false"就可以了。<br />
值得一提的是，如果只想对已有的程序进行简单的升级，并且希望仍然调用Hibernate2.1中Session的一些接口，可以采用以下方式创建Session实例：<br />
org.hibernate.classic.Session session=sessionFactory.openSession();<br />
这样的改动会小很多～～～当然如果希望在程序中完全使用Hibernate3.0，就只能采用以下方式创建Session实例：org.hibernate.Session session=sessionFactory.openSession();<br /><br /><br /></font>
		<h3 class="title">
				<font size="2">
						<a href="http://up-u.com/?q=node/236#comment-194" class="active">补充关于hilo Generator的变化</a>
				</font>
		</h3>
		<div class="submitted">
				<font size="2">Submitted by alex on Fri, 2005-10-28 11:40.</font>
		</div>
		<div class="content">
				<p>
						<font size="2">如果使用高/低位算法（hilo）生成id，hibernate3也有一点变化。在hibernate2中，hi值是其对应的class的最近一个实例的id，但hibernate3则是下一个将要产生的实例的id，即h2的hi值比h3的hi值小1。</font>
				</p>
		</div>
		<br />
<img src ="http://www.blogjava.net/hellotony/aggbug/36671.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hellotony/" target="_blank">Tony</a> 2006-03-21 18:32 <a href="http://www.blogjava.net/hellotony/articles/36671.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>hibernate3.0实例</title><link>http://www.blogjava.net/hellotony/articles/36670.html</link><dc:creator>Tony</dc:creator><author>Tony</author><pubDate>Tue, 21 Mar 2006 10:31:00 GMT</pubDate><guid>http://www.blogjava.net/hellotony/articles/36670.html</guid><wfw:comment>http://www.blogjava.net/hellotony/comments/36670.html</wfw:comment><comments>http://www.blogjava.net/hellotony/articles/36670.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hellotony/comments/commentRss/36670.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hellotony/services/trackbacks/36670.html</trackback:ping><description><![CDATA[
		<font size="2">

			

			hibernate3.0实例<br />建议是有一点点是一点点基础的人又没有hibernate基础和经验的人比较适合(所谓一点点基础是最起码不要我介绍一些配置文件的什么的.).注意我用的JDBC驱动com.inet.tds.TdsDriver<br />要是感觉注释太少,或者是在调试的过程中出现BUG或者是什么的,请回贴,我会答复你.<br />大家一起努力学习吧.<br /><br />1、建立PO对象 <br />   建PO对象Customer、Order以及它们的hibernate配置文件<br /><br /> /*<br /> * Created on 2005-10-12<br /> *<br /> * TODO To change the template for this generated file go to<br /> * Window - Preferences - Java - Code Style - Code Templates<br /> */<br />package testdemo;<br /><br />import java.util.HashSet;<br />import java.util.Set;<br /><br />/**<br /> * @author liuzj<br /> * <br /> * TODO To change the template for this generated type comment go to Window -<br /> * Preferences - Java - Code Style - Code Templates<br /> */<br /><br />public class Customer {<br />    private int id;<br /><br />    private String username;<br /><br />    private String password;<br /><br />    private Set orders = new HashSet();<br /><br />    public Customer() {<br />    }<br /><br />    public Customer(String username, String password, Set orders) {<br />        this.username = username;<br />        this.password = password;<br /><br />        this.orders = orders;<br /><br />    }<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 Set getOrders() {<br />        return orders;<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 />    public void setOrders(Set orders) {<br />        this.orders = orders;<br />    }<br /><br />}<br /><br /><br />&lt;?xml version="1.0"?&gt;<br />&lt;!DOCTYPE hibernate-mapping PUBLIC<br />      "-//Hibernate/Hibernate Mapping DTD 3.0//EN"<br />          "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"&gt;<br /> &lt;hibernate-mapping&gt;<br />   &lt;class name="testdemo.Customer" table="CUSTOMER" dynamic-insert="true" dynamic-update="true"&gt;<br />   &lt;id name="id" column="ID"&gt;<br />     &lt;generator class="increment" /&gt;<br />    &lt;/id&gt;<br />   &lt;property name="username" column="USERNAME" /&gt;<br />   &lt;property name="password" column="PASSWORD" /&gt;<br />   <br />       &lt;set <br />        name="orders"<br />        inverse="true"<br />        cascade="save-update"  <br />    &gt;<br />        &lt;key column="CUSTOMER_ID" /&gt;<br />        &lt;one-to-many class="testdemo.Order" /&gt;<br />   &lt;/set&gt;   <br />   <br />  &lt;/class&gt;<br /> &lt;/hibernate-mapping&gt;<br /><br /><br />/*<br /> * Created on 2005-10-13<br /> *<br /> * TODO To change the template for this generated file go to<br /> * Window - Preferences - Java - Code Style - Code Templates<br /> */<br />package testdemo;<br /><br />/**<br /> * @author liuzj<br /> *<br /> * TODO To change the template for this generated type comment go to<br /> * Window - Preferences - Java - Code Style - Code Templates<br /> */<br /><br />import java.io.Serializable;<br />public class Order implements Serializable {<br /><br />    private Long id;<br />    private String orderNumber;<br />    private double price;<br />    private Customer customer;<br /><br />    public Order() {<br />    }<br />    public Order(String orderNumber,double price,Customer customer) {<br />      this.orderNumber=orderNumber;<br />      this.price=price;<br />      this.customer=customer;<br />    }<br />    public Long getId() {<br />        return this.id;<br />    }<br /><br />    public void setId(Long id) {<br />        this.id = id;<br />    }<br /><br />    public String getOrderNumber() {<br />        return this.orderNumber;<br />    }<br /><br />    public void setOrderNumber(String orderNumber) {<br />        this.orderNumber = orderNumber;<br />    }<br /><br />    public Customer getCustomer() {<br />        return this.customer;<br />    }<br /><br />    public void setCustomer(Customer customer) {<br />        this.customer = customer;<br />    }<br /><br />    public double getPrice(){<br />       return this.price;<br />    }<br />    private void setPrice( double price ){<br />       this.price = price;<br />    }<br />}<br /><br /><br /><br />&lt;?xml version="1.0"?&gt;<br />&lt;!DOCTYPE hibernate-mapping PUBLIC<br />      "-//Hibernate/Hibernate Mapping DTD 3.0//EN"<br />          "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"&gt;<br /><br />&lt;hibernate-mapping  package="testdemo"&gt;<br /><br />   &lt;class name="Order"  table="ORDERS"&gt;<br />     <br />      &lt;id name="id"&gt;<br />        &lt;generator class="increment"/&gt;<br />      &lt;/id&gt;<br />   <br />      &lt;property name="orderNumber" column="ORDER_NUMBER"/&gt;<br />      &lt;property name="price" /&gt;<br /><br />     &lt;many-to-one<br />        name="customer"<br />        column="CUSTOMER_ID"<br />        class="Customer"<br />        not-null="true" <br />     /&gt;<br /><br />   &lt;/class&gt;<br /> &lt;/hibernate-mapping&gt;<br /><br /><br />上面的PO已经建立完成，下面是一个测试类<br /><br /><br />/*<br /> * Created on 2005-10-12<br /> *<br /> * TODO To change the template for this generated file go to<br /> * Window - Preferences - Java - Code Style - Code Templates<br /> */<br />package testdemo;<br /><br />import java.util.HashSet;<br /><br />import org.hibernate.Session;<br />import org.hibernate.SessionFactory;<br />import org.hibernate.Transaction;<br />import org.hibernate.cfg.Configuration;<br /><br />import testdemo.Customer;<br /><br />/**<br /> * @author liuzj<br /> * <br /> * TODO To change the template for this generated type comment go to Window -<br /> * Preferences - Java - Code Style - Code Templates<br /> */<br /><br />public class Test {<br /><br />    SessionFactory sessionFactory = new Configuration().configure().addClass(<br />            testdemo.Customer.class).addClass(Order.class).buildSessionFactory();<br />    Session session = sessionFactory.openSession();<br />    public void saveCustomer(Customer customer) throws Exception {<br />        <br />        Transaction tx = null;<br />        try {<br />            tx = session.beginTransaction();<br />            session.save(customer);<br />            <br />            tx.commit();<br /><br />        } catch (Exception e) {<br />            if (tx != null) {<br />                tx.rollback();<br />            }<br />            throw e;<br />        } finally {<br />            session.close();<br />        }<br />    }<br />    <br />    <br />    public void testmethod()throws Exception<br />    {<br />      Customer customer=new Customer("lzhengj","001",new HashSet());<br />      Order order1=new Order("Order",1000,customer);<br />      Order order2=new Order("Order",2000,customer);<br />      customer.getOrders().add(order1);<br />      customer.getOrders().add(order2);<br />      this.saveCustomer(customer);<br /><br />    }<br /><br />    public static void main(String[] args) {<br />        <br />        try{<br />         new Test().testmethod();<br />            <br />        }catch(Exception e)<br />        {<br />        System.out.println("this is the testmethod  throw exception.....");<br />         e.printStackTrace();    <br />        }<br /><br />    }<br />}<br /><br /><br />ok,下面是一个hibernate的配置hibernate.cfg.xml(位于应用目录下面)<br /><br />&lt;!DOCTYPE hibernate-configuration PUBLIC<br />    "-//Hibernate/Hibernate Configuration DTD 3.0//EN"<br />    "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"&gt;<br />&lt;hibernate-configuration&gt;<br />    &lt;session-factory&gt;<br />          &lt;property name="hibernate.connection.url"&gt;<br />          jdbc:inetdae:localhost:1433?charset=gbk&amp;database=hibernate_test<br />          &lt;/property&gt;<br />          &lt;property name="hibernate.connection.driver_class"&gt;<br />            com.inet.tds.TdsDriver<br />          &lt;/property&gt;<br />          &lt;property name="hibernate.connection.username"&gt;<br />            sa<br />          &lt;/property&gt;<br />          &lt;property name="hibernate.connection.password"&gt;<br />       aa<br />          &lt;/property&gt;<br />          &lt;property name="hibernate.dialect"&gt;<br />          org.hibernate.dialect.SQLServerDialect<br />          &lt;/property&gt;<br />          &lt;property name="show_sql"&gt;<br />          true<br />          &lt;/property&gt;<br />    &lt;/session-factory&gt;<br />&lt;/hibernate-configuration&gt;<br /><br />另外还需要配置一个LOG文件log4j.properties (位于应用目录下面)<br /><br />log4j.rootLogger=DEBUG, stdout<br />log4j.appender.stdout=org.apache.log4j.ConsoleAppender<br />log4j.appender.stdout.layout=org.apache.log4j.PatternLayout<br />log4j.appender.stdout.layout.ConversionPattern=%c{1} - %m%n</font>
<img src ="http://www.blogjava.net/hellotony/aggbug/36670.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hellotony/" target="_blank">Tony</a> 2006-03-21 18:31 <a href="http://www.blogjava.net/hellotony/articles/36670.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>史上最简单的Hibernate入门简介</title><link>http://www.blogjava.net/hellotony/articles/35369.html</link><dc:creator>Tony</dc:creator><author>Tony</author><pubDate>Wed, 15 Mar 2006 03:08:00 GMT</pubDate><guid>http://www.blogjava.net/hellotony/articles/35369.html</guid><wfw:comment>http://www.blogjava.net/hellotony/comments/35369.html</wfw:comment><comments>http://www.blogjava.net/hellotony/articles/35369.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hellotony/comments/commentRss/35369.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hellotony/services/trackbacks/35369.html</trackback:ping><description><![CDATA[<font size="2">&nbsp;&nbsp;&nbsp; 其实Hibernate本身是个独立的框架，它不需要任何web server或application
server的支持。然而，大多数的Hibernate入门介绍都加入了很多非Hibernate的东西，比如: Tomcat, Eclipse,
Log4J,Struts, XDoclet, 甚至JBoss。这容易让人产生Hibernate复杂难懂的误解，特别是打击了初学者的积极性。<br><br>&nbsp;&nbsp;&nbsp; 在这篇文章将不涉及Eclipse, log4j, Struts, Tomcat, XDoclet，和JBoss。本文的目的是演示一下Hibernate的安装过程以及最基本的功能，从而给初学者一个低得不能再低的入门门槛。<br><br><br><b>下载文件</b><br><br>你需要Java SDK、 Hibernate包、Ant包、和JDBC Driver。<br><br>1、Hibernate包下载地址:<br><a href="http://prdownloads.sourceforge.net/hibernate/?sort_by=date&amp;sort=desc">http://prdownloads.sourceforge.net/hibernate/?sort_by=date&amp;sort=desc</a><br><br>2、Ant包下载地址:<br><a href="http://apache.130th.net/ant/binaries/apache-ant-1.6.1-bin.zip">http://apache.130th.net/ant/binaries/apache-ant-1.6.1-bin.zip</a><br><br>3、
JDBC
Driver要根据你用的database来定，一般database官方网站上都会有。Hibernate支持常用的database，比如
MySQL, Oracle, PostgreSQL, 和MS-SQL Server。这些数据库都有JDBC Driver: <br><br>Oracle JDBC Driver下载地址(下载前必须同意Oracle协议书)<br><a href="http://otn.oracle.com/software/htdocs/distlic.html?/software/tech/java/sqlj_jdbc/htdocs/jdbc9201.html">http://otn.oracle.com/software/htdocs/distlic.html?/software/tech/java/sqlj_jdbc/htdocs/jdbc9201.html</a><br><br>MySQL JDBC Driver下载地址<br><a href="http://dev.mysql.com/downloads/connector/j/3.0.html">http://dev.mysql.com/downloads/connector/j/3.0.html</a><br><br>PostgreSQL JDBC Driver下载地址<br><a href="http://jdbc.postgresql.org/download.html">http://jdbc.postgresql.org/download.html</a><br><br>MS-SQL Server JDBC Driver下载地址<br><a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=9f1874b6-f8e1-4bd6-947c-0fc5bf05bf71&amp;displaylang=en">http://www.microsoft.com/downloads/details.aspx?FamilyID=9f1874b6-f8e1-4bd6-947c-0fc5bf05bf71&amp;displaylang=en</a><br><br>4、将Hibernate包和Ant包分别解压至c:\dev\下(此目录不重要，你可以换其它任何目录)。<br><br><br><b>配置环境</b><br><br>1、你需要添加一个新的环境变量: ANT_HOME，让它指向c:\dev\&lt;你的ANT包所在目录&gt;。并在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>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<br><br>4、将c:\dev\&lt;你的Hibernate包所在目录&gt;\hibernate2.jar文件copy到c:\workspace\My1stHibernate\lib\hibernate下。<br><br>将c:\dev\&lt;你的Hibernate包所在目录&gt;\lib\下的所有文件同样copy到c:\workspace\My1stHibernate\lib\hibernate下。<br><br>将你的JDBC Driver文件(一般是一个jar文件)copy到c:\workspace\My1stHibernate\lib\db下。<br><br><br><b>创建数据库</b><br><br>1、用你最喜爱的database软件，创建一个hibernate_test的数据库。<br><br>2、在此数据库下，新建一个table名为CUSTOMER<br><br>CREATE TABLE CUSTOMER<br>(<br>&nbsp;&nbsp;&nbsp; CID INTEGER NOT NULL PRIMARY KEY, <br>&nbsp;&nbsp;&nbsp; USERNAME VARCHAR(12) NOT NULL, <br>&nbsp;&nbsp;&nbsp; PASSWORD VARCHAR(12) <br>);<br><br><br><b>编写Java文件</b><br><br>public class Customer {<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; private int id;<br>&nbsp;&nbsp;&nbsp; private String username;<br>&nbsp;&nbsp;&nbsp; private String password;<br><br><br>&nbsp;&nbsp;&nbsp; public int getId() {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return id;<br>&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp; public String getPassword() {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return password;<br>&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp; public String getUsername() {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return username;<br>&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp; public void setId(int id) {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; this.id = id;<br>&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp; public void setPassword(String password) {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; this.password = password;<br>&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp; public void setUsername(String username) {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; this.username = username;<br>&nbsp;&nbsp;&nbsp; }<br><br>}<br><br>将此类存为c:\workspace\My1stHibernate\src\Customer.java文件。<br><br>编写Test类<br><br>import net.sf.hibernate.*;<br>import net.sf.hibernate.cfg.*;<br><br>public class Test {<br><br>&nbsp;&nbsp;&nbsp; public static void main(String[] args) {<br><br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; try {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; SessionFactory sf =<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; new Configuration().configure().buildSessionFactory();<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Session session = sf.openSession();<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Transaction tx = session.beginTransaction();<br><br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; for (int i = 0; i &lt; 200; i++) {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Customer customer = new Customer();<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; customer.setUsername("customer" + i);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; customer.setPassword("customer");<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; session.save(customer);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; tx.commit();<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; session.close();<br><br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; } catch (HibernateException e) {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; e.printStackTrace();<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br>}<br><br>将此类存为c:\workspace\My1stHibernate\src\Test.java文件。<br><br><br><b>创建Hibernate映射文件</b><br><br>因为这里只有一个Class --- Customer 和一个Table --- CUSTOMER，你只需要建立一个映射文件--- Customer.hbm.xml，来对应Customer类和CUSTOMER表之间的关系。<br><br>&lt;?xml version="1.0"?&gt;<br>&lt;!DOCTYPE hibernate-mapping PUBLIC<br>&nbsp;&nbsp;&nbsp; "-//Hibernate/Hibernate Mapping DTD//EN"<br>&nbsp;&nbsp;&nbsp; "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd"&gt;<br><br>&lt;hibernate-mapping&gt;<br>&nbsp;&nbsp;&nbsp; &lt;class name="Customer" table="CUSTOMER"&gt;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;id name="id" column="CID"&gt;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;generator class="increment" /&gt;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;/id&gt;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;property name="username" column="USERNAME" /&gt;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;property name="password" column="PASSWORD" /&gt;<br>&nbsp;&nbsp;&nbsp; &lt;/class&gt;<br>&lt;/hibernate-mapping&gt;<br><br>把此文件存为c:\workspace\My1stHibernate\src\Customer.hbm.xml，和Customer.java放在同一目录下。<br><br><b><br>编写Ant build.xml文件</b><br><br>你不一定要知道这个build.xml的细节，其实Ant也不是Hibernate所必须的。这里用Ant是为了简化一些任务，比如: 编译、copy、运行，等。<br><br>&lt;?xml version="1.0" ?&gt;<br><br>&lt;project name="My1stHibernate" default="build" basedir="."&gt;<br><br>&nbsp;&nbsp;&nbsp; &lt;property name="base.dir" value="." /&gt;<br>&nbsp;&nbsp;&nbsp; &lt;property name="src.dir" value="src" /&gt;<br>&nbsp;&nbsp;&nbsp; &lt;property name="lib.dir" value="lib" /&gt;<br>&nbsp;&nbsp;&nbsp; &lt;property name="build.dir" value="classes" /&gt;<br><br>&nbsp;&nbsp;&nbsp; &lt;path id="myclasspath"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;fileset dir="${lib.dir}"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;include name="**/*.jar" /&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/fileset&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;pathelement location="${build.dir}" /&gt;<br>&nbsp;&nbsp;&nbsp; &lt;/path&gt;<br><br>&nbsp;&nbsp;&nbsp; &lt;target name="init"&gt;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;mkdir dir="${build.dir}" /&gt;<br>&nbsp;&nbsp;&nbsp; &lt;/target&gt;<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; &lt;target name="build" depends="init" description="compile the source files"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;javac classpathref="myclasspath" srcdir="${src.dir}" destdir="${build.dir}" /&gt;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;copy todir="${build.dir}" &gt;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;fileset dir="${src.dir}" &gt;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;exclude name="**/*.java"/&gt;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;/fileset&gt;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;/copy&gt;<br>&nbsp;&nbsp;&nbsp; &lt;/target&gt;<br><br>&nbsp;&nbsp;&nbsp; &lt;target name="run" depends="build"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;java classpathref="myclasspath" classname="Test" fork="true" /&gt;<br>&nbsp;&nbsp;&nbsp; &lt;/target&gt;<br><br>&nbsp;&nbsp;&nbsp; &lt;target name="clean"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;delete includeEmptyDirs="true"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;fileset dir="${build.dir}" /&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/delete&gt;<br>&nbsp;&nbsp;&nbsp; &lt;/target&gt;<br><br>&lt;/project&gt;<br><br><br><b>配置Hibernate描述文件</b><br><br>Hibernate描述文件可以是一个properties或xml 文件，其中最重要的是定义数据库的连接。我这里列出的是一个XML格式的hibernate.cfg.xml描述文件。<br><br>&lt;?xml version="1.0" encoding="utf-8" ?&gt;<br>&lt;!DOCTYPE hibernate-configuration<br>&nbsp;&nbsp;&nbsp; PUBLIC "-//Hibernate/Hibernate Configuration DTD//EN"<br>&nbsp;&nbsp;&nbsp; "http://hibernate.sourceforge.net/hibernate-configuration-2.0.dtd"&gt;<br><br>&lt;hibernate-configuration&gt;<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; &lt;session-factory name="java:/hibernate/HibernateFactory"&gt;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;property name="show_sql"&gt;true&lt;/property&gt;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;property name="connection.driver_class"&gt;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; oracle.jdbc.driver.OracleDriver &lt;!-- 这里是Oracle 9i的JDBC driver class名 --&gt;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;/property&gt;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;property name="connection.url"&gt;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; jdbc:oracle:oci8:@hibernate_test &lt;!-- 这里是Oracle的hibernate_test数据库URL --&gt; <br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;/property&gt;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;property name="connection.username"&gt;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 你的数据库用户名<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;/property&gt;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;property name="connection.password"&gt;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 你的数据库密码<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;/property&gt;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;property name="dialect"&gt;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; net.sf.hibernate.dialect.Oracle9Dialect &lt;!-- 这里是Oracle 9i的Dialect --&gt;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;/property&gt;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;mapping resource="Customer.hbm.xml" /&gt; &lt;!-- 指定Customer的映射文件 --&gt;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; &lt;/session-factory&gt;<br>&nbsp;&nbsp;&nbsp; <br>&lt;/hibernate-configuration&gt;<br><br>如果你用的不是Oracle 9i，可到C:\dev\&lt;你的Hibernate包所在目录&gt;\src\hibernate.properties文件里找到你的数据库，然后替换以上相对应的值。<br><br><br><b>开始运行</b><br><br>到c:\workspace\My1stHibernate下，运行ant run。如果你严格依照以上步骤，应该看到<br><br>run:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [java] log4j:WARN No appenders could be found for logger (net.sf.hibernate.cfg.Environment).<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [java] log4j:WARN Please initialize the log4j system properly.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [java] Hibernate: insert into CUSTOMER (USERNAME, PASSWORD, CID) values (?, ?, ?)<br>BUILD SUCCESSFUL<br><br>到你的hibernate_test数据库看一下，在CUSTMOR表里新添了200条记录，但你没有写任何JDBC code。<br>以后如果你要更换数据库，只需要改变hibernate.cfg.xml描述文件里相应的值即可。<br><br></font><img src ="http://www.blogjava.net/hellotony/aggbug/35369.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hellotony/" target="_blank">Tony</a> 2006-03-15 11:08 <a href="http://www.blogjava.net/hellotony/articles/35369.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate O/R映射三大基本定则</title><link>http://www.blogjava.net/hellotony/articles/20090.html</link><dc:creator>Tony</dc:creator><author>Tony</author><pubDate>Wed, 16 Nov 2005 08:39:00 GMT</pubDate><guid>http://www.blogjava.net/hellotony/articles/20090.html</guid><wfw:comment>http://www.blogjava.net/hellotony/comments/20090.html</wfw:comment><comments>http://www.blogjava.net/hellotony/articles/20090.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hellotony/comments/commentRss/20090.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hellotony/services/trackbacks/20090.html</trackback:ping><description><![CDATA[<font size="2">1. 引言 <br>在Java环境下，有多种对象关系映射方法，如实体Bean、OJB、JDO、JDBC等。Hibernate是一种新的O/R映射
工具，它不仅提供了从Java类到数据表的映射，也提供了数据查询和恢复等机制。Hibernate非常简单易学,目前国内有很多同行已经或正在用
Hibernate开发实施项目;但Hibernate有很多规则不为人知或应用甚少。本文的目的就是将这些规则归纳总结,希望对您的开发和设计有益。
<br><br>首先声明,本文是Hibernate入门级文章,高手请不用往下看了。 <br><br>2. 基本定则 <br><br><strong><u>定则一:数据库配置文件名称可以不是Hibernate.properties或Hibernate.cfg.xml</u></strong> <br><br>由于Hibernate官方文档(本文<a href="http://www.hibernate.org/" target="_blank"><font color="#002c99">www.hibernate.org</font></a>的
文档)的影响,很多Hibernate开发者误以为系统一定要有名称为Hibernate.properties或Hibernate.cfg.xml的
文件,而且一定要放在classes的根目录下。实际上,该文件只是一般的配置文件,名称可以自己取,文件位置可以自己定,而且在多数据库环境下,可以有
多个配置文件,使得程序可以连接多个数据库。只是您在创建会话工厂时需要特殊处理,代码示例如下: <br><br>//配置文件名称 <br><br>protected static String CONFIG_FILE = "my_hibernate.config"; <br><br>//配置文件目录,可以考虑在该目录下存放系统所有配置文件,此处使用虚拟机参数 <br><br>String configPath = System.getProperty("my.config"); <br><br>//创建会话工厂 <br><br>sessionFactory =( new Configuration().configure(new File(configPath+File.separator+CONFIG_FILE))) .buildSessionFactory(); <br><br><br><br><strong><u><font style="background-color: rgb(255, 255, 255);">定则二:小型项目中,.hbm.xml文件可以合并到一个文件中</font></u></strong> <br><br>同
样由于Hibernate官方文档的影响,很多Hibernate开发者误以为Hibernate的对象关系映射一定要一个表对应一个对象,并将映射文件
和对象文件放在同一目录下。实际上,该模式是为规范性考虑而设计的,因为在多人参与的项目中,多人要维护同一文件容易产生冲突;当项目比较小时,配置文件
的维护人员少,我们完全可以将.hbm.xml文件合并到一个或者几个文件中。依据作者本人的项目设计开发经验,最好是项目中有几人同时从事O/R映射和
持久工作,则设定几个.hbm.xml文件,每人维护一个。当然,为了便于分类和管理,每人的工作应该按逻辑划分。 <br><br>大型项目中的文件配置示例如下: <br><br>&lt;hibernate-configuration&gt; <br><br>&lt;session-factory&gt; <br><br>&lt;!—映射文件分散 --&gt; <br><br>&lt;mapping resource="com/hongsoft/test/ persistence/Cat.hbm.xml"/&gt; <br><br>&lt;mapping resource="com/hongsoft/test/ persistence/Animal.hbm.xml"/&gt; <br><br>&lt;/session-factory&gt; <br><br>&lt;/hibernate-configuration&gt; <br><br>小型项目中的文件配置示例如下: <br><br>&lt;hibernate-configuration&gt; <br><br>&lt;session-factory&gt; <br><br>&lt;!—映射文件集中 --&gt; <br><br>&lt;mapping resource="res_hibernate_map.xml"/&gt; <br><br>&lt;/session-factory&gt; <br><br>&lt;/hibernate-configuration&gt; <br><br><strong><font style="background-color: rgb(211, 211, 211);">要注意的是, 从对Hibernate源代码的分析可知,指定映射文件时,不能用绝对目录,只能用相对目录;而且,<font color="#ff1493">系统以classes根目录为当前目录。</font></font></strong> <br><br><br><u><strong>定则三:对象关系映射是以.hbm.xml文件为基准的,而不是以PO文件为基准</strong></u> <br><br>该定律的意思是:系统启动检查您的对象关系映射是否正确时,是以.hbm.xml为基准来进行检查的;对象文件的property可以比映射文件的property多,但不能少。如果您有如下的映射: <br><br>&lt;class name="com.hongsoft.test.User" table="res_user"&gt; <br><br>&lt;id name="id" column="id" type="long" unsaved-value="any"&gt; <br><br>&lt;generator class="assigned"&gt; <br><br>&lt;/generator&gt; <br><br>&lt;/id&gt; <br><br>&lt;property name="name"/&gt; <br><br>&lt;property name="loginName"/&gt; <br><br>&lt;property name="passwd"/&gt; <br><br>&lt;/class&gt; <br><br>系
统启动,检查数据库和其他配置正确后,将以该文件为基准,首先检查User对象中有无id属性和对应的get/set方法,如果没有则报错,如果有且正确
则检查有无name属性和对应的get/set方法……,直到文件结束。要注意的是,如果属性为name,则get方法名称必须为getName(),
set方法名称必须为setName(),否则会报错。 <br><br>如果User对象除了有id,name,loginName, passwd四个属性和对应的方法,还有其它的属性和方法,会报错吗?不会,因为<strong><font style="background-color: rgb(255, 20, 147);">对象关系映射是以.hbm.xml文件为基准的,而不是以PO文件为基准。</font></strong>您
在项目中可以充分利用该特点,实现您自己的比较特殊的需求。例如,您可以在User对象中加入updatedPasswd表示更改后的口令,由此构造在表
示层要使用的FormBean和在业务层要使用的valueObject。当然,这样做也有缺点,需要根据您的实际情况而定。 <br>3. 总结 </font><img src ="http://www.blogjava.net/hellotony/aggbug/20090.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hellotony/" target="_blank">Tony</a> 2005-11-16 16:39 <a href="http://www.blogjava.net/hellotony/articles/20090.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>从头到脚跟你解释什么是Hibernate</title><link>http://www.blogjava.net/hellotony/articles/20088.html</link><dc:creator>Tony</dc:creator><author>Tony</author><pubDate>Wed, 16 Nov 2005 08:39:00 GMT</pubDate><guid>http://www.blogjava.net/hellotony/articles/20088.html</guid><wfw:comment>http://www.blogjava.net/hellotony/comments/20088.html</wfw:comment><comments>http://www.blogjava.net/hellotony/articles/20088.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hellotony/comments/commentRss/20088.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hellotony/services/trackbacks/20088.html</trackback:ping><description><![CDATA[<font size="2"><strong>Hibernate<br></strong>　　<br>　　Hibernate是一个免费的开源Java包，它使得与关系数据库打交
道变得十分轻松，就像您的数据库中包含每天使用的普通Java对象一样，同时不必考虑如何把它们从神秘的数据库表中取出（或放回到数据库表中）。它解放了
您，使您可以专注于应用程序的对象和功能，而不必担心如何保存它们或稍后如何找到它们。<br>　　<br>　　大多数应用程序都需要处理数据。Java
应用程序运行时，往往把数据封装为相互连接的对象网络，但是当程序结束时，这些对象就会消失在一团逻辑中，所以需要有一些保存它们的方法。有时候，甚至在
编写应用程序之前，数据就已经存在了，所以需要有读入它们和将其表示为对象的方法。手动编写代码来执行这些任务不仅单调乏味、易于出错，而且会占用整个应
用程序的很大一部分开发工作量。<br>　　<br>　　优秀的面向对象开发人员厌倦了这种重复性的劳动，他们开始采用通常的“积极”偷懒做法，即，创建工具，使整个过程自动化。对于关系数据库来说，这种努力的最大成果就是对象/关系映射(ORM)工具。<br>　　<br>　
　这类工具有很多，从昂贵的商业产品到内置于J2EE中的EJB标准。然而，在很多情况下，这些工具具有自身的复杂性，使得开发人员必须学习使用它们的详
细规则，并修改组成应用程序的类以满足映射系统的需要。由于这些工具为应付更加严格和复杂的企业需求而不断发展，于是在比较简单和常见的场景中，使用它们
所面临的复杂性反而盖过了所能获得的好处。这引起了一场革命，促进了轻量级解决方案的出现，而Hibernate就是这样的一个例子。<br>　　<br>　　<b>Hibernate的工作方式</b><br>　　<br>　
　Hibernate不会对您造成妨碍，也不会强迫您修改对象的行为方式。它们不需要实现任何不可思议的接口以便能够持续存在。惟一需要做的就是创建一份
XML“映射文档”，告诉Hibernate您希望能够保存在数据库中的类，以及它们如何关联到该数据库中的表和列，然后就可以要求它以对象的形式获取数
据，或者把对象保存为数据。与其他解决方案相比，它几乎已经很完美了。<br>　　<br>　　由于本文只是一篇介绍性的文章，所以不会引入构建和使用
Hibernate映射文档的具体例子（我在《Hibernate: A Developer's
Notebook》一书的头几章中已经介绍了一个例子）。此外，在网上和Hibernate的在线文档中，还可以找到一些不错的例子，请参见下面的“其他
信息”部分。它实际上相当直观。应用程序对象中的属性以一种简单而自然的方式与正确的数据库结构相关联。<br>　　<br>　　运行时，
Hibernate读取映射文档，然后动态构建Java类，以便管理数据库与Java之间的转换。在Hibernate中有一个简单而直观的API，用于
对数据库所表示的对象执行查询。要修改这些对象，（一般情况下）只需在程序中与它们进行交互，然后告诉Hibernate保存修改即可。类似地，创建新对
象也很简单；只需以常规方式创建它们，然后告诉Hibernate有关它们的信息，这样就能在数据库中保存它们。<br>　　<br>　　
Hibernate
API学习起来很简单，而且它与程序流的交互相当自然。在适当的位置调用它，就可以达成目的。它带来了很多自动化和代码节省方面的好处，所以花一点时间学
习它是值得的。而且还可以获得另一个好处，即代码不用关心要使用的数据库种类（否则的话甚至必须知道）。我所在的公司就曾有过在开发过程后期被迫更换数据
库厂商的经历。这会造成巨大的灾难，但是借助于Hibernate，只需要简单地修改Hibernate配置文件即可。<br>　　<br>　　这里的讨
论假定您已经通过创建Hibernate映射文档，建立了一个关系数据库，并且拥有要映射的Java类。有一个Hibernate“工具集”可在编译时使
用，以支持不同的工作流。例如，如果您已经拥有Java类和映射文档，Hibernate可以为您创建（或更新）必需的数据库表。或者，仅仅从映射文档开
始，Hibernate也能够生成数据类。或者，它可以反向设计您的数据库和类，从而拟定映射文档。还有一些用于Eclipse的alpha
插件，它们可以在IDE中提供智能的编辑支持以及对这些工具的图形访问。<br>　　<br>　　如果您使用的是Hibernate 2环境，这些工具鲜有提供，但是存在可用的第三方工具。<br>　　<br>　　<b>使用Hibernate的场合</b><br>　　<br>　　既然Hibernate看起来如此灵活好用，为什么还要使用其他的工具呢？下面有一些场景，可以帮助您做出判断（或许通过提供一些比较和上下文，可以有助于鉴别非常适用Hibernate的场合）。<br>　　<br>　
　如果应用对于数据存储的需要十分简单——例如，您只想管理一组用户优先选择——您根本不需要数据库，更不用说一个优秀的对象-关系映射系统了（即使它也
如Hibernate这般易于使用）！从Java 1.4开始，有一个标准的Java Preferences
API可以很好地发挥这个作用。（在ONJava文章中可以找到有关Preferences API的更多信息。）<br>　　<br>　　对于熟悉使用
关系数据库和了解如何执行完美的SQL查询与企业数据库交互的人来说，Hibernate似乎有些碍手碍脚，这就像带有动力和自动排挡的快艇车会使注重性
能的赛车驾驶员不耐烦一样。如果您属于这种人，如果您所在的项目团队拥有一个强大的DBA，或者有一些存储过程要处理，您可能想研究一下iBATIS。
Hibernate的创建者本身就把iBATIS当作是另一种有趣的选择。我对它很有兴趣，因为我们曾为一个电子商务站点开发了一个类似的系统（其功能更
为强大），而且从那时到现在，我们已经在其他环境中使用过它，尽管在发现Hibernate之后，在新项目中我们通常更喜欢使用Hibernate。您可
以认为，以SQL为中心的解决方案（比如iBATIS）是“反向的”对象/关系映射工具，而Hibernate是一个更为传统的ORM。<br>　　<br>　
　当然，还有其他的外部原因会导致采用另外的方法。比如，在一个企业环境中，必须使用成熟的EJB架构（或者其他的一些非普通对象映射系统）。可以为提供
自己的数据存储工具的平台量身定做代码，比如Mac OS X's Core Data。使用的可能是像XML
DTD这样的存储规范，而它根本不涉及关系数据库。<br>　　<br>　　但是，如果您使用的是富对象模型，而且想要灵活、轻松且高效地保存它（无论您
是否正要开始或已经决定使用关系数据库，只要这是一个选择——而且存在可用的优秀免费数据库，比如MySQL，或可嵌入Java的HSQLDB，它就应该
始终是一个选择），那么Hibernate很可能就是您理想的选择。您可能会惊讶于节省的时间之多，以及您将会多么地喜欢使用它。<br>　　<br>　　<b>其他信息</b><br>　　<br>　　Hibernate项目有大量的在线文档，可以帮助您找准方向，快速开始使用。<br>　　<br>　　权威性的参考资料是Hibernate in Action，作者是Christian Bauer和Gavin King，都是Hibernate的创建者。该书全面而基础地讲述了Hibernate包的功能和正确的使用方法。<br>　　<br>　
　阅读我的书Hibernate: A Developer's
Notebook，也是一种快速上手的好方法。它直接但详细地讲述了如何在Java项目中设置Hibernate，以及如何使用它的一些最重要的功能。其
中的代码示例普遍基于Hibernate和HSQLDB的早期版本，所以如果您想不加改动地使用它们，需要使用这两种软件的正确版本。无论如何，基本的概
念是正确的，而且我希望能够尽快地针对Hibernate 3更新本书。<br>　　<br>　　另一本有趣的书是Better Faster
Lighter Java，作者是Bruce Tate 和Justin
Gehtland。书中给出了一些实用方法，可以以合理的方式完成实际的项目，这也是它流行的原因之一。它在如何评估和使用（或否决）可用的Java技术
方面给出了合理建议，并作为正确方法的例子提到了Hibernate和Spring。<br>　　<br>　　最后，“Working with
Hibernate in Eclipse”（它预先提到了更强大的新的alpha版的Hibernate
3工具）中详细讲述了如何将一个叫做Hibernate Synchronizer的Eclipse插件与Hibernate一起使用。</font><img src ="http://www.blogjava.net/hellotony/aggbug/20088.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hellotony/" target="_blank">Tony</a> 2005-11-16 16:39 <a href="http://www.blogjava.net/hellotony/articles/20088.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>