﻿<?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-黄小二的讀書筆記-文章分类-S/S2SH</title><link>http://www.blogjava.net/kiant/category/32981.html</link><description>该用户发言已被绿坝软件自动屏蔽</description><language>zh-cn</language><lastBuildDate>Thu, 30 Jul 2009 11:16:44 GMT</lastBuildDate><pubDate>Thu, 30 Jul 2009 11:16:44 GMT</pubDate><ttl>60</ttl><item><title>Struts 2表单标签</title><link>http://www.blogjava.net/kiant/articles/277742.html</link><dc:creator>黄小二</dc:creator><author>黄小二</author><pubDate>Sun, 24 May 2009 15:02:00 GMT</pubDate><guid>http://www.blogjava.net/kiant/articles/277742.html</guid><wfw:comment>http://www.blogjava.net/kiant/comments/277742.html</wfw:comment><comments>http://www.blogjava.net/kiant/articles/277742.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kiant/comments/commentRss/277742.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kiant/services/trackbacks/277742.html</trackback:ping><description><![CDATA[<br />
<a href="http://wiki.javascud.org/display/ww2cndoc/Form+Tags" target="_blank">Form Tags - WebWork2文档中文化计划 </a><br />
<br />
<a href="http://www.blogjava.net/hhhaaawwwkkk/archive/2008/10/27/236925.html" target="_blank">Struts2.0标签库（三）表单标签</a><br />
<br />
及 Struts 2深入详解 by.孙鑫<br />
<br />
<br />
<strong>
<hr />
描述<br />
</strong><br />
对于表单标签,分为两种标签:form标签本身,和所有来包装单个的表单元素的其他标签.form标签本身的行为不同于它内部的元素,这是很重要的.在我们为所有表单标签,包括form标签在内,提供一个参考手册之前,我们必须先描述一些通用的属性. <br />
<br />
<br />
<h1><span style="color: #000000">通用属性<br />
<br />
</span></h1>
<table class="confluenceTable">
    <tbody>
        <tr>
            <td><strong>属性</strong> </td>
            <td><strong>Theme</strong> </td>
            <td><strong>数据类型</strong> </td>
            <td><strong>描述</strong></td>
        </tr>
        <tr>
            <td class="confluenceTd">cssClass </td>
            <td class="confluenceTd">simple </td>
            <td class="confluenceTd">String </td>
            <td class="confluenceTd">定义 html class 属性 </td>
        </tr>
        <tr>
            <td class="confluenceTd">cssStyle </td>
            <td class="confluenceTd">simple </td>
            <td class="confluenceTd">String </td>
            <td class="confluenceTd">定义html style 属性 </td>
        </tr>
        <tr>
            <td class="confluenceTd">title </td>
            <td class="confluenceTd">simple </td>
            <td class="confluenceTd">String </td>
            <td class="confluenceTd">定义html title 属性 </td>
        </tr>
        <tr>
            <td class="confluenceTd">disabled </td>
            <td class="confluenceTd">simple </td>
            <td class="confluenceTd">String </td>
            <td class="confluenceTd">定义html disabled 属性 </td>
        </tr>
        <tr>
            <td class="confluenceTd">label </td>
            <td class="confluenceTd">xhtml </td>
            <td class="confluenceTd">String </td>
            <td class="confluenceTd">定义表单元素的label </td>
        </tr>
        <tr>
            <td class="confluenceTd">labelPosition </td>
            <td class="confluenceTd">xhtml </td>
            <td class="confluenceTd">String </td>
            <td class="confluenceTd">定义表单元素的label位置(top/left),缺省为left </td>
        </tr>
        <tr>
            <td class="confluenceTd">requiredposition </td>
            <td class="confluenceTd">xhtml </td>
            <td class="confluenceTd">String </td>
            <td class="confluenceTd">定义required 标识相对label元素的位置 (left/right),缺省是 right </td>
        </tr>
        <tr>
            <td class="confluenceTd">name </td>
            <td class="confluenceTd">simple </td>
            <td class="confluenceTd">String </td>
            <td class="confluenceTd">表单元素的name映射 </td>
        </tr>
        <tr>
            <td class="confluenceTd">required </td>
            <td class="confluenceTd">xhtml </td>
            <td class="confluenceTd">Boolean </td>
            <td class="confluenceTd">在label中添加 * (true增加,否则不增加) </td>
        </tr>
        <tr>
            <td class="confluenceTd">tabIndex </td>
            <td class="confluenceTd">simple </td>
            <td class="confluenceTd">String </td>
            <td class="confluenceTd">定义html tabindex 属性 </td>
        </tr>
        <tr>
            <td class="confluenceTd">value </td>
            <td class="confluenceTd">simple </td>
            <td class="confluenceTd">Object </td>
            <td class="confluenceTd">定义表单元素的value </td>
        </tr>
    </tbody>
</table>
<br />
<br />
<h1><span style="color: #000000">Javascript相关属性<br />
<br />
</span></h1>
<table class="confluenceTable">
    <tbody>
        <tr>
            <td class="confluenceTh">属性 </td>
            <td class="confluenceTh">Theme </td>
            <td class="confluenceTh">数据类型 </td>
            <td class="confluenceTh">描述 </td>
        </tr>
        <tr>
            <td class="confluenceTd">onclick </td>
            <td class="confluenceTd">simple </td>
            <td class="confluenceTd">String </td>
            <td class="confluenceTd">html javascript onclick 属性 </td>
        </tr>
        <tr>
            <td class="confluenceTd">ondbclick </td>
            <td class="confluenceTd">simple </td>
            <td class="confluenceTd">String </td>
            <td class="confluenceTd">html javascript ondbclick 属性 </td>
        </tr>
        <tr>
            <td class="confluenceTd">onmousedown </td>
            <td class="confluenceTd">simple </td>
            <td class="confluenceTd">String </td>
            <td class="confluenceTd">html javascript onmousedown 属性 </td>
        </tr>
        <tr>
            <td class="confluenceTd">onmouseup </td>
            <td class="confluenceTd">simple </td>
            <td class="confluenceTd">String </td>
            <td class="confluenceTd">html javascript onmouseup 属性 </td>
        </tr>
        <tr>
            <td class="confluenceTd">onmouseover </td>
            <td class="confluenceTd">simple </td>
            <td class="confluenceTd">String </td>
            <td class="confluenceTd">html javascript onmouseover 属性 </td>
        </tr>
        <tr>
            <td class="confluenceTd">onmouseout </td>
            <td class="confluenceTd">simple </td>
            <td class="confluenceTd">String </td>
            <td class="confluenceTd">html javascript onmouseout 属性 </td>
        </tr>
        <tr>
            <td class="confluenceTd">onfocus </td>
            <td class="confluenceTd">simple </td>
            <td class="confluenceTd">String </td>
            <td class="confluenceTd">html javascript onfocus 属性 </td>
        </tr>
        <tr>
            <td class="confluenceTd">onblur </td>
            <td class="confluenceTd">simple </td>
            <td class="confluenceTd">String </td>
            <td class="confluenceTd">html javascript onblur 属性 </td>
        </tr>
        <tr>
            <td class="confluenceTd">onkeypress </td>
            <td class="confluenceTd">simple </td>
            <td class="confluenceTd">String </td>
            <td class="confluenceTd">html javascript onkeypress 属性 </td>
        </tr>
        <tr>
            <td class="confluenceTd">onkeyup </td>
            <td class="confluenceTd">simple </td>
            <td class="confluenceTd">String </td>
            <td class="confluenceTd">html javascript onkeyup 属性 </td>
        </tr>
        <tr>
            <td class="confluenceTd">onkeydown </td>
            <td class="confluenceTd">simple </td>
            <td class="confluenceTd">String </td>
            <td class="confluenceTd">html javascript onkeydown 属性 </td>
        </tr>
        <tr>
            <td class="confluenceTd">onselect </td>
            <td class="confluenceTd">simple </td>
            <td class="confluenceTd">String </td>
            <td class="confluenceTd">html javascript onselect 属性 </td>
        </tr>
        <tr>
            <td class="confluenceTd">onchange </td>
            <td class="confluenceTd">simple </td>
            <td class="confluenceTd">String </td>
            <td class="confluenceTd">html javascript onchange 属性 </td>
        </tr>
    </tbody>
</table>
<br />
<img src ="http://www.blogjava.net/kiant/aggbug/277742.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kiant/" target="_blank">黄小二</a> 2009-05-24 23:02 <a href="http://www.blogjava.net/kiant/articles/277742.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts2 读书笔记（一） 前言、安装、配置</title><link>http://www.blogjava.net/kiant/articles/270126.html</link><dc:creator>黄小二</dc:creator><author>黄小二</author><pubDate>Mon, 11 May 2009 15:11:00 GMT</pubDate><guid>http://www.blogjava.net/kiant/articles/270126.html</guid><wfw:comment>http://www.blogjava.net/kiant/comments/270126.html</wfw:comment><comments>http://www.blogjava.net/kiant/articles/270126.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kiant/comments/commentRss/270126.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kiant/services/trackbacks/270126.html</trackback:ping><description><![CDATA[<br />
内容多来自书本、网络和教程，在此特别感谢：<br />
Struts2权威指南--基于WebWork核心的MVC开发&nbsp; 作者：李刚<br />
浪曦_Struts2应用开发系列&nbsp;讲师：风中叶<br />
<a href="http://www.blogjava.net/max/category/16130.html" target="_blank">Max On Java 的 Struts 2.0 系列</a><br />
<br />
<strong>一、前言</strong><br />
Struts2 是 WebWork 的升级。它同样适用拦截器作为处理（Advice），以用户的业务逻辑控制器为目标，创建一个控制器代理。<br />
<br />
Tomcat 文件服务器配置项目：
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #000000">&lt;</span><span style="color: #000000">Context&nbsp;path</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">/deviantART</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;docBase</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">D:\workstation\deviantART\WebRoot</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;reloadable</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">true</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">/&gt;<br />
&lt;/Host&gt;</span></div>
<em style="font-size: 10pt">conf/server.xml<br />
</em>path：URL虚拟路径<br />
docBase：对应的物理地址<br />
reloadable：是否自动更新，发布后建议为 false <br />
<br />
<fieldset><legend>Tips:</legend>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在 MyEclipse 等开发工具中，会将 src 源代码目录里的任何改动都自动编译到 \WebRoot\WEB-INF 目录下，简化了操作。</fieldset> <br />
<br />
<hr />
<strong>二、安装<br />
</strong><br />
Struts2 的几个核心 jar 文件：<br />
commons-logging-1.0.4.jar、<br />
freemarker-2.3.8.jar、<br />
ognl-2.6.11.jar、<br />
struts2-core-2.0.11.jar、<br />
xwork-2.0.4.jar <br />
<br />
<br />
<hr />
<strong>三、配置：<br />
<br />
</strong>编辑Web应用的web.xml配置文件，配置Struts 2的核心Filter。
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #0000ff">&lt;?</span><span style="color: #ff00ff">xml&nbsp;version="1.0"&nbsp;encoding="GBK"</span><span style="color: #0000ff">?&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">web-app&nbsp;</span><span style="color: #ff0000">version</span><span style="color: #0000ff">="2.4"</span><span style="color: #ff0000">&nbsp;xmlns</span><span style="color: #0000ff">="http://java.sun.com/xml/ns/j2ee"</span><span style="color: #ff0000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;xmlns:xsi</span><span style="color: #0000ff">="http://www.w3.org/2001/XMLSchema-instance"<br />
</span><span style="color: #ff0000">&nbsp;&nbsp;&nbsp;&nbsp;xsi:schemaLocation</span><span style="color: #0000ff">="http://java.sun.com/xml/ns/j2ee&nbsp;http://java.sun.&nbsp;com/xml/ns/j2ee/web-app_2_4.xsd"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<br />
<img alt="" src="http://www.blogjava.net/Images/dot.gif" /><img alt="" src="http://www.blogjava.net/Images/dot.gif" /><img alt="" src="http://www.blogjava.net/Images/dot.gif" /><img alt="" src="http://www.blogjava.net/Images/dot.gif" /><br />
<br />
</span><span style="color: #008000">&lt;!--</span><span style="color: #008000">&nbsp;定义Struts&nbsp;2的FilterDispatcher的Filter&nbsp;</span><span style="color: #008000">--&gt;</span><span style="color: #000000">&nbsp;<br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">filter</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">&lt;!--</span><span style="color: #008000">&nbsp;定义核心Filter的名字&nbsp;</span><span style="color: #008000">--&gt;</span><span style="color: #000000">&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">filter-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">struts2</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">filter-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">&lt;!--</span><span style="color: #008000">&nbsp;定义核心Filter的实现类&nbsp;</span><span style="color: #008000">--&gt;</span><span style="color: #000000">&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">filter-class</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">org.apache.Struts2.dispatcher.FilterDispatcher</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">&nbsp;filter-class</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;<br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">filter</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<br />
</span><span style="color: #008000">&lt;!--</span><span style="color: #008000">&nbsp;FilterDispatcher用来初始化Struts&nbsp;2并且处理所有的Web请求&nbsp;</span><span style="color: #008000">--&gt;</span><span style="color: #000000">&nbsp;<br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">filter-mapping</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">filter-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">Struts2</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">filter-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">url-pattern</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">/*</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">url-pattern</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;<br />
</span><span style="color: #0000ff">&nbsp;&lt;/</span><span style="color: #800000">filter-mapping</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">web-app</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span></div>
<em>web.xml</em> <br />
<br />
配置Action
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #0000ff">&lt;?</span><span style="color: #ff00ff">xml&nbsp;version="1.0"&nbsp;encoding="GBK"</span><span style="color: #0000ff">?&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008000">&lt;!--</span><span style="color: #008000">&nbsp;指定Struts&nbsp;2配置文件的DTD信息&nbsp;</span><span style="color: #008000">--&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;!</span><span style="color: #ff00ff">DOCTYPE&nbsp;struts&nbsp;PUBLIC"-//Apache&nbsp;Software&nbsp;Foundation//DTD&nbsp;Struts&nbsp;Configuration&nbsp;2.0//EN""http://struts.apache.org/dtds/struts-2.0.dtd"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">struts</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span><span style="color: #800000">package&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="strutsqs"</span><span style="color: #ff0000">&nbsp;extends</span><span style="color: #0000ff">="struts-default"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span><span style="color: #800000">action&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="Login"</span><span style="color: #ff0000">&nbsp;class</span><span style="color: #0000ff">="lee.LoginAction"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">result&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="error"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">/error.jsp</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">result</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">result&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="success"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">/welcome.jsp</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">result</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #0000ff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/</span><span style="color: #800000">action</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;<br />
</span><span style="color: #0000ff">&nbsp;&nbsp;&nbsp;&nbsp;&lt;/</span><span style="color: #800000">package</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">struts</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span></div>
<em>struts.xml</em><br />
<br />
Struts 2还有一个配置 Struts 2全局属性的 Properties 文件：
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #000000">#指定Struts&nbsp;2处于开发状态<br />
struts.devMode&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">false</span><span style="color: #000000"><br />
#指定当Struts&nbsp;2配置文件改变后，Web框架是否重新加载Struts&nbsp;2配置文件<br />
struts.configuration.xml.reload</span><span style="color: #000000">=</span><span style="color: #0000ff">true</span><span style="color: #000000">&nbsp;</span></div>
<em>struts.properties</em><br />
<br />
<br />
ps. 更详细的请阅览<br />
<a href="http://www.blogjava.net/max/archive/2006/10/10/74353.html" target="_blank">&nbsp;Max On Java 的 Struts 2.0 系列：为Struts 2.0做好准备</a>&nbsp;<br />
&nbsp; 
<img src ="http://www.blogjava.net/kiant/aggbug/270126.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kiant/" target="_blank">黄小二</a> 2009-05-11 23:11 <a href="http://www.blogjava.net/kiant/articles/270126.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts MVC应用、连接池</title><link>http://www.blogjava.net/kiant/articles/267473.html</link><dc:creator>黄小二</dc:creator><author>黄小二</author><pubDate>Sat, 25 Apr 2009 03:03:00 GMT</pubDate><guid>http://www.blogjava.net/kiant/articles/267473.html</guid><wfw:comment>http://www.blogjava.net/kiant/comments/267473.html</wfw:comment><comments>http://www.blogjava.net/kiant/articles/267473.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kiant/comments/commentRss/267473.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kiant/services/trackbacks/267473.html</trackback:ping><description><![CDATA[<br />
<p>入门：<br />
<a href="http://www.qudong.com/soft/program/Sql%20Server/jichujiaocheng/20080318/1658.html" target="_blank">配置Struts数据库连接池</a><br />
<a href="http://java.csdn.net/page/573f0512-2b72-4ede-9488-677639bbda5c" target="_blank">对于Struts和Spring两种MVC框架的比较</a></p>
<p><br />
进阶：<br />
<a href="http://www.ibm.com/developerworks/cn/java/l-struts-mvc/" target="_blank">用Struts建立MVC应用的介绍 </a></p>
<p>&nbsp;</p>
<p><strong>图 1 struts uml图</strong></p>
<img height="483" alt="" src="http://www.ibm.com/developerworks/cn/java/l-struts-mvc/image001.jpg" width="760" border="0" /><br />
<br />
<br />
<strong>图2 Struts框架的组件结构图</strong><br />
<img alt="" src="http://www.ibm.com/developerworks/cn/java/l-struts-mvc/image003.jpg" border="0" />
<img src ="http://www.blogjava.net/kiant/aggbug/267473.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kiant/" target="_blank">黄小二</a> 2009-04-25 11:03 <a href="http://www.blogjava.net/kiant/articles/267473.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>hibernate中at org.hibernate.tuple.AbstractEntityTuplizer.createProxy(AbstractEntityTuplizer.java:372)异常的解决方法</title><link>http://www.blogjava.net/kiant/articles/266245.html</link><dc:creator>黄小二</dc:creator><author>黄小二</author><pubDate>Fri, 17 Apr 2009 16:17:00 GMT</pubDate><guid>http://www.blogjava.net/kiant/articles/266245.html</guid><wfw:comment>http://www.blogjava.net/kiant/comments/266245.html</wfw:comment><comments>http://www.blogjava.net/kiant/articles/266245.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kiant/comments/commentRss/266245.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kiant/services/trackbacks/266245.html</trackback:ping><description><![CDATA[<br />
1：主要说的是问题出在CGLib上面，修正一下就可以了，下载中也给出了patch，使用hibernate3.1把cglib从2.1.3更新到2.2.beta1。<br />
2：设置相关表的lazy="false"解决问题。<br />
<br />
总的来说是延迟加载，在写测试类的时候没问题，但是应用到 web 页面就会出错。或者升级下&nbsp;Hibernate 版本能修正这个错误。<br />
<br />
<br />
<hr />
相关：&nbsp;<a href="http://www.100jq.com/html/java/kaiyuankuangjia/20071218/1755.html" target="_blank">浅谈hibernate lazy fetch </a><br />
<br />
<p>1、fetch 的优先级高于 lazy，一般情况下（另外一般情况下除外，下篇会讲到）fetch的优先级高于 lazy，若出现了 fetch，则忽略 lazy。</p>
<p>2、在配置文件中多对一时，一定要明确声明 lazy=false 或 true，在多对一时，默认情况下，lazy 即不是 true 也不是 false。你若不明确指出，它执行的时候是按照 lazy=true 这种方式执行的，但是你若明确写上 lazy=true，指报出错误，一般情况下明确写上 lazy=false。</p>
<p>3、你的代码若像 Student student = (Student)session.get(Student.class, 1)，hibernate 会正确按照配置文件的策略来执行，有 fetch 则执行fetch，有 lazy 则执行 lazy；但你的代码若像 Query query = session.createQuery("from Student")，它会忽略配置文件中的 fetch，它不会执行&nbsp; fetch=join，lazy 会被正确执行，Student 的属性（这里假定是Team，它是对象）的配置文件中的 fetch 会被正确执行。</p>
<p>4、Query query = session.createQuery("from Student s left outer join s.team")，会忽略 Student 和 Team 类的配置文件的 fetch，但它们类中的 lazy 会被正确执行。<br />
</p>
<img src ="http://www.blogjava.net/kiant/aggbug/266245.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kiant/" target="_blank">黄小二</a> 2009-04-18 00:17 <a href="http://www.blogjava.net/kiant/articles/266245.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>'Hibernate 完全手册' 读书笔记（五） 事务和并发、缓存、高级特性、附录</title><link>http://www.blogjava.net/kiant/articles/265417.html</link><dc:creator>黄小二</dc:creator><author>黄小二</author><pubDate>Tue, 14 Apr 2009 01:56:00 GMT</pubDate><guid>http://www.blogjava.net/kiant/articles/265417.html</guid><wfw:comment>http://www.blogjava.net/kiant/comments/265417.html</wfw:comment><comments>http://www.blogjava.net/kiant/articles/265417.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kiant/comments/commentRss/265417.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kiant/services/trackbacks/265417.html</trackback:ping><description><![CDATA[<p><br />
<strong>1、事务</strong></p>
<p>1-1、类别</p>
<p>● 本地事务<br />
&nbsp; 如果事务只和一个资源管理器有关，则为本地事物。在本地事务中，事务管理器只是将事务的管理委托给底层的资源管理器。</p>
<p><br />
● 分布式事务<br />
&nbsp; 分布式事务和多个可能不同的资源管理器以一种协调的方式进行交互。</p>
<p><br />
1-2、Java 中事务处理</p>
<p>&nbsp; JDBC 事务：由底层数据库事务管理器控制，操作比较简单，但是不适合控制多个应用程序组件的事务，并且没有传播的上下问。</p>
<p>&nbsp; JTA 和 JTS：Java 事务 API 和 Java 事务服务，可以跨越多个组件和数据库使用事务。在应用程序使用 JTA 控制事务操作时，需要从 JNDI 上下文中获取 UserTranscation 和数据源。<br />
UserTranscation ut = (UserTranscation) ctx.lookup("UserTranscation");</p>
<p><br />
1-3、Hibernate 事务<br />
&nbsp; <br />
● 基于 JDBC </p>
<p>&nbsp; Transcation 事务对象必须从 Session 中获取，即事务必须和一个 Session 相关联。</p>
<p>采用 Hibernate 内置的 current session 和上下文管理。<br />
&lt;property name="current_session_context_class"&gt;thread&lt;/property&gt;<br />
...<br />
sessionFactory.getCurrentSession().beginTranscation();</p>
<p><br />
● 基于 JTA</p>
<p>&nbsp; 提供了跨 Session 的事务管理能力。<br />
使用 SessionFactory.getCurrentSession() 方法简化事务上下文的传播，即在事务绑定 Session。</p>
<p><br />
&nbsp; 虽然一个 Session 范围内可以存在多个事务操作，但是 Hibernate 并不支持嵌套的事务模型。<br />
tx1<br />
tx2<br />
...<br />
tx2.commit();</p>
<p>//数据库操作，操作无效<br />
tx1.commit();</p>
<p>&nbsp;</p>
<p>
<hr />
<strong>2、并发控制</strong>
<p>&nbsp;</p>
<p>&nbsp; 如果事务都是串行执行，则许多资源将处于空闲状态。为了充分利用资源，发挥数据库共享资源的优势，必须允许多个事务并发地执行。</p>
<p>&nbsp; 在单处理机系统中，事务并发执行实际上是这些并行事务轮流交叉执行，即交叉并发方式，并不是真正的并行执行。在多处理机系统中，每个处理机运行一个事务，实现事务真正意义上的并存运行，即同时并发方式。</p>
<p>&nbsp; 当多个用户并发地存取数据库时，就会产生多个事务同时存取同一数据的情况。所以，必须实现一个控制系统，使一个事务所做的修改不会对其他事务所做的修改产生负面影响，这就是并发控制。</p>
<p>&nbsp; <br />
2-1、封锁</p>
<p>&nbsp; 对并发操作进行的正确调度，防止并发操作破坏了事务的隔离性。采用封锁技术，事务 T 可以向系统发出请求，对某个对象例如表、记录加锁，在事务 T 释放锁之前，其他事务不能更新这些数据对象。<br />
&nbsp;<br />
&nbsp; 基本的封锁有： <br />
排他锁（Exclusive Locks，X 锁）：写锁或者独占锁。<br />
共享锁（Share Locks，S 锁）：读锁。允许和其他事务一起读取数据对象D，但不能对D 做任何修改。</p>
<p><br />
2-2、事务隔离</p>
<p>&nbsp; 使用封锁技术，事务对申请的资源加锁，但是会影响数据库性能。根据数据对象封锁的程度，可以分成多种不同的事务隔离级别。</p>
<p>&nbsp; 数据并发执行时，产生不一致的现象：</p>
<p>丢失更新（Lost Update）<br />
&nbsp; 两个事务读入同一数据并修改，然后提交修改，T2 提交的结果破坏了 T1 提交的结果，导致 T1 的修改丢失。</p>
<p>② 不可重复读<br />
&nbsp; 事务T1 读取数据后，事务T2 执行了同一数据的跟新操作，使得事务 T1 无法再现前一次读取的结果。<br />
&nbsp;&nbsp;&nbsp; 事务1 读取某一数据后，事务2 对该数据作了修改，事务1 再次读取时，得到数据和前一次不一致。<br />
&nbsp;&nbsp;&nbsp; ① 事务1 读取某一些记录后，事务2 删除了同一数据源的部分数据，事务1 再次读取时，发现某些记录丢失。<br />
&nbsp;&nbsp;&nbsp; ① 事务1 读取某一些记录后，事务2 插入了同一数据源的新数据，事务1 再次读取时，发现某些记录增加。</p>
<p>③ 读&#8220;脏&#8221;数据<br />
&nbsp; 事务T1 修改某一数据，并将其写回物理数据库。事务T2 读取同一数据后，事务T1 由于某种原因被撤销，数据库将已经修改的数据恢复原值，导致事务T2 保持的数据和数据库中的数据产生了不一致。</p>
<p><br />
&nbsp; ANSI SQL-99 标准定义了下列隔离级别：</p>
<p>● 未提交读（Read Uncommitted）：隔离事务的最低级别，只能保证不会读取到物理上损坏的数据。H:1；允许产生：①②③</p>
<p>● 已提交读（Read Committed）：常见数据库引擎的默认级别，保证一个事务不会读取到另一个事务已修改但未提交的数据。H:2；允许产生：①②</p>
<p>● 可重复读（Repeatable Read）：保证一个事务不能更新已经由另一个事务读取但是未提交的数据。相当于应用中的已提交读和乐观并发控制。H:4；允许产生：①</p>
<p>● 可串行化（Serializable）：隔离事务的最高级别，事务之间完全隔离。系统开销最大。H:8；允许产生：</p>
<p><br />
&nbsp; 在数据库中，可以手工设置事务的隔离级别。<br />
&nbsp; Hibernate 在配置文件中声明事务的隔离级别，Hibenate 获取数据库连接后，将根据隔离级别自动设置数据库连接为指定的事务隔离级别。<br />
&lt;property name="connection.isolation"&gt;8&lt;/property&gt;</p>
<p><br />
2-3、并发控制类型</p>
<p>&nbsp; 根据使用的锁定策略和隔离等级，可以把事务的并发控制分为两种：</p>
<p>① 悲观并发控制<br />
&nbsp; <br />
&nbsp; 用户使用时锁定数据。主要应用于数据争用激烈的环境中，以及发生并发冲突时用锁保护数据的成本低于回滚事务成本的环境中。</p>
<p>&nbsp; Hibernate 的悲观锁定不在内存中锁定数据，由底层数据库负责完成。</p>
<p><br />
② 乐观并发控制<br />
&nbsp; <br />
&nbsp; 用户读取数据时不锁定数据。当一个用户更新数据时，系统将进行检查该用户读取数据后其他用户是否更改了该数据，是则产生一个错误，一般情况下，收到错误信息的用户将回滚事务并重新开始。主要用户数据争用不大，且偶尔回滚事务的成本低于读取数据时锁定数据的成本的环境中。</p>
<p>&nbsp; Hibernate 中使用元素 version 和 timestamp 实现乐观并发控制模式的版本控制，并提供多种编程方式。版本是数据库表中的一个字段，可以是一个递增的整数，也可以是一个时间戳，它们对应 Java 持久化类的一个属性。事务提交成功后，Hibernate 自动修改版本号。如果另外一个事务同时访问同一数据，若发现提交前的版本号和事前载入的版本号有出入，则认为发生了冲突，事务停止执行，撤销操作，并抛出异常。应用程序必须捕捉该异常并做出一定的处理。</p>
<p>⒈应用程序级别的版本控制<br />
⒉长生命周期会话的自动化版本控制<br />
⒊托管对象的自动化版本控制<br />
⒋定制自动化版本控制</p>
<p>&nbsp;</p>
<p>
<hr />
<strong>3、Hibernate 缓存</strong>
<p>&nbsp;</p>
<p>&nbsp; Hibernate 提供两级缓存架构，第一级缓存是 Session 内的缓存，第二级缓存是一个可插拔的缓存，能够借助第三方的组件实现。如果应用程序中经常使用同样的条件查询数据，还可以使用查询缓存来提高查询效率。</p>
<p>&nbsp; 针对缓存的范围，可以将 Hibernate 持久层缓存分为三个层次：</p>
<p>① 事务级缓存<br />
&nbsp; <br />
&nbsp; 缓存只能被当前事务访问。缓存的生命周期以来与事务的生命周期。事务缓存由 Session 实现。一个 Session 的缓存的内容只有在本 Session 实例范围内可用。</p>
<p>② 应用级缓存</p>
<p>&nbsp; 缓存在某个应用范围内被所有事务共享。缓存的生命周期依赖于应用程序的生命周期。应用级缓存由 SessionFactory 实现，Session 实例由其创建，并共享其缓存。</p>
<p>③ 分布式缓存</p>
<p>&nbsp; 集群环境中，缓存被一个 JVM 或多个 JVM 的进程共享。分布式缓存由多个应用级的缓存实例组成，缓存中的数据被复制到集群环境中的每个 JVM 节点，JVM 间通过远程通信来保证缓存中数据的一致性。</p>
<p><br />
3-1、缓存查询结果</p>
<p>&nbsp; 经常使用同样的条件查询数据，则可使用查询缓存。查询缓存需要和二级缓存联合使用，在二级缓存中，可以专门为查询缓存开辟一个命名缓存区域。查询缓存启动后将创建两个缓存区域，org.hibernate.cache.StandardQueryCache 实现保存查询结果集；org.hibernate.cache.UpdateTimestampsCache 实现保存最近更新的查询表的时间戳。</p>
<p>&lt;property name="cache.use_query_cache"&gt;true&lt;/propery&gt;</p>
<p>//使用查询缓存<br />
query.setCacheable(true);</p>
<p>//给查询缓存指定特定的命名缓存区域<br />
query.setCacheRegion("queryCache");</p>
<p>//如果其他进程更新了结果集，强行刷新缓冲区域<br />
query.setCacheMode(CacheMode.REFRESH);</p>
<p>//刷新某个或全部的缓存<br />
SessionFactory.evictQueries() 方法</p>
<p>&nbsp;</p>
<p>
<hr />
<strong>4、高级特性</strong>
<p>&nbsp;</p>
<p>4-1、数据库连接池 ConnectionProvider</p>
<p>&nbsp; J2SE 环境中使用建议。</p>
<p><br />
4-2、使用数据源 <br />
&nbsp; Hibernate 中，DatasourceConnectionProvider 实现了 ConnectionProvider 接口并封装了数据源的获取方法，充当了 Hibernate 和数据源间的适配器。</p>
<p>&nbsp; J2EE 环境中使用建议。</p>
<p><br />
4-3、过滤数据<br />
&nbsp; <br />
&nbsp; 把公共的数据过滤条件提取出来。从 Hibernate 3.0 开始，可以利用 Hibernate Filter 对某个类或集合附加预先定义的过滤条件，在查询时过滤指定条件的数据。该过滤器是全局有效的，使用时候，还可以指定特定参数。</p>
<p><br />
4-4、批量处理<br />
&nbsp; <br />
&nbsp; 批量处理引发异常的根源在于缓存中保存了过多的持久化实例而耗尽内存。</p>
<p>① 应用程序级别的批处理</p>
<p>&nbsp; 指定 Hibernate 处理 SQL 语句时，必须积累到指定数量后再向数据库提交操作。<br />
&nbsp; &lt;property name="jdbc.batch_size"&gt;20&lt;/property&gt;</p>
<p><br />
② 无状态 Session（StatelessSession）</p>
<p>&nbsp; StatelessSession 接口没有持久化上下文，也不负责持久化实例的生命周期，没有一级缓存，操作也不会影响到二级和查询缓存。</p>
<p><br />
③ 使用 DML 风格的 HQL 语句绕过内存直接进行数据处理</p>
<p>&nbsp; "delete Product p where p.id &gt; :id"</p>
<p><br />
4-4、延迟加载</p>
<p>&nbsp; 设置延迟加载的属性和集合只能在该实例依附的 Session 范围内被访问，会话关闭后，实例从持久态转为托管态，再次访问该实例的一些属性时候，有可能会抛出 LazyInitializationException 异常。</p>
<p>① 属性延迟加载（大对象）<br />
② 持久化类延迟加载<br />
③ 集合延迟加载</p>
<p><br />
4-5、数据抓取策略（Fetching strategies）</p>
<p>&nbsp; 可以在 Hibernate 中设定相应的数据抓取策略，减少系统产生的数据库查询操作，优化系统性能。</p>
<p>&nbsp; 在 Hibernate 中，延迟（lazy）定义了一种契约，用来表示托管状态实例中那些数据是有效的，而抓取（fetch）是用来调整 Hibernate 性能的。</p>
<p><br />
4-5、监控性能<br />
&nbsp; org.hibernate.stat 包提供的工具类。</p>
<p><br />
<hr />
<strong>5、附录</strong>
<p>&nbsp;5-1、XML 元数据<br />
</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;<a href="http://doc.javanb.com/hibernate-reference-3-2-0-zh/ch18s02.html" target="_blank">18.2. XML映射元数据 - Hibernate reference 3.2.0 ga 正式版中文参考手册<br />
</a>&nbsp;&nbsp;&nbsp;&nbsp;<a href="http://doc.javanb.com/hibernate-reference-3-2-0-zh/ch18s03.html" target="_blank">18.3. 操作XML数据 （通过dom4j会话读入和更新应用程序中的XML文档）</a><br />
<br />
5-2、开源工具箱</p>
<p>CownewStudio 是一个基于 Eclipse 的 Hibernate 正向建模辅助工具。通过它用户能以图形化的方式建立对象模型，然后根据模型生成持久化类、映射文件和数据库表。</p>
<p>JDBMonitor。模拟一个 JDBC 驱动来代替真正的 JDBC 驱动，截取应用程序对数据库的操作，并以合适的方式记录下来，提供性能分析的来源和依据。</p>
<p>&nbsp;</p>
<br />
 <img src ="http://www.blogjava.net/kiant/aggbug/265417.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kiant/" target="_blank">黄小二</a> 2009-04-14 09:56 <a href="http://www.blogjava.net/kiant/articles/265417.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>'Hibernate 完全手册' 读书笔记（四） 查询语言</title><link>http://www.blogjava.net/kiant/articles/265072.html</link><dc:creator>黄小二</dc:creator><author>黄小二</author><pubDate>Sat, 11 Apr 2009 18:11:00 GMT</pubDate><guid>http://www.blogjava.net/kiant/articles/265072.html</guid><wfw:comment>http://www.blogjava.net/kiant/comments/265072.html</wfw:comment><comments>http://www.blogjava.net/kiant/articles/265072.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kiant/comments/commentRss/265072.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kiant/services/trackbacks/265072.html</trackback:ping><description><![CDATA[<p><br />
<strong>1、查询返回</strong></p>
<p>● 查询语句可以返回多个对象或属性，存放在 Object[] 队列中。</p>
<p>● 将查询结果的所有属性都存放在一个 List 对象中：<br />
&nbsp; select new list(xxx.xxxx,xx.xx) .....<br />
这里的 new list 是实例化 java.util.ArraryList 对象。</p>
<p>● 将查询结果封装成一个安全的 Java 对象<br />
&nbsp; select new EncCustomer(xx.xxx, xx.xx)....</p>
<p>● 将查询结果封装成 Map 对象（利用别名）<br />
&nbsp; select new map(xx.xxx as aaaa, xx.xxxx as bb) .....<br />
.....<br />
&nbsp; Map obj = (Map)list.get(i);<br />
&nbsp; obj.get("aaaa");&nbsp; <br />
&nbsp; obj.get("bb");</p>
<p><br />
● distinct 删除重复数据</p>
<p><br />
<strong>
<hr />
2、参数绑定机制</strong></p>
<p>● <br />
&nbsp; q.setParameter("name", name);<br />
&nbsp; Hibernate 能根据参数值的 Java 类型推断出对应的映射类型，对于日期类型，如 java.util.Date 类型，会对应多种映射类型，这时候需要显示指定。<br />
&nbsp; q.setParameter("date", Hibernate.DATE);</p>
<p>● <br />
&nbsp; q.setProperties(obj);<br />
&nbsp; 根据 obj 的属性名对应 HQL 语义中定义的命名参数进行查询。</p>
<p><br />
<strong>
<hr />
3、HQL 子查询<br />
</strong>&nbsp;&nbsp; 用于子查询的集合函数 size()、minIndex()、maxIndex()、minElement()、maxElement() 和 elements()。</p>
<p><br />
<strong>
<hr />
4、集合过滤</strong><br />
&nbsp; 对于某持久化对象的 items 属性内元素性能优化（过滤集合内数据、排序等）。</p>
<p>&nbsp; Session.createFilter(object, string);<br />
&nbsp; 返回是 Query 类型<br />
&nbsp; 参数 object 是持久化对象的集合。<br />
&nbsp; 参数 string 是 HQL 的过滤条件</p>
<p>//过滤 prod 的集合 items<br />
List items = session.createFilter(prod.getItems(),<br />
&nbsp;"this.unitCost&lt;100 order by this.ListPrice desc").List();<br />
//绑定过滤的结果 itmes 到属性<br />
prod.setItems(items);</p>
<p><br />
<strong>
<hr />
5、条件查询 QBC</strong></p>
<p>5-1、Restrictions 过滤结果集</p>
<p><br />
5-2、结果集排序<br />
&nbsp;.addOrder(Order.asc("name"))<br />
&nbsp;.addOrder(Order.desc("category"))<br />
&nbsp;.list();</p>
<p><br />
5-3、createCriteria() 关联查询<br />
&nbsp; List list = sess.createCriteria(Product.class)<br />
&nbsp;.add(Restrictions.like("name", "%o%"))<br />
&nbsp;.createCriteria("items")&nbsp;&nbsp;<br />
&nbsp;.add(Restrictions.ge("listPrice", new Float(100.0))<br />
&nbsp;.list();<br />
//返回一个新的 Criteria 实例，该实例引用 items 集合中的元素，并且为该集合元素增加了元素属性 listPrice 大于等于 100.0 的过滤条件。</p>
<p>或者使用别名<br />
&nbsp;.createAlias("items", "ite")<br />
&nbsp;.add(Restrictions.ge("ite.listPrice", new Float(100.0))</p>
<p><br />
5-4、设置加载策略<br />
&nbsp;.setFetchMode("items", FetchMode.EAGER) <br />
&nbsp;.list();</p>
<p>&nbsp; DEFAULT：默认<br />
&nbsp; EAGER/JOIN：强制立即加载<br />
&nbsp; LAZY/SELECT：强制延迟加载</p>
<p><br />
5-5、聚合和分组&nbsp; org.hibernate.criterion.Projections </p>
<p>&nbsp;.setProjection(Projections.rowCount())<br />
&nbsp;.uniqueResult()；</p>
<p>&nbsp;.add(Projections.groupProperty("imagePath"))<br />
&nbsp;.list();</p>
<p><br />
5-6、离线与子查询</p>
<p>&nbsp; 离线查询方式在 Session 范围之外定义一个离线查询，然后使用任意的 Session 执行查询。该方法主要通过 org.hibernate.criterion.DetachedCriteria 类实现。</p>
<p><br />
<strong>
<hr />
6、Native SQL 查询</strong></p>
<p>&nbsp;&nbsp; 应用程序中使用与数据库相关的 SQL 查询语句</p>
<p>6-1、Native SQL 应用程序接口</p>
<p>&nbsp; 主要使用 SQLQuery.addEntity() 实现返回结果为实体的查询，SQLQuery.addScalar() 则返回标量值。<br />
&nbsp; SQLQuery.addJoin(String alias, String path) 用于将映射对象所关联的实体或集合对应起来。</p>
<p>&nbsp; <br />
6-2、命名查询<br />
&nbsp; sess.getNamedQuery(string);</p>
<p>&nbsp; 在 xml 文件中使用 &lt;! [CDATA []] &gt; 元表示其中的内容是区分其他元素定义的纯文本。例如： &lt; 符号。</p>
<p><br />
6-3、使用存储过程<br />
&nbsp; Hibernate 3.0 以上的版本已经支持和利用存储过程来进行查询，存储过程返回的参数是标量与实体，这里可以利用返回类型的定义将存储过程返回的参数映射到对象的属性中。</p>
<p>&lt;sql-query name="productQuery" callable="true"&gt;<br />
&nbsp; &lt;return alias="prod" class="petstore.domain.Product"&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;return-property name="productId" column="PRODUCTID" /&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;return-property name="description" column="DESCRIPTION" /&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;return-property name="name" column="NAME" /&gt;<br />
&nbsp; &lt;/return&gt;<br />
&nbsp; {? = call getProduct(?)}<br />
&lt;/sql-query&gt;</p>
<p>List list = query.list();</p>
<p>&nbsp;</p>
 <img src ="http://www.blogjava.net/kiant/aggbug/265072.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kiant/" target="_blank">黄小二</a> 2009-04-12 02:11 <a href="http://www.blogjava.net/kiant/articles/265072.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>'Hibernate 完全手册' 读书笔记（三） 映射、操作对象</title><link>http://www.blogjava.net/kiant/articles/265049.html</link><dc:creator>黄小二</dc:creator><author>黄小二</author><pubDate>Sat, 11 Apr 2009 12:46:00 GMT</pubDate><guid>http://www.blogjava.net/kiant/articles/265049.html</guid><wfw:comment>http://www.blogjava.net/kiant/comments/265049.html</wfw:comment><comments>http://www.blogjava.net/kiant/articles/265049.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kiant/comments/commentRss/265049.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kiant/services/trackbacks/265049.html</trackback:ping><description><![CDATA[<p><br />
<strong>1、对象关系映射</strong></p>
<p>1-1、单向多对一关联</p>
<p>&nbsp;产品和分类的关系：多个不同产品属于同一种分类。<br />
private Category category；<br />
&lt;many-to-one name="category" column="categoryId" not-null="true" /&gt;</p>
<p><br />
1-2、一对多映射<br />
private Set products = new HashSet();<br />
&lt;set name="products"&nbsp;&nbsp;&lt;!--Category 中集合属性名称为 products--&gt;<br />
&nbsp; table="product"&nbsp;&nbsp;&lt;!--集合属性对应表的名称为 product--&gt;<br />
&nbsp; schema="test"&nbsp;&nbsp;&nbsp;&lt;!--表的 schema 名称为 test--&gt;<br />
&nbsp; lazy="true"&nbsp;&nbsp;&nbsp;&lt;!--此集合采用延时加载策略--&gt;<br />
&nbsp; inverse="true"&nbsp;&nbsp;&lt;!--由关联属性的另一方作为关联的主控方--&gt;<br />
&nbsp; cascade="delete"&nbsp;&nbsp;&lt;!--采用级联删除，当 Category 被删除时关联的此集合内容也将被删除--&gt;<br />
&nbsp; sort="natural"&nbsp;&nbsp;&lt;!--自然排序集合内容--&gt;<br />
&nbsp; order-by="productId asc"&nbsp;&lt;!--按 productId 字段升序排列集合内容--&gt;<br />
&nbsp; &gt;<br />
&nbsp; &lt;key column="category_fk" /&gt;<br />
&nbsp; <br />
&nbsp; &lt;one-to-many class="petstore.domain.Product" /&gt;<br />
&lt;/set&gt;<br />
</p>
<p><br />
1-3、继承映射<br />
</p>
<p><br />
<hr />
<strong>2、Hibernate 操作对象</strong><br />
<br />
2-1、对象的三种状态</p>
<p>● 瞬时态（Transient）--VO（Value Ojbect）<br />
&nbsp; 对象实例产生到被 JVM 垃圾回收为止并不受 Hibernate 框架管理。</p>
<p>● 持久态（Persistent）--PO（Persistent Ojbect）<br />
&nbsp; 对象实例被 Hibernate 框架管理，该对象可能是刚被保存的，或刚从数据库中被加载的。Hibernate 会检测处于持久态的对象任何改动，在当前操作单元执行完毕将对象与数据库同步，即将对象的属性保存到数据库映射对应的字段中。简单点说就是该实体对象与 session 发生关系，而且处于 session 的有效期内。<br />
&nbsp; <br />
● 托管态（Detached）--VO（Value Ojbect）<br />
&nbsp; 与持久对象关联的 Session 被关闭后，对象就变为托管的，可继续被修改。托管对象如果重新关联到某个新的 Session 上，会再次变为持久的，同时改动也将会被持久化到数据库。这个期间的转变过程可以看作是应用程序事务，即中间会给用户思考时间的长时间运行的操作单元。<br />
&nbsp; 处于托管态对象具有与数据库表记录间的联系（持久化标识，identifier）。</p>
<p><br />
<br />
2-2、对象操作的应用程序接口</p>
<p>● 修改对象</p>
<p>&nbsp; 对于已经持久化的对象，不需要调用某个特定的方法就可以实现修改持久化，因为 Hibernate 会自动调用 flush() 方法保证与数据库的同步。</p>
<p>&nbsp; 对于处于托管状态的实例，Hibernate 通过提供 Session.update() 或 Session.merge() 方法，重新关联托管实例。但是需要注意的是：如果具有持久化标识（identifier）的对象之前已经被另一个会话连接（secondSession）装载了，应用程序关联操作会发生异常。</p>
<p>&nbsp; 使用 merge() 方法时，用户不必考虑 session 的状态，可随时将修改保存到数据库中。例如：Session 中存在相同标识的持久化实例时，Hibernate 便会根据用户给出的对象状态覆盖原有的持久化实例的状态。</p>
<p>&nbsp; 另外，Hibernate 还提供了 saveOrUpdate()方法，它即可分配新持久化标识（identifier），保存瞬时（transient）对象，又可更新/重新关联托管的（identifier）实例。</p>
<p><br />
● 删除对象<br />
&nbsp; 通过 HQL 语句，调用重载的 delete()，可以一次删除多个对象。<br />
&nbsp; session.delete("from Customer as c where c.customerId &lt;3");</p>
<p><br />
● 查询对象<br />
&nbsp; 已知对象表示符值查询<br />
&nbsp; 对象标识符未知查询 HQL<br />
&nbsp; 根据某些特定条件查询 QBC，Query By Criteria<br />
&nbsp; 按详例查询 QBE，Query By Example<br />
&nbsp; 调用数据库查询 native SQL</p>
<p>&nbsp; 查询条件参数 ？ 查询条件参数索引，由 0 开始。<br />
&nbsp; 查询条件实名 ：name<br />
&nbsp; 外置命名查询</p>
<p>&nbsp;&nbsp;&nbsp; 在映射文件定义查询语句，将程序与查询语句分离：<br />
&nbsp;&nbsp;&nbsp; &lt;query name="CategoryById"<br />
&nbsp;&lt;! [CDATA[<br />
&nbsp;&nbsp;from Category c where c.categoryId&gt;? ]]&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/query&gt;</p>
<p>&nbsp;&nbsp;&nbsp; 程序调用：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Query q = sess.getNamedQuery("CategoryById");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; q.setLong(0, name);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; List cats = q.List();<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp; 用 Query 提供的 iterate() 方法遍历查询结果，如果查询的结果在 session 或二级缓存（second-level cache）中，那么使用 iterate() 方法可以得到更好的性能。</p>
<p>&nbsp; 如果 JDBC 驱动支持可滚动的 ResuleSet，Query 接口可以使用 ScrollableResults，允许你在查询结果中灵活移动（需要保持数据库连接和游标 cursor 处于抑制打开状态）。</p>
<p>ScrollableResults cates = q.scroll();<br />
cates.first()<br />
cates.scroll(5);</p>
<p><br />
● cascade 和 inverse 级联操作</p>
<p>inverse<br />
&nbsp; 只对 set，one-to-many（或 many-to-many）有效，对于 many-to-one，one-to-one 无效<br />
&nbsp; 对集合起整体作用</p>
<p>cascade<br />
&nbsp; 对关系标记都有效<br />
&nbsp; 对集合的一个元素起作用，如果集合为空，那么 cascade 不会引发关联操作<br />
&nbsp; <br />
&nbsp; 作用时机：在 flush 时（commit 会自动执行 flush），hibernate 会自行判断每个 set 是否有变化，对有变化的 set 执行相应的 SQL，if (inverse) return。即：cascade 在前，inverse 在后。</p>
<p>异常：<br />
org.hibernate.exception.ConstraintViolationException: could not insert</p>
<p>原因是 category_fk 字段约束不能为空，而在新建的 Product 对象时插入了空值，而且关联关系由 Caterogy 对象维持，而被关联的 Product 对象不知道自己与哪个 Category 对象关联。说到底就是 pro 对象的 categoryId 值为空。</p>
<p>&nbsp;</p>
  <img src ="http://www.blogjava.net/kiant/aggbug/265049.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kiant/" target="_blank">黄小二</a> 2009-04-11 20:46 <a href="http://www.blogjava.net/kiant/articles/265049.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>'Hibernate 完全手册' 读书笔记（二） 初识、体系、对象标识符、配置、映射类型</title><link>http://www.blogjava.net/kiant/articles/264993.html</link><dc:creator>黄小二</dc:creator><author>黄小二</author><pubDate>Sat, 11 Apr 2009 02:45:00 GMT</pubDate><guid>http://www.blogjava.net/kiant/articles/264993.html</guid><wfw:comment>http://www.blogjava.net/kiant/comments/264993.html</wfw:comment><comments>http://www.blogjava.net/kiant/articles/264993.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kiant/comments/commentRss/264993.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kiant/services/trackbacks/264993.html</trackback:ping><description><![CDATA[<p><strong>1、使用 Hibernate 操作数据库</strong></p>
<p>1-1、使用 ThreadLocal 控制 Session</p>
<p>&nbsp;&nbsp;&nbsp; 应用程序根据配置文件构建应用程序运行的环境，建立全局范围内的 SessionFactory 对象。其内部包含了 Hibernate 运行的全部细节，是产生 Session 的工厂，它是线程安全的，只能在系统启动时实例化一次，系统运行期间不可修改。</p>
<p>&nbsp;&nbsp;&nbsp; Session 对象是 Hibernate 操作数据的核心，数据库的操作、对象生命周期的管理、应用事务的划分，都需要在 Session 对象中完成。Session&nbsp; 对象不是线程安全的，如果试图让多个线程同时使用一个 Session 对象，将会产生数据混乱，造成数据库的数据不一致。而且频繁开关 Session 是巨大的系统消耗。</p>
<p>&nbsp;&nbsp;&nbsp; 为了安全地使用 Session 对象，需要应用 Java 语言中的线程绑定机制--ThreadLocal，它代表一个线程的私有存取空间，能够隔离多线程环境中的并发机制，减少 Session 对象的创建和销毁次数，降低系统资源浪费。<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img id="Code_Closed_Image_104728" onclick="this.style.display='none'; Code_Closed_Text_104728.style.display='none'; Code_Open_Image_104728.style.display='inline'; Code_Open_Text_104728.style.display='inline';" height="16" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" width="11" align="top" /><img id="Code_Open_Image_104728" style="display: none" onclick="this.style.display='none'; Code_Open_Text_104728.style.display='none'; Code_Closed_Image_104728.style.display='inline'; Code_Closed_Text_104728.style.display='inline';" height="16" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" width="11" align="top" /><span id="Code_Closed_Text_104728" style="border-right: #808080 1px solid; border-top: #808080 1px solid; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">HibernateSessionFactory</span><span id="Code_Open_Text_104728" style="display: none"><br />
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080">&nbsp;1</span><img id="Codehighlighter1_37_757_Open_Image" onclick="this.style.display='none'; Codehighlighter1_37_757_Open_Text.style.display='none'; Codehighlighter1_37_757_Closed_Image.style.display='inline'; Codehighlighter1_37_757_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_37_757_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_37_757_Closed_Text.style.display='none'; Codehighlighter1_37_757_Open_Image.style.display='inline'; Codehighlighter1_37_757_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;HibernateSessionFactory&nbsp;</span><span id="Codehighlighter1_37_757_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_37_757_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">&nbsp;2</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><img alt="" src="http://www.blogjava.net/Images/dot.gif" /><br />
</span><span style="color: #008080">&nbsp;3</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">final</span><span style="color: #000000">&nbsp;ThreadLocal</span><span style="color: #000000">&lt;</span><span style="color: #000000">Session</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;threadLocal&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;ThreadLocal</span><span style="color: #000000">&lt;</span><span style="color: #000000">Session</span><span style="color: #000000">&gt;</span><span style="color: #000000">();<br />
</span><span style="color: #008080">&nbsp;4</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><img alt="" src="http://www.blogjava.net/Images/dot.gif" /><br />
</span><span style="color: #008080">&nbsp;5</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br />
</span><span style="color: #008080">&nbsp;6</span><span style="color: #000000"><img id="Codehighlighter1_198_513_Open_Image" onclick="this.style.display='none'; Codehighlighter1_198_513_Open_Text.style.display='none'; Codehighlighter1_198_513_Closed_Image.style.display='inline'; Codehighlighter1_198_513_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_198_513_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_198_513_Closed_Text.style.display='none'; Codehighlighter1_198_513_Open_Image.style.display='inline'; Codehighlighter1_198_513_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;Session&nbsp;getSession()&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;HibernateException&nbsp;</span><span id="Codehighlighter1_198_513_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_198_513_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">&nbsp;7</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Session&nbsp;session&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(Session)&nbsp;threadLocal.get();<br />
</span><span style="color: #008080">&nbsp;8</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br />
</span><span style="color: #008080">&nbsp;9</span><span style="color: #000000"><img id="Codehighlighter1_300_482_Open_Image" onclick="this.style.display='none'; Codehighlighter1_300_482_Open_Text.style.display='none'; Codehighlighter1_300_482_Closed_Image.style.display='inline'; Codehighlighter1_300_482_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_300_482_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_300_482_Closed_Text.style.display='none'; Codehighlighter1_300_482_Open_Image.style.display='inline'; Codehighlighter1_300_482_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(session&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">||</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">!</span><span style="color: #000000">session.isOpen())&nbsp;</span><span id="Codehighlighter1_300_482_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_300_482_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">10</span><span style="color: #000000"><img id="Codehighlighter1_333_367_Open_Image" onclick="this.style.display='none'; Codehighlighter1_333_367_Open_Text.style.display='none'; Codehighlighter1_333_367_Closed_Image.style.display='inline'; Codehighlighter1_333_367_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_333_367_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_333_367_Closed_Text.style.display='none'; Codehighlighter1_333_367_Open_Image.style.display='inline'; Codehighlighter1_333_367_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(sessionFactory&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">)&nbsp;</span><span id="Codehighlighter1_333_367_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_333_367_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">11</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rebuildSessionFactory();<br />
</span><span style="color: #008080">12</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">13</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;session&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(sessionFactory&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">)&nbsp;</span><span style="color: #000000">?</span><span style="color: #000000">&nbsp;sessionFactory.openSession()<br />
</span><span style="color: #008080">14</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">;<br />
</span><span style="color: #008080">15</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;threadLocal.set(session);<br />
</span><span style="color: #008080">16</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">17</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br />
</span><span style="color: #008080">18</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;session;<br />
</span><span style="color: #008080">19</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">20</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br />
</span><span style="color: #008080">21</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><img alt="" src="http://www.blogjava.net/Images/dot.gif" />.<br />
</span><span style="color: #008080">22</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br />
</span><span style="color: #008080">23</span><span style="color: #000000"><img id="Codehighlighter1_586_749_Open_Image" onclick="this.style.display='none'; Codehighlighter1_586_749_Open_Text.style.display='none'; Codehighlighter1_586_749_Closed_Image.style.display='inline'; Codehighlighter1_586_749_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_586_749_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_586_749_Closed_Text.style.display='none'; Codehighlighter1_586_749_Open_Image.style.display='inline'; Codehighlighter1_586_749_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;closeSession()&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;HibernateException&nbsp;</span><span id="Codehighlighter1_586_749_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_586_749_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">24</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Session&nbsp;session&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(Session)&nbsp;threadLocal.get();<br />
</span><span style="color: #008080">25</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;threadLocal.set(</span><span style="color: #0000ff">null</span><span style="color: #000000">);<br />
</span><span style="color: #008080">26</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br />
</span><span style="color: #008080">27</span><span style="color: #000000"><img id="Codehighlighter1_704_743_Open_Image" onclick="this.style.display='none'; Codehighlighter1_704_743_Open_Text.style.display='none'; Codehighlighter1_704_743_Closed_Image.style.display='inline'; Codehighlighter1_704_743_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_704_743_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_704_743_Closed_Text.style.display='none'; Codehighlighter1_704_743_Open_Image.style.display='inline'; Codehighlighter1_704_743_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(session&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">)&nbsp;</span><span id="Codehighlighter1_704_743_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_704_743_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">28</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;session.close();<br />
</span><span style="color: #008080">29</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">30</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">31</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br />
</span><span style="color: #008080">32</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><img alt="" src="http://www.blogjava.net/Images/dot.gif" /><br />
</span><span style="color: #008080">33</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br />
</span><span style="color: #008080">34</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span></span></div>
<br />
<br />
1-2、建立数据库结构 </p>
<p>&nbsp;&nbsp;&nbsp; 使用 Hibernate 时，设计生成数据库表结构的方式分成两种。</p>
<p>1、手工用 SQL 语句设计数据表结构</p>
<p>2、使用 Hibernate 根据映射文件自动构建数据库模式<br />
&nbsp;&nbsp;&nbsp; hibernate.cfg.xml:<br />
&nbsp;&lt;property name="hbm2dll.auto"&gt;creat&lt;/property&gt;<br />
&nbsp;&lt;property name="show_sql"&gt;true&lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp; log4j.properties<br />
&nbsp;log4j.logger.org.hibernate.tool.hbm2dll=debug</p>
<p>Hibernate 自行管理的数据库表结构：<br />
● none：不产生任何动作。<br />
● create：在应用启动时，自动生成数据库表结构并导入到数据库中。<br />
● create-drop：同 create，但在应用关闭时，删除已生成的数据库表结构；此方式常在测试时使用。<br />
● update：在应用启动时，检查持久化类和映射文件的改变，更新数据库表结构，比如：持久化类添加一个属性后，Hibernate 能自动添加对应字段到对应的数据库表中。<br />
</p>
<br />
<br />
3、使用 Session 操作数据库<br />
&nbsp; Hibernate 能自动管理系统中的持久化类和数据库模式，通过 Session 对象实现对象模型和关系模型的相互操作。<br />
Session 提供数据访问的接口：<br />
● get()：从数据库获取数据对象，不存在时则返回 null。<br />
● load()：从数据库获取数据对象，不存在时则抛出异常。<br />
● createQuery()：根据条件查询数据对象。<br />
● save()、update()、delete() 等方法。
<p>&nbsp;</p>
<p><br />
<hr />
<br />
<strong>2、Hibernate 基本组件接口</strong> <br />
<br />
<p>● Configuration（org.hibernate.cfg.Configuration）<br />
&nbsp; Hibernate 应用的入口，它使用配置文件初始化运行环境，是 SessionFactory 的工厂。通常情况下，一个应用程序中只允许创建一个单例的 Configuration 实例。</p>
<p>● SessionFactory（org.hibernate.SessionFactory）<br />
&nbsp; 是一个线程安全的高速缓存，其中包含了单一数据库和已编译映射文件的元数据，在运行环境不可改变。它是 Session 的工厂，并能从 ConnectionProvider 中获取 JDBC 连接。它可能持有一个可选的能在进程级别或者集群级别事务间重用的数据缓存（二级缓存）。SessionFactory 从 Configuration 中获取，在一个应用范围中，不允许改变。</p>
<p>● Session（org.hibernate.Session）<br />
&nbsp; 单线程的短生命周期的对象，是应用程序和持久化存储的一次对话。封装了一个 JDBC 连接，也是 Transaction 的工厂。它保持一个持久化对象的强制缓存（一级缓存），用来遍历对象图或者根据标识符查询对象。Session 提供了一系列方法，可以方便地实现对象持久化操作。</p>
<p>● Transcation（org.hibernate.Transcation）<br />
&nbsp; 可选，单线程、短生命周期的对象，应用程序用它来表示一批任务的原子操作。是底层 JDBC，JTA 或者 CORBA 事务的抽象。一个 Session 在某些情况下可能跨越多个 Transcation 事务。</p>
<p>● ConnectionProvider（org.hibernate.connection.ConnectionProvider）<br />
&nbsp; 可选，JDBC 连接的工厂和连接池，是底层 Datasource 或 DriverManager 的抽象应用，对应用程序不可见。可扩展实现。</p>
<p>● TranscationFactory（org.hibernate.TranscationFactory）<br />
&nbsp; 可选，事务实例工厂。对应用程序不可见。可扩展实现。</p>
<p><br />
&nbsp; 在最小集合应用框架中，应用程序直接使用 JDBC/JTA，并自行完成事务处理。<br />
&nbsp;conn = DriverManager.getConnection(xxx);<br />
&nbsp;conn.setAutoCommit(false);<br />
&nbsp;...<br />
&nbsp;conn.commit();</p>
<p><br />
<hr />
<br />
<strong>3、Hibernate 生命周期</strong><br />
<br />
① Configuration 对象根据配置文件的设置，读取属性配置信息。<br />
② Configuration 对象根据配置信息，按照映射文件、类缓存、集合缓存、监听器、事件的顺序依次读取并解析。<br />
③ 通过调用 Configuration 对象构建 SessionFactory。<br />
④ 调用 SessionFactory 实例获得 Session 对象。<br />
⑤ 启动事务。<br />
⑥ 提交事务。<br />
⑦ 关闭应用（Session 和 SessionFactory）。 <br />
<br />
<hr />
<br />
<strong>4、Hibernate 中对象的状态</strong> <br />
<br />
&nbsp; 为了区分持久化类的实例对象，根据对象和会话的关联状态，可以分为三种情况：
<p>&nbsp;</p>
<p>● 暂态状态。对象刚建立，还没有使用 Hibernate 进行保存。该对象在数据库中没有记录，也不在 session 缓存中。如果该对象是自动生成主键，则该对象的对象标识符为空。</p>
<p>● 持久化对象。对象已经通过 Hibernate 进行了持久化，数据库中已经存在对应的记录。如果该对象是自动生成主键，则该对象的对象标识符已被赋值。</p>
<p>● 托管对象。该对象是经过 Hibernate 保存过或者从数据库中取出的，但是与之关联的 session 已经被关闭。虽然它拥有对象标识符，且数据库中存在对应的记录，但是已经不再被 Hibernate 管理。<br />
</p>
<p><br />
ps.&nbsp;<a href="http://www.blogjava.net/vip01/archive/2007/01/08/92430.html" target="_blank">[转] PO BO VO DTO POJO DAO概念及其作用（附转换图）</a> <br />
</p>
<p><br />
<hr />
<br />
<strong>5、对象标识符</strong><br />
&nbsp; <br />
&nbsp; 关系数据库表的主键在 Java 应用环境中的体现。 <br />
<br />
<p>5-1、关系型数据库的主键生成机制<br />
&nbsp; 序列生成主键，整数<br />
&nbsp; 自动增长组件，整数<br />
&nbsp; 全局统一标识符 GUID（Globally Unique Identifier），字符串主键</p>
<p>&nbsp; <br />
5-2、Java 环境中的对象识别机制<br />
&nbsp; 引用比较，比地址 &#8220;==&#8221;<br />
&nbsp; 内容比较，比数据 equals() 方法</p>
<p><br />
5-3、Hibernate 对象识别符的作用<br />
&nbsp; 在生成 Java 对象时，给标识属性分配一个唯一的值，用于区分同一个类的多个不同的实例。体现在 Hibernate 中就是对象标识符。</p>
<p><br />
5-4、Hibernate 内置标识符生成器的使用方法<br />
&nbsp; org.hibernate.id.IdentifierGenerator 接口。</p>
<p>ps.&nbsp; <a href="http://aumy2008.blogbus.com/logs/13417260.html" target="_blank">映射对象标识符</a><br />
</p>
<p>5-5、使用复合主键时组合标识符的使用方法（常用于遗留的系统中）<br />
&nbsp; 嵌入式组合标识符/映射式组合标识符，映射多个主键字段和持久化类的多个属性。</p>
<p><br />
<hr />
<br />
<strong>6、配置 Hibernate</strong> <br />
<br />
6-1、配置方式<br />
&nbsp; 可编程还是文件配置方式 <br />
<br />
<p>Hibernate JDBC 配置属性<br />
&nbsp; hibernate.jdbc.fatch_size：指定 JDBC 抓取数据的数量大小，非零值<br />
&nbsp; hibernate.jdbc.batach_size：允许 Hibernate 使用 JDBC2 的批量更新，非零值，建议 5 到 30<br />
&nbsp; hibernate.jdbc.provider_class：自定义的 ConnectionProvider 类名，用于向 Hibernate 提供 JDBC 连接<br />
&nbsp; hibernate.jdbc.autocommit：确认是否开启 JDBC 自动提交功能，默认为 false 不自动提交</p>
<p><br />
6-2、方言<br />
&nbsp; 屏蔽底层数据库系统的方言机制，方便与数据库间迁移。<br />
&nbsp; MySQL：org.hibernate.dialect.MySQLDialect<br />
&nbsp; MySQL with InnoDB：org.hibernate.dialect.MySQLInnoDBDialect<br />
&nbsp; MySQL with MyISAM：org.hibernate.dialect.MySQLMyISAMDialect</p>
<p><br />
6-3、Hibernate 日志系统<br />
&nbsp; 使用 Log4J 作为&nbsp; Hibernate 的日志系统，需要将 Log4J 的库文件 log4j.jar 放置到类路径下（其发布包以包含 Log4J 的库文件）。然后编写日志配置文件 log4j.properties 并放到 classpath 路径中。</p>
<p>&nbsp; Log4J 中，几个日志输出级别的顺序是：只输出高于或等于 设定级别 的记录。<br />
trace &lt; debug &lt; info &lt; warn &lt; error &lt; fatal</p>
<p>&nbsp; 在开发模式中，可以选择 DEBUG 级别的输出；应用部署后，可以配置为 ERROR。&nbsp; <br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img id="Code_Closed_Image_104409" onclick="this.style.display='none'; Code_Closed_Text_104409.style.display='none'; Code_Open_Image_104409.style.display='inline'; Code_Open_Text_104409.style.display='inline';" height="16" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" width="11" align="top" /><img id="Code_Open_Image_104409" style="display: none" onclick="this.style.display='none'; Code_Open_Text_104409.style.display='none'; Code_Closed_Image_104409.style.display='inline'; Code_Closed_Text_104409.style.display='inline';" height="16" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" width="11" align="top" /><span id="Code_Closed_Text_104409" style="border-right: #808080 1px solid; border-top: #808080 1px solid; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">log4j.properties</span><span id="Code_Open_Text_104409" style="display: none"><br />
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080">&nbsp;1</span><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">#设置日志根级别和输出路径<br />
</span><span style="color: #008080">&nbsp;2</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />log4j.rootLogger</span><span style="color: #000000">=</span><span style="color: #000000">INFO,CONSOLE,FILE<br />
</span><span style="color: #008080">&nbsp;3</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
</span><span style="color: #008080">&nbsp;4</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />#日志输出路径——控制台<br />
</span><span style="color: #008080">&nbsp;5</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />log4j.appender.CONSOLE</span><span style="color: #000000">=</span><span style="color: #000000">org.apache.log4j.ConsoleAppender<br />
</span><span style="color: #008080">&nbsp;6</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />log4j.appender.stdout.Target</span><span style="color: #000000">=</span><span style="color: #000000">System.out<br />
</span><span style="color: #008080">&nbsp;7</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />log4j.appender.CONSOLE.layout</span><span style="color: #000000">=</span><span style="color: #000000">org.apache.log4j.PatternLayout<br />
</span><span style="color: #008080">&nbsp;8</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />log4j.appender.CONSOLE.layout.ConversionPattern</span><span style="color: #000000">=%</span><span style="color: #000000">d</span><span style="color: #000000">|</span><span style="color: #000000">ABSOLUTE&nbsp;</span><span style="color: #000000">%</span><span style="color: #000000">5p&nbsp;</span><span style="color: #000000">%</span><span style="color: #000000">c</span><span style="color: #000000">|</span><span style="color: #000000">1</span><span style="color: #000000">|</span><span style="color: #000000">:</span><span style="color: #000000">%</span><span style="color: #000000">L&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">%</span><span style="color: #000000">m</span><span style="color: #000000">%</span><span style="color: #000000">n<br />
</span><span style="color: #008080">&nbsp;9</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
</span><span style="color: #008080">10</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />#日志输出路径——文件<br />
</span><span style="color: #008080">11</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />log4j.appender.FILE</span><span style="color: #000000">=</span><span style="color: #000000">org.apache.log4j.FileAppender<br />
</span><span style="color: #008080">12</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />log4j.appender.FILE.File</span><span style="color: #000000">=</span><span style="color: #000000">hibernate.log<br />
</span><span style="color: #008080">13</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />log4j.appender.FILE.layout</span><span style="color: #000000">=</span><span style="color: #000000">org.apache.log4j.PatternLayout<br />
</span><span style="color: #008080">14</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />log4j.appender.FILE.layout.ConversionPattern</span><span style="color: #000000">=%</span><span style="color: #000000">d</span><span style="color: #000000">|</span><span style="color: #000000">ABSOLUTE&nbsp;</span><span style="color: #000000">%</span><span style="color: #000000">5p&nbsp;</span><span style="color: #000000">%</span><span style="color: #000000">c</span><span style="color: #000000">|</span><span style="color: #000000">1</span><span style="color: #000000">|</span><span style="color: #000000">:</span><span style="color: #000000">%</span><span style="color: #000000">L&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">%</span><span style="color: #000000">m</span><span style="color: #000000">%</span><span style="color: #000000">n<br />
</span><span style="color: #008080">15</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
</span><span style="color: #008080">16</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />#日志输出级别<br />
</span><span style="color: #008080">17</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />log4j.logger.org.hibernate</span><span style="color: #000000">=</span><span style="color: #000000">INFO<br />
</span><span style="color: #008080">18</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
</span><span style="color: #008080">19</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />#日志输出类别<br />
</span><span style="color: #008080">20</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />log4j.logger.org.hibernate.hql.ast.AST</span><span style="color: #000000">=</span><span style="color: #000000">WARN<br />
</span><span style="color: #008080">21</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />log4j.logger.net.sf.ehcache</span><span style="color: #000000">=</span><span style="color: #000000">INFO<br />
</span><span style="color: #008080">22</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />log4j.logger.org.hibernate.SQL</span><span style="color: #000000">=</span><span style="color: #000000">DEBUG</span></span></div>
<br />
<br />
<hr />
<br />
<strong>7、Hibernate 映射类型</strong> <br />
<br />
</p>
<p><br />
7-1、时间日期映射类型（内置映射类型）</p>
<p>&nbsp; Java 语言提供了 java.util.Date 和 java.util.Calendar 两个类实现时间的运算。此外，JDBC 还提供了 java.util.Date 的三个扩展类 java.sql.Timestamp、java.sql.Time 和 java.sql.Date 分别对应标准 SQL 数据类型中的 TIMESPAME/DATETIME（时间日期）、TIME（时间）、DATE（日期）。</p>
<p>java.util.Date/java.sql.Date&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;H:date&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SQL:DATE<br />
java.util.Time/java.sql.Time&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;H:time&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SQL:TIME<br />
java.util.Date/java.sql.Timestamp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;H:timestamp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SQL:TIMESTAMP/DATETIME<br />
java.util.Calendar&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;H:calendar&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SQL:TIMESTAMP/DATETIME<br />
java.util.Calendar&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; H:calendar_date&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SQL:DATE</p>
<p><br />
7-2、自定义映射类型</p>
<p><br />
&nbsp;</p>
 <img src ="http://www.blogjava.net/kiant/aggbug/264993.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kiant/" target="_blank">黄小二</a> 2009-04-11 10:45 <a href="http://www.blogjava.net/kiant/articles/264993.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>'Hibernate 完全手册' 读书笔记（一） 对象持久化基础</title><link>http://www.blogjava.net/kiant/articles/264770.html</link><dc:creator>黄小二</dc:creator><author>黄小二</author><pubDate>Fri, 10 Apr 2009 01:50:00 GMT</pubDate><guid>http://www.blogjava.net/kiant/articles/264770.html</guid><wfw:comment>http://www.blogjava.net/kiant/comments/264770.html</wfw:comment><comments>http://www.blogjava.net/kiant/articles/264770.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kiant/comments/commentRss/264770.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kiant/services/trackbacks/264770.html</trackback:ping><description><![CDATA[<p><br />
&nbsp;&nbsp;&nbsp; 数据库技术已经成为企业信息平台的核心。应用程序必须将业务相关的数据通过一定方式持久化到数据库，还应能够从数据库获取已有的数据，以适当的形式提供给客户或支撑系统的运行。</p>
<p>&nbsp;&nbsp;&nbsp; 关键点：如何高效地存取数据、简化编程模型、降低应用的复杂度</p>
<p>&nbsp;&nbsp;&nbsp; 在系统中引入持久层，负责所有相关数据的持久化操作，可以为整个应用系统提供一个高层、统一、安全、并发的数据持久机制。</p>
<p><br />
1、对象持久化技术</p>
<p>1-1、Java 对象序列化<br />
&nbsp;&nbsp;&nbsp; 序列化是 Java 语言中内置的轻量级数据持久化机制，该机制可以将任何实现了 java.io.Serializable 接口的对象转化为连续的字节流数据，保存在文件中，或者通过网络进行传输。这些数据日后可被还原为原先的对象状态。<br />
&nbsp;&nbsp;&nbsp; 缺点：局限性大，查询只能返回数据流的下一个对象，不提供部分的读取和更新，不提供对象的生命周期管理，只是简单的读取和写入，不提供并发和事务特性。</p>
<p>1-2、使用 JDBC<br />
&nbsp;&nbsp;&nbsp; JDBC（Java Database Connectivity）是用来访问关系数据库系统的标准 Java API。JDBC 只是提供访问数据的接口，其底层实现有特定的数据库厂商实现。<br />
&nbsp;&nbsp;&nbsp; 缺点：直接使用 JDBC 实现持久化时，SQL 语句和应用代码混杂在一起，逻辑混乱。另外直接使用 SQL 操作数据库，不是面向对象。</p>
<p>1-3、使用 JDO<br />
&nbsp;&nbsp;&nbsp; Java 数据对象（Java Data Object）是 JCP（Java Community Process）发布的一个规范，是 Java 对象持久化的标准。JDO 仅定义了标准的编程接口，而把关系映射的定义留给软件供应商实现。</p>
<p>1-4、实体 EJB<br />
&nbsp;&nbsp;&nbsp; 实体 EJB（Enterpise Java Bean）是 Java 领域的数据持久化标准。</p>
<p>1-5、对象关系映射<br />
&nbsp;&nbsp;&nbsp; 对象关系映射（Ojbect Relation Mapping）在对象模型和关系模型之间建立沟通的桥梁。ORM 技术封装了数据持久化的操作细节，为应用程序提供了一只访问的接口，使应用程序可以专注于业务逻辑的处理。它采用 POJO（Plain Old Java Object，简单的传统对象）作为域对象的表述，不涉及域对象之外的技术细节，降低的 ORM 技术的侵入性，实现简单，便于测试，具备高扩展性。</p>
<p><br />
2、对象关系映射模型<br />
&nbsp;&nbsp;&nbsp; 一个完整的对象关系映射框架，应具备以下四个方面：</p>
<p>①、一个元数据映射规范，负责持久化类、类属性的数据库表、字段的映射，实现对象和关系的语义连接。<br />
②、一组对象操作接口，用于完成数据的增加、删除、修改和更新等操作。<br />
③、一种面向对象的查询语言，该语言能理解继承、多态和关联等面向对象特性，实现基于对象的查询并在对象之间导航。<br />
④、一系列与数据库现关的技术实现和最佳实践，保证系统的完整性并提高系统的可用性和扩展性。比如：事务、缓存和数据抓取策略等。</p>
<p>对象模型（类、属性、关联）&nbsp;&nbsp; &lt;==&gt;&nbsp;&nbsp; 关系模型（表、字段、约束）</p>
<p>&nbsp;<br />
<br />
ps. &lt;Hibernate 完全手册&gt;<br />
ISBN 978-7-111-23764-8<br />
机械工业出版社<br />
侯志松 余周 郑焕 等编著</p>
 <img src ="http://www.blogjava.net/kiant/aggbug/264770.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kiant/" target="_blank">黄小二</a> 2009-04-10 09:50 <a href="http://www.blogjava.net/kiant/articles/264770.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转] Hibernate3.0以上中执行存储过程</title><link>http://www.blogjava.net/kiant/articles/232398.html</link><dc:creator>黄小二</dc:creator><author>黄小二</author><pubDate>Sat, 04 Oct 2008 14:13:00 GMT</pubDate><guid>http://www.blogjava.net/kiant/articles/232398.html</guid><wfw:comment>http://www.blogjava.net/kiant/comments/232398.html</wfw:comment><comments>http://www.blogjava.net/kiant/articles/232398.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kiant/comments/commentRss/232398.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kiant/services/trackbacks/232398.html</trackback:ping><description><![CDATA[<br />
文章出处：<a href="http://www.diybl.com/course/3_program/java/javajs/2008324/106036.html" target="_blank">http://www.diybl.com/course/3_program/java/javajs/2008324/106036.html</a><br />
<br />
hibernate3.0以上提供了两种方式执行存储过程。<br />
<br />
第一种 ：用JDBC方式（获得 Connection 对象）<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">Session&nbsp;session&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">HibernateSessionFactory.getSession();&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">获取hibernate会话</span><span style="color: #008000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />Connection&nbsp;conn&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;session.connection();&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;用session对象获取连接</span><span style="color: #008000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />ResultSet&nbsp;rs&nbsp;</span><span style="color: #000000">=</span><span style="color: #0000ff">null</span><span style="color: #000000">;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">try</span><span style="color: #000000"><br />
<img id="Codehighlighter1_158_332_Open_Image" onclick="this.style.display='none'; Codehighlighter1_158_332_Open_Text.style.display='none'; Codehighlighter1_158_332_Closed_Image.style.display='inline'; Codehighlighter1_158_332_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_158_332_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_158_332_Closed_Text.style.display='none'; Codehighlighter1_158_332_Open_Image.style.display='inline'; Codehighlighter1_158_332_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" />&nbsp;&nbsp;</span><span id="Codehighlighter1_158_332_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_158_332_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;CallableStatement&nbsp;call&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;conn.prepareCall(</span><span style="color: #000000">"</span><span style="color: #000000">{Call&nbsp;pro_getManager(?,?)}</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;call.setString(</span><span style="color: #000000">1</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">admin</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;call.setString(</span><span style="color: #000000">2</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">admin</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;rs&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;call.executeQuery();<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;</span><span style="color: #0000ff">catch</span><span style="color: #000000">&nbsp;(Exception&nbsp;e)<br />
<img id="Codehighlighter1_358_386_Open_Image" onclick="this.style.display='none'; Codehighlighter1_358_386_Open_Text.style.display='none'; Codehighlighter1_358_386_Closed_Image.style.display='inline'; Codehighlighter1_358_386_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_358_386_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_358_386_Closed_Text.style.display='none'; Codehighlighter1_358_386_Open_Image.style.display='inline'; Codehighlighter1_358_386_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" />&nbsp;&nbsp;</span><span id="Codehighlighter1_358_386_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_358_386_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />&nbsp;&nbsp;}</span></span><span style="color: #0000ff">finally</span><span style="color: #000000"><br />
<img id="Codehighlighter1_397_497_Open_Image" onclick="this.style.display='none'; Codehighlighter1_397_497_Open_Text.style.display='none'; Codehighlighter1_397_497_Closed_Image.style.display='inline'; Codehighlighter1_397_497_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_397_497_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_397_497_Closed_Text.style.display='none'; Codehighlighter1_397_497_Open_Image.style.display='inline'; Codehighlighter1_397_497_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" />&nbsp;&nbsp;</span><span id="Codehighlighter1_397_497_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_397_497_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;rs.close();</span><span style="color: #008000">//</span><span style="color: #008000">关闭</span><span style="color: #008000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;session.close();</span><span style="color: #008000">//</span><span style="color: #008000">关闭连接</span><span style="color: #008000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;HibernateSessionFactory.closeSession();&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">关闭会话</span><span style="color: #008000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" /></span><span style="color: #000000">&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />这种方式本人感觉与hibernate结合不很紧密,还难以控制，还要自己控制关闭</span></div>
<br />
&nbsp;<br />
第二种： 用hibernate中SQLQuery 接口执行，其实与执行sql没有两样。<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">Session&nbsp;session&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">HibernateSessionFactory.getSession();&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">获取hibernate会话</span><span style="color: #008000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />String&nbsp;procName</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">{Call&nbsp;pro_getManager(?,?)&nbsp;}</span><span style="color: #000000">"</span><span style="color: #000000">;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />SQLQuery&nbsp;query&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;session.createSQLQuery(proc);<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />query.setString(</span><span style="color: #000000">0</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">admin</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />query.setString(</span><span style="color: #000000">1</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">admin</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />List&nbsp;list&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">query.list();<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />session.close();<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />HibernateSessionFactory.closeSession();<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />SQLQuery&nbsp;接口功能很强大吧</span></div>
<br />
<br />
<fieldset><legend>API</legend>Connection 方法：<br />
<strong>CallableStatement prepareCall(String sql) throws SQLException</strong>
<p>创建一个 CallableStatement 对象来调用数据库存储过程。CallableStatement 对象提供了设置其 IN 和 OUT 参数的方法，以及用来执行调用存储过程的方法。</p>
<p>&nbsp;</p>
<p><strong>public interface CallableStatement extends PreparedStatement</strong></p>
<p>用于执行 SQL 存储过程的接口。JDBC API 提供了一个存储过程 SQL 转义语法，该语法允许对所有 RDBMS 使用标准方式调用存储过程。此转义语法有一个包含结果参数的形式和一个不包含结果参数的形式。如果使用结果参数，则必须将其注册为 OUT 参数。其他参数可用于输入、输出或同时用于二者。参数是根据编号按顺序引用的，第一个参数的编号是 1。 </p>
<p><strong>&nbsp;&nbsp; {?= call &lt;procedure-name&gt;[(&lt;arg1&gt;,&lt;arg2&gt;, ...)]}<br />
&nbsp;&nbsp; {call &lt;procedure-name&gt;[(&lt;arg1&gt;,&lt;arg2&gt;, ...)]}</strong></p>
<p>&nbsp;IN 参数值是使用继承自 PreparedStatement 的 set 方法设置的。在执行存储过程之前，必须注册所有 OUT 参数的类型；它们的值是在执行后通过此类提供的 get 方法获取的。 </p>
<p>CallableStatement 可以返回一个 ResultSet 对象或多个 ResultSet 对象。多个 ResultSet 对象是使用继承自 Statement 的操作处理的。 </p>
</fieldset> 
<img src ="http://www.blogjava.net/kiant/aggbug/232398.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kiant/" target="_blank">黄小二</a> 2008-10-04 22:13 <a href="http://www.blogjava.net/kiant/articles/232398.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用 HibernateTemplate 实现分页查询 (HibernateCallback接口)</title><link>http://www.blogjava.net/kiant/articles/227510.html</link><dc:creator>黄小二</dc:creator><author>黄小二</author><pubDate>Sun, 07 Sep 2008 03:25:00 GMT</pubDate><guid>http://www.blogjava.net/kiant/articles/227510.html</guid><wfw:comment>http://www.blogjava.net/kiant/comments/227510.html</wfw:comment><comments>http://www.blogjava.net/kiant/articles/227510.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kiant/comments/commentRss/227510.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kiant/services/trackbacks/227510.html</trackback:ping><description><![CDATA[<br />
<fieldset>
<p>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; HibernateTemplate 只支持 .setMaxResults(int) 方法。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; 因此，做 Spring+Hibernate 分页处理要使用到一个接口 org.springframework.orm.hibernate3.HibernateCallback<br />
来灵活操作数据库，该接口中有一个未实现的方法 Object doInHibernate (Session session)，用以获得并利用 session 进行操作(自动创建、销毁)。</p>
<p>以下代码均参考了&nbsp;<a href="http://www.blogjava.net/beansoft/archive/2007/10/10/151702.html" target="_blank">使用 HibernateTemplate 实现分页查询</a> 一文。</p>
</fieldset>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img id="Codehighlighter1_0_10_Open_Image" onclick="this.style.display='none'; Codehighlighter1_0_10_Open_Text.style.display='none'; Codehighlighter1_0_10_Closed_Image.style.display='inline'; Codehighlighter1_0_10_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_0_10_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_0_10_Closed_Text.style.display='none'; Codehighlighter1_0_10_Open_Image.style.display='inline'; Codehighlighter1_0_10_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /><span id="Codehighlighter1_0_10_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">/**&nbsp;*/</span><span id="Codehighlighter1_0_10_Open_Text"><span style="color: #008000">/**</span><span style="color: #008000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;*&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />&nbsp;</span><span style="color: #008000">*/</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;springdao;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;hibernatedao.HibernateSessionFactory;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.sql.SQLException;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.util.List;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.apache.commons.logging.Log;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.apache.commons.logging.LogFactory;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.hibernate.HibernateException;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.hibernate.Session;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.springframework.orm.hibernate3.HibernateCallback;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.springframework.orm.hibernate3.HibernateTemplate;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img id="Codehighlighter1_411_470_Open_Image" onclick="this.style.display='none'; Codehighlighter1_411_470_Open_Text.style.display='none'; Codehighlighter1_411_470_Closed_Image.style.display='inline'; Codehighlighter1_411_470_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_411_470_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_411_470_Closed_Text.style.display='none'; Codehighlighter1_411_470_Open_Image.style.display='inline'; Codehighlighter1_411_470_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span id="Codehighlighter1_411_470_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">/**&nbsp;*/</span><span id="Codehighlighter1_411_470_Open_Text"><span style="color: #008000">/**</span><span style="color: #008000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;*&nbsp;通用&nbsp;DAO&nbsp;包<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;*&nbsp;</span><span style="color: #808080">@author</span><span style="color: #008000">&nbsp;kiant<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;*&nbsp;</span><span style="color: #808080">@version</span><span style="color: #008000">&nbsp;Sep&nbsp;7,&nbsp;2008<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />&nbsp;</span><span style="color: #008000">*/</span></span><span style="color: #000000"><br />
<img id="Codehighlighter1_496_1386_Open_Image" onclick="this.style.display='none'; Codehighlighter1_496_1386_Open_Text.style.display='none'; Codehighlighter1_496_1386_Closed_Image.style.display='inline'; Codehighlighter1_496_1386_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_496_1386_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_496_1386_Closed_Text.style.display='none'; Codehighlighter1_496_1386_Open_Image.style.display='inline'; Codehighlighter1_496_1386_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;CommomsDAO&nbsp;</span><span id="Codehighlighter1_496_1386_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_496_1386_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">final</span><span style="color: #000000">&nbsp;Log&nbsp;log&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;LogFactory.getLog(EcOpusDAO.</span><span style="color: #0000ff">class</span><span style="color: #000000">);<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">获得会话</span><span style="color: #008000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;HibernateTemplate&nbsp;hibernateTemplate&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;HibernateTemplate(HibernateSessionFactory.getSessionFactory());<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img id="Codehighlighter1_701_815_Open_Image" onclick="this.style.display='none'; Codehighlighter1_701_815_Open_Text.style.display='none'; Codehighlighter1_701_815_Closed_Image.style.display='inline'; Codehighlighter1_701_815_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_701_815_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_701_815_Closed_Text.style.display='none'; Codehighlighter1_701_815_Open_Image.style.display='inline'; Codehighlighter1_701_815_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_701_815_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">/**&nbsp;*/</span><span id="Codehighlighter1_701_815_Open_Text"><span style="color: #008000">/**</span><span style="color: #008000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;分页通用方法<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080">@param</span><span style="color: #008000">&nbsp;hql&nbsp;&nbsp;HQL查询语句<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080">@param</span><span style="color: #008000">&nbsp;offset&nbsp;&nbsp;&nbsp;&nbsp;起始记录下标<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080">@param</span><span style="color: #008000">&nbsp;lengh&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;读取记录数<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080">@return</span><span style="color: #008000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List&nbsp;结果集<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">*/</span></span><span style="color: #000000"><br />
<img id="Codehighlighter1_905_1384_Open_Image" onclick="this.style.display='none'; Codehighlighter1_905_1384_Open_Text.style.display='none'; Codehighlighter1_905_1384_Closed_Image.style.display='inline'; Codehighlighter1_905_1384_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_905_1384_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_905_1384_Closed_Text.style.display='none'; Codehighlighter1_905_1384_Open_Image.style.display='inline'; Codehighlighter1_905_1384_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;List&nbsp;getListForPage(</span><span style="color: #0000ff">final</span><span style="color: #000000">&nbsp;String&nbsp;hql,&nbsp;</span><span style="color: #0000ff">final</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;offset,&nbsp;</span><span style="color: #0000ff">final</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;lengh)&nbsp;</span><span id="Codehighlighter1_905_1384_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_905_1384_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log.debug(</span><span style="color: #000000">"</span><span style="color: #000000">finding&nbsp;ListForPage</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img id="Codehighlighter1_949_1289_Open_Image" onclick="this.style.display='none'; Codehighlighter1_949_1289_Open_Text.style.display='none'; Codehighlighter1_949_1289_Closed_Image.style.display='inline'; Codehighlighter1_949_1289_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_949_1289_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_949_1289_Closed_Text.style.display='none'; Codehighlighter1_949_1289_Open_Image.style.display='inline'; Codehighlighter1_949_1289_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">try</span><span style="color: #000000">&nbsp;</span><span id="Codehighlighter1_949_1289_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_949_1289_Open_Text"><span style="color: #000000">{<br />
<img id="Codehighlighter1_1019_1267_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1019_1267_Open_Text.style.display='none'; Codehighlighter1_1019_1267_Closed_Image.style.display='inline'; Codehighlighter1_1019_1267_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_1019_1267_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_1019_1267_Closed_Text.style.display='none'; Codehighlighter1_1019_1267_Open_Image.style.display='inline'; Codehighlighter1_1019_1267_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List&nbsp;list&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;hibernateTemplate.executeFind(</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;HibernateCallback()</span><span id="Codehighlighter1_1019_1267_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_1019_1267_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;Object&nbsp;doInHibernate(Session&nbsp;session)<br />
<img id="Codehighlighter1_1117_1266_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1117_1266_Open_Text.style.display='none'; Codehighlighter1_1117_1266_Closed_Image.style.display='inline'; Codehighlighter1_1117_1266_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_1117_1266_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_1117_1266_Closed_Text.style.display='none'; Codehighlighter1_1117_1266_Open_Image.style.display='inline'; Codehighlighter1_1117_1266_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;HibernateException,&nbsp;SQLException&nbsp;</span><span id="Codehighlighter1_1117_1266_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_1117_1266_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List&nbsp;list2&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;session.createQuery(hql)<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.setFirstResult(offset)<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.setMaxResults(lengh)<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.list();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;list2;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">}</span></span><span style="color: #000000">);<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;list;<br />
<img id="Codehighlighter1_1319_1381_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1319_1381_Open_Text.style.display='none'; Codehighlighter1_1319_1381_Closed_Image.style.display='inline'; Codehighlighter1_1319_1381_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_1319_1381_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_1319_1381_Closed_Text.style.display='none'; Codehighlighter1_1319_1381_Open_Image.style.display='inline'; Codehighlighter1_1319_1381_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">catch</span><span style="color: #000000">&nbsp;(RuntimeException&nbsp;re)&nbsp;</span><span id="Codehighlighter1_1319_1381_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_1319_1381_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log.error(</span><span style="color: #000000">"</span><span style="color: #000000">find&nbsp;ListForPage&nbsp;failed</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;re);<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">throw</span><span style="color: #000000">&nbsp;re;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span></div>
<br />
<br />
<fieldset>ps.<br />
也可以通过：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.getSession();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.getHibernateTemplate().getSessionFactory().openSession(); <br />
分别获取 session 进行 createQuery()等操作。<br />
但是这种做法，需要自己去手动关闭session的。所以你需要配置openSessioninview，不推荐使用！ </fieldset>
<img src ="http://www.blogjava.net/kiant/aggbug/227510.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kiant/" target="_blank">黄小二</a> 2008-09-07 11:25 <a href="http://www.blogjava.net/kiant/articles/227510.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>HibernateDAO 生成方法注解</title><link>http://www.blogjava.net/kiant/articles/227344.html</link><dc:creator>黄小二</dc:creator><author>黄小二</author><pubDate>Fri, 05 Sep 2008 15:11:00 GMT</pubDate><guid>http://www.blogjava.net/kiant/articles/227344.html</guid><wfw:comment>http://www.blogjava.net/kiant/comments/227344.html</wfw:comment><comments>http://www.blogjava.net/kiant/articles/227344.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kiant/comments/commentRss/227344.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kiant/services/trackbacks/227344.html</trackback:ping><description><![CDATA[<br />
<br />
<fieldset><legend>预备知识：</legend>出自：<a href="http://dreamstone.javaeye.com/blog/106497" target="_blank">hibernate的各种保存方式的区别 (save,persis,update,saveOrUpdte,merge等) </a><br />
在所有之前，说明一下，对于hibernate，它的对象有三种状态，transient、persistent、detached<br />
&nbsp;&nbsp;&nbsp;&nbsp;transient：瞬态或者自由态<br />
&nbsp;&nbsp;&nbsp;&nbsp;persistent：持久化状态<br />
&nbsp;&nbsp;&nbsp;&nbsp;detached：脱管状态或者游离态<br />
脱管状态的实例可以通过调用save()、persist()或者saveOrUpdate()方法进行持久化。<br />
持久化实例可以通过调用 delete()变成脱管状态。通过get()或load()方法得到的实例都是持久化状态的。<br />
脱管状态的实例可以通过调用 update()、0saveOrUpdate()、lock()或者replicate()进行持久化。<br />
<br />
save()和persist()将会引发SQL的INSERT，delete()会引发SQLDELETE，<br />
而update()或merge()会引发SQLUPDATE。对持久化（persistent）实例的修改在刷新提交的时候会被检测到，<br />
它也会引起SQLUPDATE。saveOrUpdate()或者replicate()会引发SQLINSERT或者UPDATE</fieldset><br />
<br />
<fieldset><legend>[推荐] 解析eclipse下生成Hibernate DAO中的几个方法</legend>出自： <a href="http://blog.csdn.net/xzknet/archive/2007/06/06/1641204.aspx" target="_blank">http://blog.csdn.net/xzknet/archive/2007/06/06/1641204.aspx</a><br />
void save(Usertable transientInstance)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;方法提供了向数据库中添加数据的功能<br />
void delete(Usertable persistentInstance)&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;方法看名知意是用来删除的.<br />
Usertable findById(java.lang.Integer id)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;方法实现了按ID查询数据.<br />
List findByExample(Usertable instance)&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;方法实现的功能相当于"select * from Usertable"实现的功能就是查询所有 <br />
List findByProperty(String propertyName, Object value)&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;方法用来灵活的提供一种按条件查询的方法,你可以自己定义要按什么样的方式查询.
<p><br />
CodeDepts merge(CodeDepts detachedInstance)&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;将传入的detached状态的对象的属性复制到持久化对象中，并返回该持久化对象。如果该session中没有关联的持久化对象，加载一个，如果传入对象未保存，保存一个副本并作为持久对象返回，传入对象依然保持detached状态。<br />
void attachDirty(CodeDepts instance)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;将传入的对象持久化并保存。如果对象未保存（Transient状态），调用save方法保存。如果对象已保存（Detached状态），调用update方法将对象与Session重新关联。 <br />
attachClean(CodeDepts instance)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;将传入的对象状态设置为Transient状态。</p>
</fieldset><br />
<br />
<fieldset><legend>.merge(object)&nbsp; 合并、吞入</legend><a href="http://dreamstone.javaeye.com/blog/106497" target="_blank">hibernate的各种保存方式的区别 (save,persis,update,saveOrUpdte,merge等) </a><br />
如果session中存在相同持久化标识(identifier)的实例，用用户给出的对象的状态覆盖旧有的持久实例 <br />
如果session没有相应的持久实例，则尝试从数据库中加载，或创建新的持久化实例,最后返回该持久实例 <br />
用户给出的这个对象没有被关联到session上，它依旧是脱管的 <br />
重点是最后一句：<br />
&nbsp;&nbsp;&nbsp;&nbsp;当我们使用update的时候，执行完成后，我们提供的对象A的状态变成持久化状态。<br />
&nbsp;&nbsp;&nbsp;&nbsp;但当我们使用merge的时候，执行完成，我们提供的对象A还是脱管状态，hibernate或者new了一个B，或者检索到一个持久对象B，并把我们提供的对象A的所有的值拷贝到这个B，执行完成后B是持久状态，而我们提供的A还是托管状态<br />
<p><br />
<a href="http://hi.baidu.com/limeng1028/blog/item/275fbd12200544cdc2fd7828.html" target="_blank">NonUniqueObjectException问题的解决<br />
</a>org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session:<br />
解决方法：<br />
&nbsp;&nbsp;&nbsp;&nbsp; 使用 hibernate 3 的 merge 方法. session.merge(newDetail)即可，它会在 session 缓存中找到持久化对象，把新对象的属性赋过去，再保存原session中的持久化对象。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;如果在session或数据库中没有的对象，用merge方法的话，它也能够帮你把记录 insert 到表中，相当于 save 方法。</p>
</fieldset><br />
&nbsp;<br />
<fieldset><legend>.findByExample(object)</legend><a href="http://blog.chinaunix.net/u/32373/showart_407624.html" target="_blank">使用Spring封装的Hibernate方法<br />
</a>按照 object 所设置的属性值来组合查询语句的where条件，比如：<br />
&nbsp;&nbsp;&nbsp;&nbsp;Users anUser = new Users();<br />
&nbsp;&nbsp;&nbsp;&nbsp;anUser.setUserName("a");<br />
&nbsp;&nbsp;&nbsp;&nbsp;anUser.setPassWord("b");&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=====&gt; where username='a' and password='b'<br />
&nbsp;&nbsp;&nbsp;&nbsp;anUser.setRealName("");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=====&gt; where username='a' and password='b' and realname=''</fieldset> 
<img src ="http://www.blogjava.net/kiant/aggbug/227344.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kiant/" target="_blank">黄小二</a> 2008-09-05 23:11 <a href="http://www.blogjava.net/kiant/articles/227344.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate 查询相关</title><link>http://www.blogjava.net/kiant/articles/227339.html</link><dc:creator>黄小二</dc:creator><author>黄小二</author><pubDate>Fri, 05 Sep 2008 14:39:00 GMT</pubDate><guid>http://www.blogjava.net/kiant/articles/227339.html</guid><wfw:comment>http://www.blogjava.net/kiant/comments/227339.html</wfw:comment><comments>http://www.blogjava.net/kiant/articles/227339.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kiant/comments/commentRss/227339.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kiant/services/trackbacks/227339.html</trackback:ping><description><![CDATA[<br />
<fieldset><legend>[推荐]&nbsp; hibernate-native sql support </legend><a href="http://www.blogjava.net/alex0927/articles/194737.html" target="_blank">http://www.blogjava.net/alex0927/articles/194737.html</a><br />
1.使用SQLQuery&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Session.createSQLQuery();<br />
&nbsp;&nbsp;&nbsp; 1.1标量查询&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;最基本的SQL查询就是获得一个标量（数值）的列表。<br />
&nbsp;&nbsp;&nbsp; 1.2 实体查询&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;通过 addEntity() 让原生查询返回实体对象。<br />
&nbsp;&nbsp;&nbsp; 1.3 处理关联和集合类&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;通过 addJoin() 方法可以让你将关联或集合连接进来。<br />
&nbsp;&nbsp;&nbsp; 1.4 返回多个实体<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1.4.1 别名和属性引用<br />
&nbsp;&nbsp;&nbsp; 1.5. 返回非受管实体&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;可以对原生sql 查询使用ResultTransformer。这会返回不受Hibernate管理的实体。<br />
&nbsp;&nbsp;&nbsp; 1.6. 处理继承&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; 1.7. 参数&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;原生查询支持位置参数(? 0)和命名参数(: varName)
<p>2.使用命名SQL查询&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xml 文件中定义好 HQL 语句，通过 sess.getNamedQuery("persons") 调用命名注入。<br />
&nbsp;&nbsp;&nbsp; 2.1. 使用return-property来明确地指定字段/别名<br />
&nbsp;&nbsp;&nbsp; 2.2. 使用存储过程来查询<br />
&nbsp;&nbsp;&nbsp; 2.2.1. 使用存储过程的规则和限制</p>
</fieldset><br />
<br />
<fieldset><legend>方法链编程风格</legend>ist result=session.createCriteria(Customer.class) <br />
&nbsp;&nbsp;&nbsp; .add(Expression.like("name", "T%")<br />
&nbsp;&nbsp;&nbsp; .add(Expression.eq("age", newInteger(21))<br />
&nbsp;&nbsp;&nbsp; .list();</fieldset><br />
<br />
<fieldset><legend>预编译语句</legend>Hibernate 中避免拼串, 使用预编译语句,<br />
1).使用顺序占位符&nbsp;&nbsp;&nbsp; .age &gt; ?<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;query.setInteger(0,20);<br />
2).使用引用占位符&nbsp;&nbsp;&nbsp; .name = :name<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;query.setParameter("name","Erica");</fieldset><br />
&nbsp;<br />
<fieldset><legend>Hibernate多表关联查询的结果处理</legend><a href="http://www.blogjava.net/kawaii/archive/2008/06/23/101930.html" target="_blank">http://www.blogjava.net/kawaii/archive/2008/06/23/101930.html</a><br />
如果我们在Hibernate中需要查询多个表的不同字段，有两种方式获得结果：<br />
1、对各个字段分别转化成对应类型<br />
&nbsp;&nbsp;&nbsp; List result = q.list();&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; Iterator it = result.iterator();&nbsp; <br />
&nbsp;&nbsp;&nbsp; while (it.hasNext()) {&nbsp; <br />
&nbsp;&nbsp;&nbsp; Object[] tuple = (Object[]) it.next();&nbsp; <br />
&nbsp;&nbsp;&nbsp; Members members = (Members) tuple[0];&nbsp; <br />
&nbsp;&nbsp;&nbsp; String className = (String) tuple[1];&nbsp; <br />
&nbsp;&nbsp;&nbsp; }
<p>2、构造自己的复合类型</p>
</fieldset> 
<img src ="http://www.blogjava.net/kiant/aggbug/227339.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kiant/" target="_blank">黄小二</a> 2008-09-05 22:39 <a href="http://www.blogjava.net/kiant/articles/227339.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转] Hibernate 的主健产生机制</title><link>http://www.blogjava.net/kiant/articles/227283.html</link><dc:creator>黄小二</dc:creator><author>黄小二</author><pubDate>Fri, 05 Sep 2008 09:24:00 GMT</pubDate><guid>http://www.blogjava.net/kiant/articles/227283.html</guid><wfw:comment>http://www.blogjava.net/kiant/comments/227283.html</wfw:comment><comments>http://www.blogjava.net/kiant/articles/227283.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kiant/comments/commentRss/227283.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kiant/services/trackbacks/227283.html</trackback:ping><description><![CDATA[<p>Key Generator 主键产生器 </p>
<p>可选项说明： <br />
<br />
1) assigned&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;主键由外部程序负责生成，无需Hibernate参与。 </p>
<p>2) hilo&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 通过hi/lo 算法实现的主键生成机制，需要额外的数据库表保存主键生成历史状态。 </p>
<p>3) seqhilo&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 与hilo 类似，通过hi/lo 算法实现的主键生成机制，只是主键历史状态保存在Sequence中，适用于支持Sequence的数据库，如Oracle。 </p>
<p>4) increment <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 主键按数值顺序递增。此方式的实现机制为在当前应用实例中维持一个变量，以保存着当前的最大值，之后每次需要生成主键的时候将此值加1作为主键。&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这种方式可能产生的问题是：如果当前有多个实例访问同一个数据库，那么由于各个实例各自维护主键状态，不同实例可能生成同样的主键，从而造成主键重复异常。因此，如果同一数据库有多个实例访问，此方式必须避免使用。 </p>
<p>5) identity&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 采用数据库提供的主键生成机制。如 <strong>DB2、SQL Server、MySQL</strong> 中的主键生成机制。 </p>
<p>6) sequence&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 采用数据库提供的sequence 机制生成主键。<strong>如Oralce 中的Sequence。</strong> </p>
<p>7) native&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 由Hibernate根据底层数据库<strong>自行判断采用 identity、hilo、sequence</strong> 其中一种作为主键生成方式。 </p>
<p>8) uuid.hex&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 由Hibernate基于128 位唯一值产生算法生成16 进制数值（编码后以长度32的字符串表示）作为主键。 </p>
<p>9) uuid.string&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 与uuid.hex 类似，只是生成的主键未进行编码（长度16）。在某些数据库中可能出现问题（如PostgreSQL）。 </p>
<p>10) foreign&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 使用外部表的字段作为主键。 </p>
<p><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 一般而言，利用uuid.hex方式生成主键将提供最好的性能和数据库平台适应性。 </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 另外由于常用的数据库，如Oracle、DB2、SQLServer、MySql 等，都提供了易用的主键生成机制（Auto-Increase 字段或者Sequence）。我们可以在数据库提供的主键生成机制上，采用 generator-class = native 的主键生成方式。 </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 不过值得注意的是，一些数据库提供的主键生成机制在效率上未必最佳，大量并发insert数据时可能会引起表之间的互锁。数据库提供的主键生成机制，往往是通过在一个内部表中保存当前主键状态（如对于自增型主键而言，此内部表中就维护着当前的最大值和递增量），之后每次插入数据会读取这个最大值，然后加上递增量作为新记录的主键，之后再把这个新的最大值更新回内部表中，这样，一次Insert操作可能导致数据库内部多次表读写操作，同时伴随的还有数据的加锁解锁操作，这对性能产生了较大影响。 </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 因此，对于并发Insert要求较高的系统，推荐采用uuid.hex 作为主键生成机制。<br />
</p>
<img src ="http://www.blogjava.net/kiant/aggbug/227283.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kiant/" target="_blank">黄小二</a> 2008-09-05 17:24 <a href="http://www.blogjava.net/kiant/articles/227283.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[导入]Hibernate 学习笔记</title><link>http://www.blogjava.net/kiant/articles/214458.html</link><dc:creator>黄小二</dc:creator><author>黄小二</author><pubDate>Sat, 12 Jul 2008 10:05:00 GMT</pubDate><guid>http://www.blogjava.net/kiant/articles/214458.html</guid><wfw:comment>http://www.blogjava.net/kiant/comments/214458.html</wfw:comment><comments>http://www.blogjava.net/kiant/articles/214458.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kiant/comments/commentRss/214458.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kiant/services/trackbacks/214458.html</trackback:ping><description><![CDATA[<br />
<br />
Hibernate 百度百科&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="http://baike.baidu.com/view/7291.html?wtp=tt" target="_blank">http://baike.baidu.com/view/7291.html?wtp=tt</a>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img id="Code_Closed_Image_091002" onclick="this.style.display='none'; Code_Closed_Text_091002.style.display='none'; Code_Open_Image_091002.style.display='inline'; Code_Open_Text_091002.style.display='inline';" height="16" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" width="11" align="top" /><img id="Code_Open_Image_091002" style="display: none" onclick="this.style.display='none'; Code_Open_Text_091002.style.display='none'; Code_Closed_Image_091002.style.display='inline'; Code_Closed_Text_091002.style.display='inline';" height="16" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" width="11" align="top" /><span id="Code_Closed_Text_091002" style="border-right: #808080 1px solid; border-top: #808080 1px solid; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">摘要</span><span id="Code_Open_Text_091002" style="display: none"><br />
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />Hibernate是一个开放源代码的对象关系映射框架，它对JDBC进行了非常轻量级的对象封装，使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。 Hibernate可以应用在任何使用JDBC的场合，既可以在Java的客户端程序使用，也可以在Servlet/JSP的Web应用中使用，最具革命意义的是，Hibernate可以在应用EJB的J2EE架构中取代CMP，完成数据持久化的重任。<br />
<br />
<img alt="" src="http://www.blogjava.net/images/blogjava_net/kiant/a75fb6d3228cfe27970a168c.jpg" border="0" /><br />
<br />
Hibernate的核心接口一共有5个，分别为:Session、SessionFactory、Transaction、Query和Configuration。这5个核心接口在任何开发中都会用到。通过这些接口，不仅可以对持久化对象进行存取，还能够进行事务控制。 <br />
下面对这五的核心接口分别加以介绍。<br />
<br />
　　&#183;Session接口:Session接口负责执行被持久化对象的CRUD操作(CRUD的任务是完成与数据库的交流，包含了很多常见的SQL语句。)。但需要注意的是Session对象是非线程安全的。同时，Hibernate的session不同于JSP应用中的HttpSession。这里当使用session这个术语时，其实指的是Hibernate中的session，而以后会将HttpSesion对象称为用户session。<br />
　　&#183;SessionFactory接口:SessionFactroy接口负责初始化Hibernate。它充当数据存储源的代理，并负责创建Session对象。这里用到了工厂模式。需要注意的是SessionFactory并不是轻量级的，因为一般情况下，一个项目通常只需要一个SessionFactory就够，当需要操作多个数据库时，可以为每个数据库指定一个SessionFactory。<br />
　　&#183;Configuration接口:Configuration接口负责配置并启动Hibernate，创建SessionFactory对象。在Hibernate的启动的过程中，Configuration类的实例首先定位映射文档位置、读取配置，然后创建SessionFactory对象。<br />
　　&#183;Transaction接口:Transaction接口负责事务相关的操作。它是可选的，开发人员也可以设计编写自己的底层事务处理代码。<br />
　　&#183;Query和Criteria接口:Query和Criteria接口负责执行各种数据库查询。它可以使用HQL语言或SQL语句两种表达方式。<br />
</span></div>
<br />
<br />
精通Hibernate学习笔记NO.1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="http://zpthomes.spaces.live.com/Blog/cns!6AB705608FFE25A3!334.entry" target="_blank">http://zpthomes.spaces.live.com/Blog/cns!6AB705608FFE25A3!334.entry</a><br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img id="Code_Closed_Image_184611" onclick="this.style.display='none'; Code_Closed_Text_184611.style.display='none'; Code_Open_Image_184611.style.display='inline'; Code_Open_Text_184611.style.display='inline';" height="16" alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" width="11" align="top" /><img id="Code_Open_Image_184611" style="display: none" onclick="this.style.display='none'; Code_Open_Text_184611.style.display='none'; Code_Closed_Image_184611.style.display='inline'; Code_Closed_Text_184611.style.display='inline';" height="16" alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" width="11" align="top" /><span id="Code_Closed_Text_184611" style="border-right: #808080 1px solid; border-top: #808080 1px solid; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">摘要</span><span id="Code_Open_Text_184611" style="display: none"><br />
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">Hibernate是什么</span><span style="color: #000000">?</span><span style="color: #000000">从不同的角度有不同的解释:<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000">1</span><span style="color: #000000">.它是连接Java应用程序和关系数据库的中间件.<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000">2</span><span style="color: #000000">.它对JDBC&nbsp;API进行了封装,负责Java对象的持久化.<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000">3</span><span style="color: #000000">.在分层的软件架构中它位于持久化层,封装了所有数据库访问细节,是业务逻辑层可以专注于实现业务逻辑.<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000">4</span><span style="color: #000000">.它是一中ORM(对象关系模型)映射工具.能够建立面向对象的域模型和关系数据模型之间的映射.<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />持久化层封装了数据访问细节，为业务逻辑层提供了面向对象的API,完善的持久化层应该达到以下目标:<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000">1</span><span style="color: #000000">.代码可重用性高,能够完成所有的数据库访问操作.<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000">2</span><span style="color: #000000">.如果需要的话,能够支持多种数据库平台.<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000">3</span><span style="color: #000000">.具有相对独立性,当持久层的实现发生变化时,不影响上层的实现.&nbsp;<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /></span></span></div>
<p>&nbsp;</p>
Hibernate 学习笔记&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="http://blog.csdn.net/kangwei8655990/archive/2007/04/13/1563706.aspx" target="_blank">http://blog.csdn.net/kangwei8655990/archive/2007/04/13/1563706.aspx&nbsp;</a><br />
第八章 Hibernate的入门&nbsp;&nbsp;<a href="http://blog.csdn.net/weijie_search/archive/2008/03/13/2175917.aspx" target="_blank">http://blog.csdn.net/weijie_search/archive/2008/03/13/2175917.aspx</a>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img id="Code_Closed_Image_085956" onclick="this.style.display='none'; Code_Closed_Text_085956.style.display='none'; Code_Open_Image_085956.style.display='inline'; Code_Open_Text_085956.style.display='inline';" height="16" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" width="11" align="top" /><img id="Code_Open_Image_085956" style="display: none" onclick="this.style.display='none'; Code_Open_Text_085956.style.display='none'; Code_Closed_Image_085956.style.display='inline'; Code_Closed_Text_085956.style.display='inline';" height="16" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" width="11" align="top" /><span id="Code_Closed_Text_085956" style="border-right: #808080 1px solid; border-top: #808080 1px solid; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">摘要</span><span id="Code_Open_Text_085956" style="display: none"><br />
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">10</span><span style="color: #000000">、如何学习Hibernate<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />（</span><span style="color: #000000">1</span><span style="color: #000000">）Hibernate文档<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />Hibernate文档处处都是持久层设计的经验和最佳实践。Hibernate文档准确的来说，绝大部分内容都在讲对象的持久层设计，而不是简单的Hibernate使用。<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />（</span><span style="color: #000000">2</span><span style="color: #000000">）学习要点<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;所以学习Hibernate，主要是在学习持久层的设计模式，如果你把Hibernate文档都看完了，还整天只会提那些&nbsp;Hibernate的配置问题，Hibernate的类调用问题，我觉得这样的人还没有真正的入门，算是白学了<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;在学习Hibernate的时候即集中所有精力来理解Hibernate的运行原理，集中精力来掌握持久层设计应该把握的原则和技巧，这些才对我是最重用的东西</span><span style="color: #000000">----</span><span style="color: #000000">而如果在学习Hibernate时间，主要侧重于怎么配置，用工具怎么生成hbm文件，如果你把重点放在这里，基本上等于白学了Hibernate。<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;因为，如果这样进行学习，学习完Hibernate，肯定会对JDBC的编程也提高了一大截，更不要说对于J2EE架构的持久层的框架设计，基本上是了然于胸了，即使将来换了API，不用Hibernate的，改用JDO，Castor什么的，这些经验一样照用。<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />（</span><span style="color: #000000">3</span><span style="color: #000000">）Hibernate的精华：在于无与伦比的灵巧的对象持久层设计<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;这些持久层设计经验不会因为你不用Hibernate而丧失掉，我自己学习Hibernate，已经明显感觉到对持久层设计能力已经长了很多经验值了，这些经验甚至不光可以用在Java上，用在.net上也是一样。<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;因为，不管JDO也好，Hibernate也好，TopLink也好，CocoBase也好，还是Castor，还是什么Torque，OJB，软件的使用和配置方法可以各异，但本质上都是ORM，都是对JDBC的对象持久层封装，所以万变不离其宗。</span></span></div>
<p>&nbsp;</p>
<p>&nbsp;(比较全面的介绍)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="http://feelingsea.blog.hexun.com/7294376_d.html">http://feelingsea.blog.hexun.com/7294376_d.html</a>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img id="Code_Closed_Image_090826" onclick="this.style.display='none'; Code_Closed_Text_090826.style.display='none'; Code_Open_Image_090826.style.display='inline'; Code_Open_Text_090826.style.display='inline';" height="16" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" width="11" align="top" /><img id="Code_Open_Image_090826" style="display: none" onclick="this.style.display='none'; Code_Open_Text_090826.style.display='none'; Code_Closed_Image_090826.style.display='inline'; Code_Closed_Text_090826.style.display='inline';" height="16" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" width="11" align="top" /><span id="Code_Closed_Text_090826" style="border-right: #808080 1px solid; border-top: #808080 1px solid; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">摘要</span><span id="Code_Open_Text_090826" style="display: none"><br />
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">16</span><span style="color: #000000">、一个重要的术语：Type<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />（</span><span style="color: #000000">1</span><span style="color: #000000">）一个Type对象能将一个Java类型映射到数据库中一个表的字段中<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;Hibernate的设计者们发明了一个术语：Type，它在整个构架中是一个非常基础、有着强大功能的元素。一个Type对象能将一个Java类型映射到数据库中一个表的字段中去（实际上，它可以映射到表的多个字段中去）。<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000">&lt;</span><span style="color: #000000">hibernate</span><span style="color: #000000">-</span><span style="color: #000000">mapping</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;name</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">Event</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;table</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">EVENTS</span><span style="color: #000000">"</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">id&nbsp;name</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">id</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;column</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">EVENT_ID</span><span style="color: #000000">"</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">generator&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">increment</span><span style="color: #000000">"</span><span style="color: #000000">/&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;/</span><span style="color: #000000">id</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">property&nbsp;name</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">date</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;type</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">timestamp</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;column</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">EVENT_DATE</span><span style="color: #000000">"</span><span style="color: #000000">/&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">property&nbsp;name</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">title</span><span style="color: #000000">"</span><span style="color: #000000">/&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;/</span><span style="color: #0000ff">class</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000">&lt;/</span><span style="color: #000000">hibernate</span><span style="color: #000000">-</span><span style="color: #000000">mapping</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;它是Hibernate&nbsp;mapping&nbsp;types，并不像我们假想的那样，是Java&nbsp;data&nbsp;type，&nbsp;同时也不是SQL&nbsp;database&nbsp;type。这些类型被称作Hibernate&nbsp;mapping&nbsp;types，它们把数据类型从Java转换到SQL&nbsp;data&nbsp;types。<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;持久类的所有属性都对应一个type，这种设计思想使用Hibernate有着高度的灵活性和扩展性。<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />（</span><span style="color: #000000">2</span><span style="color: #000000">）关于缺省的type类型<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;如果映射的参数没有设置type类型，Hibernate也将尝试去确定正确的类型转换和它的映射类型。在某些情况下这个自动检测（在Java&nbsp;class上使用反射机制）不会产生你所期待或者需要的缺省值</span><span style="color: #000000">----</span><span style="color: #000000">因此，最好我们来设定其类型。<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;上面的例子是关于date属性。Hibernate无法知道这个属性应该被映射成下面这些类型中的哪一个：&nbsp;SQL&nbsp;date，timestamp，time。&nbsp;我们通过声明属性映射timestamp来表示我们希望保存所有的关于日期和时间的信息。</span></span></div>
</p>
<p>&nbsp;</p>
java，hibernate，标准sql数据类型之间的对应表&nbsp;&nbsp;&nbsp;&nbsp;<a href="http://hi.baidu.com/sunjoe/blog/item/aa1ddabf07c5380f19d81feb.html" target="_blank">http://hi.baidu.com/sunjoe/blog/item/aa1ddabf07c5380f19d81feb.html</a>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img id="Code_Closed_Image_191512" onclick="this.style.display='none'; Code_Closed_Text_191512.style.display='none'; Code_Open_Image_191512.style.display='inline'; Code_Open_Text_191512.style.display='inline';" height="16" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" width="11" align="top" /><img id="Code_Open_Image_191512" style="display: none" onclick="this.style.display='none'; Code_Open_Text_191512.style.display='none'; Code_Closed_Image_191512.style.display='inline'; Code_Closed_Text_191512.style.display='inline';" height="16" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" width="11" align="top" /><span id="Code_Closed_Text_191512" style="border-right: #808080 1px solid; border-top: #808080 1px solid; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">摘要</span><span id="Code_Open_Text_191512" style="display: none"><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />java数据类型，hibernate数据类型，标准sql数据类型之间的对应表<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />Java数据类型&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Hibernate数据类型&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;标准SQL数据类型<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />(PS:对于不同的DB可能有所差异)&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">byte</span><span style="color: #000000">、java.lang.Byte&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">byte&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&nbsp;TINYINT&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">short</span><span style="color: #000000">、java.lang.Short&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">short</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SMALLINT&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">int</span><span style="color: #000000">、java.lang.Integer&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;integer&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;INGEGER&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">long</span><span style="color: #000000">、java.lang.Long&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">long&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&nbsp;BIGINT&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">float</span><span style="color: #000000">、java.lang.Float&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">float&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&nbsp;FLOAT&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">double</span><span style="color: #000000">、java.lang.Double&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">double&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">DOUBLE&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />java.math.BigDecimal&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;big_decimal&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NUMERIC&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">char</span><span style="color: #000000">、java.lang.Character&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;character&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CHAR(</span><span style="color: #000000">1</span><span style="color: #000000">)&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">boolean</span><span style="color: #000000">、java.lang.Boolean&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">boolean&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&nbsp;BIT&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />java.lang.String&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;string&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;VARCHAR&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">boolean</span><span style="color: #000000">、java.lang.Boolean&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;yes_no&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CHAR(</span><span style="color: #000000">1</span><span style="color: #000000">)(</span><span style="color: #000000">'</span><span style="color: #000000">Y</span><span style="color: #000000">'</span><span style="color: #000000">或</span><span style="color: #000000">'</span><span style="color: #000000">N</span><span style="color: #000000">'</span><span style="color: #000000">)&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">boolean</span><span style="color: #000000">、java.lang.Boolean&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;true_false&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CHAR(</span><span style="color: #000000">1</span><span style="color: #000000">)(</span><span style="color: #000000">'</span><span style="color: #000000">Y</span><span style="color: #000000">'</span><span style="color: #000000">或</span><span style="color: #000000">'</span><span style="color: #000000">N</span><span style="color: #000000">'</span><span style="color: #000000">)&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />java.util.Date、java.sql.Date&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;date&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DATE&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />java.util.Date、java.sql.Time&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;time&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TIME&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />java.util.Date、java.sql.Timestamp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;timestamp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TIMESTAMP&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />java.util.Calendar&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;calendarTIMES&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TAMP&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />java.util.Calendar&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;calendar_date&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DATE&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">byte</span><span style="color: #000000">[]&nbsp;binary&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;VARBINARY、&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BLOB&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />java.lang.String&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;text&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CLOB&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />java.io.Serializable&nbsp;serializable&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;VARBINARY、&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BLOB&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />java.sql.Clob&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;clob&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CLOB&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />java.sql.Blob&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;blob&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BLOB&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />java.lang.Class&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;VARCHAR&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />java.util.Locale&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;locale&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;VARCHAR&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />java.util.TimeZone&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;timezone&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;VARCHAR&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />java.util.Currency&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;currency&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;VARCHAR&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span></span></div>
<br />
<br />
<a href="http://topic.csdn.net/u/20080725/14/239ee1ee-c1c7-4489-b752-22e884476b61.html?1390072451" target="_blank">Hibernate 3.2&nbsp;&nbsp;&nbsp; Integer --&gt; Long</a>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img id="Code_Closed_Image_220711" onclick="this.style.display='none'; Code_Closed_Text_220711.style.display='none'; Code_Open_Image_220711.style.display='inline'; Code_Open_Text_220711.style.display='inline';" height="16" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" width="11" align="top" /><img id="Code_Open_Image_220711" style="display: none" onclick="this.style.display='none'; Code_Open_Text_220711.style.display='none'; Code_Closed_Image_220711.style.display='inline'; Code_Closed_Text_220711.style.display='inline';" height="16" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" width="11" align="top" /><span id="Code_Closed_Text_220711" style="border-right: #808080 1px solid; border-top: #808080 1px solid; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">摘要 </span><span id="Code_Open_Text_220711" style="display: none"><br />
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">关于在Hibernate里使用select&nbsp;count(</span><span style="color: #000000">*</span><span style="color: #000000">)&nbsp;返回值的问题说明&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />由于我使用的是Hibernate&nbsp;</span><span style="color: #000000">3</span><span style="color: #000000">.2版本，经确认，这个版本已经把以前返回&nbsp;Integer的改成了&nbsp;Long,&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />因为JPA里面的返回值规定是Long,&nbsp;Hibernate为了兼容这个，所以修改了返回值。&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />如果你从Hibernate&nbsp;</span><span style="color: #000000">3.0</span><span style="color: #000000">.x</span><span style="color: #000000">/</span><span style="color: #000000">3.1</span><span style="color: #000000">.x升级到最新的3.2版，一定要注意，</span><span style="color: #000000">3</span><span style="color: #000000">.2版的很多sql函数如count(),&nbsp;sum()的唯一返回值已经从Integer变为Long，如果不升级代码，会得到一个ClassCastException。&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />这个变化主要是为了兼容JPA，可以在hibernate.org的最新文档中找到说明。&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />Hibernate&nbsp;Team也提供了一个与原来兼容的解决方案：&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;Configuration&nbsp;classicCfg&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Configuration();&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;classicCfg.addSqlFunction(&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">count</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;ClassicCountFunction());&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;classicCfg.addSqlFunction(&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">avg</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;ClassicAvgFunction());&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;classicCfg.addSqlFunction(&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">sum</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;ClassicSumFunction());&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;SessionFactory&nbsp;classicSf&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;classicCfg.buildSessionFactory();&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span></span></div>
<img src ="http://www.blogjava.net/kiant/aggbug/214458.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kiant/" target="_blank">黄小二</a> 2008-07-12 18:05 <a href="http://www.blogjava.net/kiant/articles/214458.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>