﻿<?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-一只灰机</title><link>http://www.blogjava.net/noaso/</link><description>蓝色</description><language>zh-cn</language><lastBuildDate>Sun, 12 Apr 2026 06:03:20 GMT</lastBuildDate><pubDate>Sun, 12 Apr 2026 06:03:20 GMT</pubDate><ttl>60</ttl><item><title>要读的书</title><link>http://www.blogjava.net/noaso/archive/2010/12/01/339472.html</link><dc:creator>noaso</dc:creator><author>noaso</author><pubDate>Wed, 01 Dec 2010 02:19:00 GMT</pubDate><guid>http://www.blogjava.net/noaso/archive/2010/12/01/339472.html</guid><wfw:comment>http://www.blogjava.net/noaso/comments/339472.html</wfw:comment><comments>http://www.blogjava.net/noaso/archive/2010/12/01/339472.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/noaso/comments/commentRss/339472.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/noaso/services/trackbacks/339472.html</trackback:ping><description><![CDATA[一、基础类<br />
1、《Thinking in java》，入门第一位是建立正确的概念。<br />
2、《Core Java》，我没系统读过，这本书更贴近实践，更多API的介绍，同样，更新也更频繁。<br />
<br />
二、进阶类<br />
1、《Effective Java》，在熟悉语法、API之后，你需要知道最佳实践和陷阱，没有比这本更好的。<br />
2、《<span class="pl2">Java Puzzlers》，通过谜题介绍一些你可能没有注意到的边角料，作为趣味读物也不错<br />
3、《深入Java虚拟机》，翻译一般，但不可不读，最好结合最新的JVM规范来读。<br />
<br />
三、特定领域<br />
1、网络编程：<br />
（1）</span> O'Reilly的《Java nio》，很多人都推荐，我个人觉的一般，基本上只是个API更详细的说明文档,O'reilly的java系列很多都是这样。<br />
（2）我更推荐这本《Fundamental networking in java》，由浅入深教你怎么做java网络编程，并且介绍很多背景知识，甚至介绍了各种最佳实践、网络编程模型以及Java socket在不同平台之间的差异等等。<br />
<br />
2、并发编程：<br />
（1）《<span class="pl2">Java Concurrency in Practic》，并发领域必读经典。<br />
（2）《Java并发编程：设计原则与模式》，同样是Doug lea的作品。<br />
（3) 《java threads》，入门读物。<br />
<br />
3、web编程，这块我许久未接触了，就不推荐了，有兴趣的朋友可以补充下。<br />
<br />
四、模式与设计<br />
<br />
1、《设计模式》，GOF的经典。<br />
2、《设计模式精解》，应该有最新版，个人认为更适合入门。<br />
3、《Head first设计模式》，更轻松的入门读物。<br />
4、《企业应用架构模式》<br />
5、《分析模式——可复用对象模型》<br />
6、《面向模式的软件体系结构》，国内貌似翻译了3卷，绝对经典，可惜翻译较差。<br />
7、《重构——改善既有代码设计》,想写好代码必读。<br />
8、《重构与模式》，给我印象很深的 xml构建的例子，在我的代码里应用到了。<br />
<br />
五、方法论<br />
1、《敏捷软件开发》<br />
2、《测试驱动开发》，你不一定要TDD，但是你一定要学会做单元测试。<br />
3、《Agile Java》，也可以作为java入门读物。<br />
4、《快速软件开发》<br />
5、《面向对象分析与设计》，OO设计必读。<br />
6、《Unix编程艺术》，打开你的眼界。<br />
<br />
六、Java之外<br />
0、《代码大全》，编程的百科全书，必读。<br />
1、《unix网络编程》，学习网络编程必读书。<br />
2、《C++网络编程》上下两卷，介绍ACE的，但是其中对各种模式运用的介绍非常值的一读。<br />
3、《Joel说软件》，编程文化<br />
4、《人月神话》、《人件》<br />
5、《卓有成效的程序员》，给我很大启发的一本书。<br />
6、《程序员修炼之道》<br />
7、《计算机程序的构造与解释》，必读<br />
8、《算法导论》，可以作为参考书<br />
9、《深入理解计算机系统》<br />
10、《编译原理》龙书，最新版用java解释，我没有读完，顺便提下。<br />
<br />
</span>
<img src ="http://www.blogjava.net/noaso/aggbug/339472.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/noaso/" target="_blank">noaso</a> 2010-12-01 10:19 <a href="http://www.blogjava.net/noaso/archive/2010/12/01/339472.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>FCKeditor api 详解</title><link>http://www.blogjava.net/noaso/archive/2010/11/24/338874.html</link><dc:creator>noaso</dc:creator><author>noaso</author><pubDate>Wed, 24 Nov 2010 00:42:00 GMT</pubDate><guid>http://www.blogjava.net/noaso/archive/2010/11/24/338874.html</guid><wfw:comment>http://www.blogjava.net/noaso/comments/338874.html</wfw:comment><comments>http://www.blogjava.net/noaso/archive/2010/11/24/338874.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/noaso/comments/commentRss/338874.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/noaso/services/trackbacks/338874.html</trackback:ping><description><![CDATA[<div class="cnt" id="blog_text">
<div class="cnt">
<p><font style="background-color: #c8e7cc">利用Javascript取和设FCKeditor值也是非常容易的，如下：</font></p>
<p><font style="background-color: #c8e7cc">// 获取编辑器中HTML内容<br />
function getEditorHTMLContents(EditorName) { <br />
&nbsp;&nbsp;&nbsp; var oEditor = FCKeditorAPI.GetInstance(EditorName); <br />
&nbsp;&nbsp;&nbsp; return(oEditor.GetXHTML(true)); <br />
}</font></p>
<p><font style="background-color: #c8e7cc">// 获取编辑器中文字内容<br />
function getEditorTextContents(EditorName) { <br />
&nbsp;&nbsp;&nbsp; var oEditor = FCKeditorAPI.GetInstance(EditorName); <br />
&nbsp;&nbsp;&nbsp; return(oEditor.EditorDocument.body.innerText); <br />
}</font></p>
<p><font style="background-color: #c8e7cc">// 设置编辑器中内容<br />
function SetEditorContents(EditorName, ContentStr) { <br />
&nbsp;&nbsp;&nbsp; var oEditor = FCKeditorAPI.GetInstance(EditorName) ; <br />
&nbsp;&nbsp;&nbsp; oEditor.SetHTML(ContentStr) ; <br />
}</font></p>
<p><font style="background-color: #c8e7cc">FCKeditorAPI是FCKeditor加载后注册的一个全局对象，利用它我们就可以完成对编辑器的各种操作。</font></p>
<p><font style="background-color: #c8e7cc">在当前页获得 FCK 编辑器实例：<br />
var Editor = FCKeditorAPI.GetInstance('InstanceName');</font></p>
<p><font style="background-color: #c8e7cc">从 FCK 编辑器的弹出窗口中获得 FCK 编辑器实例：<br />
var Editor = window.parent.InnerDialogLoaded().FCK;</font></p>
<p><font style="background-color: #c8e7cc">从框架页面的子框架中获得其它子框架的 FCK 编辑器实例：<br />
var Editor = window.FrameName.FCKeditorAPI.GetInstance('InstanceName');</font></p>
<p><font style="background-color: #c8e7cc">从页面弹出窗口中获得父窗口的 FCK 编辑器实例： <br />
var Editor = opener.FCKeditorAPI.GetInstance('InstanceName');</font></p>
<p><font style="background-color: #c8e7cc">获得 FCK 编辑器的内容：<br />
oEditor.GetXHTML(formatted); // formatted 为：true|false，表示是否按HTML格式取出<br />
也可用： <br />
oEditor.GetXHTML();</font></p>
<p><font style="background-color: #c8e7cc">设置 FCK 编辑器的内容：<br />
oEditor.SetHTML("content", false); // 第二个参数为：true|false，是否以所见即所得方式设置其内容。此方法常用于"设置初始值"或"表单重置"哦作。</font></p>
<p><font style="background-color: #c8e7cc">插入内容到 FCK 编辑器：<br />
oEditor.InsertHtml("html"); // "html"为HTML文本</font></p>
<p><font style="background-color: #c8e7cc">检查 FCK 编辑器内容是否发生变化：<br />
oEditor.IsDirty();</font></p>
<p><font style="background-color: #c8e7cc">在 FCK 编辑器之外调用 FCK 编辑器工具条命令：<br />
命令列表如下：<br />
DocProps, Templates, Link, Unlink, Anchor, BulletedList, NumberedList, About, Find, Replace, Image, Flash, SpecialChar, Smiley, Table, TableProp, TableCellProp, UniversalKey, Style, FontName, FontSize, FontFormat, Source, Preview, Save, NewPage, PageBreak, TextColor, BGColor, PasteText, PasteWord, TableInsertRow, TableDeleteRows, TableInsertColumn, TableDeleteColumns, TableInsertCell, TableDeleteCells, TableMergeCells, TableSplitCell, TableDelete, Form, Checkbox, Radio, TextField, Textarea, HiddenField, Button, Select, ImageButton, SpellCheck, FitWindow, Undo, Redo</font></p>
<p><font style="background-color: #c8e7cc">使用方法如下：<br />
oEditor.Commands.GetCommand('FitWindow').Execute();</font></p>
<p><font style="background-color: #c8e7cc">= FCKConfig.BasePath + 'plugins/' <br />
// FCKConfig.Plugins.Add( 'placeholder', 'en,it' ) ; </font></p>
<font style="background-color: #c8e7cc">
<p><br />
去掉//后，就相当于把placeholder这个插件功能加上了，fckeditor的插件文件都在/editor/plugins/文件夹下分类按文件夹放置的，对于fckeditor2.0来说，里面有两个文件夹，也就是有两个官方插件，placeholder这个文件夹就是我们刚才加上去的，主要用于多参数或单参数自定义标签的匹配，这个在制作编辑模板时非常管用，要想看具体实例的话，大家可以去下载acms 这个系统查看学习，另一个文件夹tablecommands就是编辑器里的表格编辑用到的了。当然，如果你想制作自己其它用途的插件，那就只要按照 fckeidtor插件的制作规则制作完放置在/editor/plugins/下就行，然后再在fckeidtor.js里再添加 FCKConfig.Plugins.Add('Plugin Name',',lang,lang');就可以了。</p>
<p>第二部分 ，如何让编辑器一打开的时候，编辑工具条不出现，等点&#8220;展开工具栏&#8221;时才出现？Easy，FCKeditor本身提供了这个功能啦，打开fckconfig.js，找到</p>
<p>FCKConfig.ToolbarStartExpanded = true ;<br />
改成<br />
FCKConfig.ToolbarStartExpanded = false ;<br />
就可以啦！</p>
<p>第三部分，使用自己的表情图标，同样打开fckcofnig.js到最底部那一段</p>
<p><br />
FCKConfig.SmileyPath = FCKConfig.BasePath + 'images/smiley/msn/' ;<br />
FCKConfig.SmileyImages = ['regular_smile.gif','sad_smile.gif','wink_smile.gif'] ;<br />
FCKConfig.SmileyColumns = 8 ;<br />
FCKConfig.SmileyWindowWidth&nbsp;&nbsp;&nbsp; = 320 ;<br />
FCKConfig.SmileyWindowHeight = 240 ;</p>
<p>上面这段已经是我修改过的了，为了我发表此文的版面不会被撑得太开，我把FCKConfig.SmileyImages那一行改得只有三个表情图了。</p>
<p>第一行，当然是表情图标路径的设置，第二行是相关表情图标文件名的一个List，第三行是指弹出的表情添加窗口最每行的表情数，下面两个参数是弹出的模态窗口的宽和高喽。</p>
<p>第四部分，文件上传管理部分</p>
<p>此部分可能是大家最为关心的，上一篇文章简单的讲了如何修改来上传文件以及使用fckeidtor2.0才提供的快速上传功能。再我们继续再深层次的讲解上传功能</p>
<p>FCKConfig.LinkBrowser = true ;<br />
FCKConfig.ImageBrowser = true ;<br />
FCKConfig.FlashBrowser = true ;在fckconfig.js找到这三句，这三句不是连着的哦，只是我把他们集中到这儿来了，设置为true的意思就是允许使用fckeditor来浏览服务器端的文件图像以及flash等，这个功能是你插入图片时弹出的窗口上那个&#8220;浏览服务器&#8221;按钮可以体现出来，如果你的编辑器只用来自己用或是只在后台管理用，这个功能无疑很好用，因为他让你很直观地对服务器的文件进行上传操作。但是如果你的系统要面向前台用户或是像blog这样的系统要用的话，这个安全隐患可就大了哦。于是我们把其一律设置为false;如下</p>
<p>FCKConfig.LinkBrowser = false ;<br />
FCKConfig.ImageBrowser = false ;<br />
FCKConfig.FlashBrowser = false ;</p>
<p>这样一来，我们就只有快速上传可用了啊，好！接下来就来修改，同样以asp为范例进行，进入/editor/filemanager/upload/asp/打开config.asp，修改<br />
ConfigUserFilesPath = "/UserFiles/"这个设置是上传文件的总目录，我这里就不动了，你想改自己改了</p>
<p>好，再打开此目录下的upload.asp文件，找到下面这一段</p>
<p><br />
Dim resourceType<br />
If ( Request.QueryString("Type") <br />
&amp;lt;&amp;gt;"" ) Then<br />
resourceType = Request.QueryString("Type")<br />
Else<br />
resourceType = "File"<br />
End If <br />
然后再在其后面添加</p>
<p><br />
ConfigUserFilesPath = ConfigUserFilesPath &amp; resourceType &amp;"/"&amp; Year(Date()) &amp;"/"&amp; Month(Date()) &amp;"/" <br />
这样的话，上传的文件就进入&#8220;/userfiles/文件类型（如image或file或flash)/年/月/&#8221;这样的文件夹下了，这个设置对单用户来用已经足够了，如果你想给多用户系统用，那就这样来改</p>
<p><br />
ConfigUserFilesPath = ConfigUserFilesPath &amp; Session("username") &amp; resourceType &amp;"/"&amp; Year(Date()) &amp;"/"&amp; Month(Date()) &amp;"/" <br />
这样上传的文件就进入&#8220;/userfiles/用户目录/文件类型/年/月/&#8221;下了，当然如果你不想这么安排也可以修改成别的，比如说用户目录再深一层等，这里的Session("username")请根据自己的需要进行修改或换掉。</p>
<p>上传的目录设置完了，但是上传程序还不会自己创建这些文件夹，如果不存在的话，上传不会成功的，那么我们就得根据上面的上传路径的要求进行递归来生成目录了。</p>
<p>找到这一段</p>
<p><br />
Dim sServerDir<br />
sServerDir = Server.MapPath( ConfigUserFilesPath )<br />
If ( Right( sServerDir, 1 ) <br />
&amp;lt;&amp;gt;"\" ) Then<br />
&nbsp;&nbsp;&nbsp; sServerDir = sServerDir &amp; "\"<br />
End If</p>
<p>把它下面的这两行</p>
<p><br />
Dim oFSO<br />
Set oFSO = Server.CreateObject( "Scripting.FileSystemObject" ) <br />
用下面这一段代码来替换</p>
<p><br />
dim arrPath,strTmpPath,intRow<br />
strTmpPath = ""<br />
arrPath = Split(sServerDir, "\") <br />
Dim oFSO<br />
Set oFSO = Server.CreateObject( "Scripting.FileSystemObject" )<br />
for intRow = 0 to Ubound(arrPath)<br />
&nbsp;&nbsp;&nbsp; strTmpPath = strTmpPath &amp; arrPath(intRow) &amp; "\"<br />
&nbsp;&nbsp;&nbsp; if oFSO.folderExists(strTmpPath)=false then<br />
&nbsp;&nbsp;&nbsp;&nbsp; oFSO.CreateFolder(strTmpPath)<br />
&nbsp;&nbsp;&nbsp; end if<br />
next <br />
用这段代码就可以生成你想要的文件夹了，在上传的时候自动生成。</p>
<p>好了，上传文件的修改到现在可以暂时告一段落了，但是，对于中文用户还存在这么个问题，就是fckeditor的文件上传默认是不改名的，同时还不支持中文文件名，这样一来是上传的文件会变成&#8220;.jpg&#8221;这样的无法读的文件，再就是会有重名文件，当然重名这点倒没什么，因为fckeditor会自动改名，会在文件名后加（1）这样来进行标识。但是，我们通常的习惯是让程序自动生成不重复的文件名</p>
<p>在刚才那一段代码的下面紧接着就是<br />
' Get the uploaded file name.<br />
sFileName = oUploader.File( "NewFile" ).Name<br />
看清楚了，这个就是文件名啦，我们来把它改掉，当然得有个生成文件名的函数才行，改成下面这样</p>
<p>'//取得一个不重复的序号<br />
Public Function GetNewID()<br />
dim ranNum<br />
dim dtNow<br />
randomize<br />
dtNow=Now()<br />
ranNum=int(90000*rnd)+10000<br />
GetNewID=year(dtNow) &amp; right("0" &amp; month(dtNow),2) &amp; right("0" &amp; day(dtNow),2) &amp; right("0" &amp; hour(dtNow),2) &amp; right("0" &amp; minute(dtNow),2) &amp; right("0" &amp; second(dtNow),2) &amp; ranNum<br />
End Function</p>
<p>' Get the uploaded file name.<br />
sFileName = GetNewID() &amp;"."&amp; split(oUploader.File( "NewFile" ).Name,".")(1)</p>
<p>这样一来，上传的文件就自动改名生成如20050802122536365.jpg这样的文件名了，是由年月日时分秒以及三位随机数组成的文件名了</p>
<p><br />
利用Javascript取和设FCKeditor值也是非常容易的，如下：</p>
<p>// 获取编辑器中HTML内容<br />
function getEditorHTMLContents(EditorName) { <br />
&nbsp;&nbsp;&nbsp; var oEditor = FCKeditorAPI.GetInstance(EditorName); <br />
&nbsp;&nbsp;&nbsp; return(oEditor.GetXHTML(true)); <br />
}</p>
<p>// 获取编辑器中文字内容<br />
function getEditorTextContents(EditorName) { <br />
&nbsp;&nbsp;&nbsp; var oEditor = FCKeditorAPI.GetInstance(EditorName); <br />
&nbsp;&nbsp;&nbsp; return(oEditor.EditorDocument.body.innerText); <br />
}</p>
<p>// 设置编辑器中内容<br />
function SetEditorContents(EditorName, ContentStr) { <br />
&nbsp;&nbsp;&nbsp; var oEditor = FCKeditorAPI.GetInstance(EditorName) ; <br />
&nbsp;&nbsp;&nbsp; oEditor.SetHTML(ContentStr) ; <br />
}</p>
<p>FCKeditorAPI是FCKeditor加载后注册的一个全局对象，利用它我们就可以完成对编辑器的各种操作。</p>
<p>在当前页获得 FCK 编辑器实例：<br />
var Editor = FCKeditorAPI.GetInstance('InstanceName');</p>
<p>从 FCK 编辑器的弹出窗口中获得 FCK 编辑器实例：<br />
var Editor = window.parent.InnerDialogLoaded().FCK;</p>
<p>从框架页面的子框架中获得其它子框架的 FCK 编辑器实例：<br />
var Editor = window.FrameName.FCKeditorAPI.GetInstance('InstanceName');</p>
<p>从页面弹出窗口中获得父窗口的 FCK 编辑器实例： <br />
var Editor = opener.FCKeditorAPI.GetInstance('InstanceName');</p>
<p>获得 FCK 编辑器的内容：<br />
oEditor.GetXHTML(formatted); // formatted 为：true|false，表示是否按HTML格式取出<br />
也可用： <br />
oEditor.GetXHTML();</p>
<p>设置 FCK 编辑器的内容：<br />
oEditor.SetHTML("content", false); // 第二个参数为：true|false，是否以所见即所得方式设置其内容。此方法常用于"设置初始值"或"表单重置"哦作。</p>
<p>插入内容到 FCK 编辑器：<br />
oEditor.InsertHtml("html"); // "html"为HTML文本</p>
<p>检查 FCK 编辑器内容是否发生变化：<br />
oEditor.IsDirty();</p>
<p>在 FCK 编辑器之外调用 FCK 编辑器工具条命令：<br />
命令列表如下：<br />
DocProps, Templates, Link, Unlink, Anchor, BulletedList, NumberedList, About, Find, Replace, Image, Flash, SpecialChar, Smiley, Table, TableProp, TableCellProp, UniversalKey, Style, FontName, FontSize, FontFormat, Source, Preview, Save, NewPage, PageBreak, TextColor, BGColor, PasteText, PasteWord, TableInsertRow, TableDeleteRows, TableInsertColumn, TableDeleteColumns, TableInsertCell, TableDeleteCells, TableMergeCells, TableSplitCell, TableDelete, Form, Checkbox, Radio, TextField, Textarea, HiddenField, Button, Select, ImageButton, SpellCheck, FitWindow, Undo, Redo</p>
<p>使用方法如下：<br />
oEditor.Commands.GetCommand('FitWindow').Execute();</p>
</font></div>
<br />
</div>
<img src ="http://www.blogjava.net/noaso/aggbug/338874.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/noaso/" target="_blank">noaso</a> 2010-11-24 08:42 <a href="http://www.blogjava.net/noaso/archive/2010/11/24/338874.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate中cascade与inverse属性详解</title><link>http://www.blogjava.net/noaso/archive/2010/11/17/338247.html</link><dc:creator>noaso</dc:creator><author>noaso</author><pubDate>Wed, 17 Nov 2010 05:31:00 GMT</pubDate><guid>http://www.blogjava.net/noaso/archive/2010/11/17/338247.html</guid><wfw:comment>http://www.blogjava.net/noaso/comments/338247.html</wfw:comment><comments>http://www.blogjava.net/noaso/archive/2010/11/17/338247.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/noaso/comments/commentRss/338247.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/noaso/services/trackbacks/338247.html</trackback:ping><description><![CDATA[<div class="postText">
<p><span style="font-size: 14pt;"><span style="font-size: 14pt;"><span style="font-size: 10pt;"><span style="font-size: 12pt;"><span style="font-size: 12pt;"><span style="font-size: 10pt;">关于Hibernate中 cascade 与
inverse 的理解。</span></span></span></span></span></span></p>
<p><span style="font-size: 14pt;"><span style="font-size: 14pt;"><span style="font-size: 10pt;"><span style="font-size: 12pt;"><span style="font-size: 12pt;"><span style="font-size: 10pt;">您买的Hibernate书是哪一本呢？
孙卫琴的精通Hibernate，还是
深入浅出Hibernate还是那本。。。<br />
我是两本都买了，总体来说还可以，但是，有的地方讲的比较书面化，比如inverse这属性。</span></span></span></span></span></span></p>
<p><span style="font-size: 14pt;"><span style="font-size: 14pt;"><span style="font-size: 10pt;"><span style="font-size: 12pt;"><span style="font-size: 12pt;"><span style="font-size: 10pt;">在学习Hibernate的过程中最不好理解的就是这两个属性了。<br />
(我当初学习Hibernate的时候，发现网上介绍这两个属性的文章倒是不少，但是，居然有好多都是转帖。。。还有的就是
照书搬~~-_-!!!)。。。</span></span></span></span></span></span></p>
<p><span style="font-size: 14pt;"><span style="font-size: 14pt;"><span style="font-size: 10pt;"><span style="font-size: 12pt;"><span style="font-size: 12pt;"><span style="font-size: 10pt;">据个例子：书上说inverse=false时，由主控方维持关系。。。<br />
由于我也是初学者。。。再加上语文水平偏低。。。不理解&#8220;维持关系是啥意思&#8221;囧~</span></span></span></span></span></span></p>
<p><span style="font-size: 14pt;"><span style="font-size: 14pt;"><span style="font-size: 10pt;"><span style="font-size: 12pt;"><span style="font-size: 12pt;"><span style="font-size: 10pt;">提示：<br />
(1)如果：您不了解Hibernate的one-to-many或many-to-one的概念。</span></span></span></span></span></span></p>
<p><span style="font-size: 14pt;"><span style="font-size: 14pt;"><span style="font-size: 10pt;"><span style="font-size: 12pt;"><span style="font-size: 12pt;"><span style="font-size: 10pt;">(2)如果：你不了解Hibernate的&#8220;自由态&#8221;&#8220;持久态&#8221;&#8220;游离态&#8221;的概念。</span></span></span></span></span></span></p>
<p><span style="font-size: 14pt;"><span style="font-size: 14pt;"><span style="font-size: 10pt;"><span style="font-size: 12pt;"><span style="font-size: 12pt;"><span style="font-size: 10pt;">(3)如果：您不了解Hibernate中的&#8220;脏数据&#8221;的概念。</span></span></span></span></span></span></p>
<p><span style="font-size: 14pt;"><span style="font-size: 14pt;"><span style="font-size: 10pt;"><span style="font-size: 12pt;"><span style="font-size: 12pt;"><span style="font-size: 10pt;">(4)如果：您对Hibernate中Session缓存，没有初步了解的话。<br />
(在Hibernate中调用save进行存储数据的时候,并不是马上就对数据库进行insert操作，而是会将其&#8220;数据对象(vo)&#8221;纳入Hibernate的Session缓存。)</span></span></span></span></span></span></p>
<p><span style="font-size: 14pt;"><span style="font-size: 14pt;"><span style="font-size: 10pt;"><span style="font-size: 12pt;"><span style="font-size: 12pt;"><span style="font-size: 10pt;">在上面的4条提示中，如果您对其中的某一条，不是很清楚的话。希望请先了解有关知识。<br />
否则，可能您将
&#8220;无法或很难&#8221;理解 cascade 或 inverse 这2个属性。</span></span></span></span></span></span></p>
<p><span style="font-size: 14pt;"><span style="font-size: 14pt;"><span style="font-size: 10pt;"><span style="font-size: 12pt;"><span style="font-size: 12pt;"><span style="font-size: 10pt;">首相，cascade 与 inverse
这两个属性，其实是完全不同的两个东西，想要了解他们各自的&#8220;用途与区别&#8221;，详见如下介绍：</span></span></span></span></span></span></p>
<p><span style="font-size: 14pt;"><span style="font-size: 14pt;"><span style="font-size: 10pt;"><span style="font-size: 12pt;"><span style="font-size: 12pt;"><span style="font-size: 10pt;">这里有两个表:</span></span></span></span></span></span></p>
<p><span style="font-size: 14pt;"><span style="font-size: 14pt;"><span style="font-size: 10pt;"><span style="font-size: 12pt;"><span style="font-size: 12pt;"><span style="font-size: 10pt;">（1）class&nbsp;&nbsp;
(班级表)<br />
相应字段：<br />
cid&nbsp;&nbsp;&nbsp; varchar(32) 主键 not-null (班级id)<br />
cname
varchar(16)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; not-null (班级名称)&nbsp;&nbsp; <br />
<br />
（2）student (学生表)<br />
相应字段：<br />
sid&nbsp;&nbsp;&nbsp;
varchar(32) 主键 not-null (学生id)<br />
sname varchar(16)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; not-null
(学生姓名)<br />
class_id varchar(32)&nbsp;&nbsp; not-null
(学生所属班级)</span></span></span></span></span></span></p>
<p><span style="font-size: 14pt;"><span style="font-size: 14pt;"><span style="font-size: 10pt;"><span style="font-size: 12pt;"><span style="font-size: 12pt;"><span style="font-size: 10pt;">一个班级(class)对应多个学生(student)，所以班级表(class)就是&#8220;one-to-many&#8221;端<br />
反之student就是many-to-one</span></span></span></span></span></span></p>
<p><span style="font-size: 14pt;"><span style="font-size: 14pt;"><span style="font-size: 10pt;"><span style="font-size: 12pt;"><span style="font-size: 12pt;"><span style="font-size: 10pt;">//--------Class类的代码--------<br />
public class Class
implements.....<br />
{<br />
private cId = "";<br />
private cName = "";<br />
private
students = java.util.HashMap();<br />
// 省略对应的 geter
setter<br />
}<br />
//--------Class.hbm.xml--------<br />
&lt;hibernate-mapping&gt;<br />
&lt;class
name="lcx.vo.Class" table="class"<br />
&nbsp;&nbsp; catalog="demo"&gt;<br />
&nbsp;&nbsp; &lt;id
name="cid" type="java.lang.String"&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;column name="cid" length="32"
/&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;generator class="uuid.hex" /&gt;<br />
&nbsp;&nbsp; &lt;/id&gt;<br />
&nbsp;&nbsp;
&lt;property name="name" type="java.lang.String"&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;column
name="cname" length="16" not-null="true" /&gt;<br />
&nbsp;&nbsp;
&lt;/property&gt;<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp; &lt;set name="students" table="student"
cascade="save-update"&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;key column="class" /&gt;<br />
&nbsp;&nbsp;&nbsp;
&lt;one-to-many class="lcx.vo.Student" /&gt;<br />
&nbsp;&nbsp; &lt;/set&gt;
<br />
&lt;/class&gt;<br />
&lt;/hibernate-mapping&gt;</span></span></span></span></span></span></p>
<p><span style="font-size: 14pt;"><span style="font-size: 14pt;"><span style="font-size: 10pt;"><span style="font-size: 12pt;"><span style="font-size: 12pt;"><span style="font-size: 10pt;">//--------Student类的代码;*******<br />
public class Student
implements.....<br />
{<br />
private sId = "";<br />
private sName = "";<br />
private
Class class = null;<br />
// 省略对应的 geter setter<br />
}<br />
//
Student.hbm.xml<br />
&lt;hibernate-mapping&gt;<br />
&lt;class name="lcx.vo.Student"
table="student" catalog="demo"&gt;<br />
&nbsp;&nbsp; &lt;id name="cid"
type="java.lang.String"&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;column name="sid" length="32"
/&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;generator class="uuid.hex" /&gt;<br />
&nbsp;&nbsp; &lt;/id&gt;<br />
&nbsp;&nbsp;
&lt;many-to-one name="class" <br />
&nbsp;&nbsp;&nbsp; class="lcx.vo.Class"<br />
&nbsp;&nbsp;&nbsp;
column="class_id" <br />
&nbsp;&nbsp;&nbsp; not-null="true" <br />
&nbsp;&nbsp;
/&gt;&nbsp;&nbsp;&nbsp;<br />
&lt;/class&gt;<br />
&lt;/hibernate-mapping&gt;</span></span></span></span></span></span></p>
<p><span style="font-size: 14pt;"><span style="font-size: 14pt;"><span style="font-size: 10pt;"><span style="font-size: 12pt;"><span style="font-size: 12pt;"><span style="font-size: 10pt;">（一） cascade
的介绍：<br />
当Hibernate持久化一个&#8220;临时对象(也叫自由态对象)&#8221;时，在默认的情况下(即：没有设置cascade属性或cascade=none时)，Hibernate不会自动&#8220;持久化他所关联&#8221;的其他临时对象。</span></span></span></span></span></span></p>
<p><span style="font-size: 14pt;"><span style="font-size: 14pt;"><span style="font-size: 10pt;"><span style="font-size: 12pt;"><span style="font-size: 12pt;"><span style="font-size: 10pt;">上面这些话是什么意思呢？ 什么叫不会自动
&#8220;持久化&#8221;关联的临时对象呢？</span></span></span></span></span></span></p>
<p><span style="font-size: 14pt;"><span style="font-size: 14pt;"><span style="font-size: 10pt;"><span style="font-size: 12pt;"><span style="font-size: 12pt;"><span style="font-size: 10pt;">看如下代码：</span></span></span></span></span></span></p>
<p><span style="font-size: 14pt;"><span style="font-size: 14pt;"><span style="font-size: 10pt;"><span style="font-size: 12pt;"><span style="font-size: 12pt;"><span style="font-size: 10pt;">// 创建一个 临时对象(也叫自由态对象)
<br />
// 也就是说这个 class 没有被Hibernate纳入Session缓存管理。<br />
Class class = new
Class();<br />
//class.id
为自动生成<br />
class.setName("一年级1班");</span></span></span></span></span></span></p>
<p><span style="font-size: 14pt;"><span style="font-size: 14pt;"><span style="font-size: 10pt;"><span style="font-size: 12pt;"><span style="font-size: 12pt;"><span style="font-size: 10pt;">Student stu = new
Student();<br />
//student.id
为自动生成<br />
stu.setName("小白兔");<br />
stu.setClass(class);</span></span></span></span></span></span></p>
<p><span style="font-size: 14pt;"><span style="font-size: 14pt;"><span style="font-size: 10pt;"><span style="font-size: 12pt;"><span style="font-size: 12pt;"><span style="font-size: 10pt;">//
关键就是这里。。。<br />
class.getStudents().add(stu);</span></span></span></span></span></span></p>
<p><span style="font-size: 14pt;"><span style="font-size: 14pt;"><span style="font-size: 10pt;"><span style="font-size: 12pt;"><span style="font-size: 12pt;"><span style="font-size: 10pt;">session.save(class);<br />
//
提交</span></span></span></span></span></span></p>
<p><span style="font-size: 14pt;"><span style="font-size: 14pt;"><span style="font-size: 10pt;"><span style="font-size: 12pt;"><span style="font-size: 12pt;"><span style="font-size: 10pt;">// 注意:
Class.hbm.xml文件中,cascade="save-update"并且也没有设置inverse属性,也就是说inverse=false;<br />
//
此时如果你开启了Hibernate的显示HQL语句功能，那么控制台将会显示如下3条HQL：</span></span></span></span></span></span></p>
<p><span style="font-size: 14pt;"><span style="font-size: 14pt;"><span style="font-size: 10pt;"><span style="font-size: 12pt;"><span style="font-size: 12pt;"><span style="font-size: 10pt;">//----------------------------------------********<br />
insert
into demo.class (cid, cname) values (66666666666666666666666666666666,
一年级1班)<br />
insert into demo.student (sid,sname,class_id) values
(8888888888888888811cb2e04c888888, 小白兔,
66666666666666666666666666666666)<br />
update demo.student set
class_id=66666666666666666666666666666666 where
sid=8888888888888888811cb2e04c888888<br />
//----------------------------------------********</span></span></span></span></span></span></p>
<p><span style="font-size: 14pt;"><span style="font-size: 14pt;"><span style="font-size: 10pt;"><span style="font-size: 12pt;"><span style="font-size: 12pt;"><span style="font-size: 10pt;">那么为什么会出现，这3条HQL语句呢，我们来一一分析一下：</span></span></span></span></span></span></p>
<p><span style="font-size: 14pt;"><span style="font-size: 14pt;"><span style="font-size: 10pt;"><span style="font-size: 12pt;"><span style="font-size: 12pt;"><span style="font-size: 10pt;">第1条HQL语句:<br />
其实第一条HQL比较好理解，<br />
当我们调用 session.save(class)
后，在Hibernate进行提交的时候，<br />
会发现&#8220;有&#8221;一条&#8220;新&#8221;的数据要插入(insert)，所以就往class表中,插入了这条新的class记录。</span></span></span></span></span></span></p>
<p><span style="font-size: 14pt;"><span style="font-size: 14pt;"><span style="font-size: 10pt;"><span style="font-size: 12pt;"><span style="font-size: 12pt;"><span style="font-size: 10pt;">第2条HQL语句：<br />
注意问题就在这里：<br />
这里为什么又出现了一条insert语句呢？而且还是向student表中插入数据。<br />
我们在上面的代码中，并没有编写类似&#8220;session.save(student)&#8221;这样的语句啊。<br />
这是为什么呢？<br />
其实原因，是这么回事：因为我们在class端，设置了"级联更新"(即:cascade="save-update")，<br />
也就是说，当Hibernate在向class表中插入&#8220;新&#8221;对象记录时，会检查&#8220;Class对象&#8221;所关联的属性(就是&lt;set&gt;对应的属性)，是否发生过变化，如果发生了变化，就按照&#8220;级联属性(cascade)&#8221;所设定的内容<br />
进行操作。</span></span></span></span></span></span></p>
<p><span style="font-size: 14pt;"><span style="font-size: 14pt;"><span style="font-size: 10pt;"><span style="font-size: 12pt;"><span style="font-size: 12pt;"><span style="font-size: 10pt;">上面讲的这句话到底是什么意思呢？<br />
用你们&#8220;人&#8221;话说，就是：<br />
因为调用了
class.getStudents().add(stu);<br />
所以，在Hibernate在进行插入
class对象的时候，发现class对象，所关联的集合中，有一条<br />
&#8220;自由态&#8221;的对象，而又因为class端设置了&#8220;级联属性cascade&#8221;，所以，在插入这条
&#8220;新class对象&#8221;时，也一同把他内部的那些，还属于&#8220;自由态&#8221;的其他对象，也一同插入到，他们所对应的表中去了。</span></span></span></span></span></span></p>
<p><span style="font-size: 14pt;"><span style="font-size: 14pt;"><span style="font-size: 10pt;"><span style="font-size: 12pt;"><span style="font-size: 12pt;"><span style="font-size: 10pt;">还是不明白的话。。。可以看看。孙卫琴的《精通Hibernate》，在书上的第149页有。<br />
但是关于inverse的介绍。。。写的就有些书面化了，如果语文不好的话。。。就难懂咯~</span></span></span></span></span></span></p>
<p><span style="font-size: 14pt;"><span style="font-size: 14pt;"><span style="font-size: 10pt;"><span style="font-size: 12pt;"><span style="font-size: 12pt;"><span style="font-size: 10pt;">第3条HQL语句：<br />
第三条HQL语句是一条update语句，是不是觉得，很莫名其妙。。。。<br />
Hibernate大脑进水了吧，怎么吃饱了撑得，重复更新记录啊啊啊啊啊<br />
假如：我们把
class端的配置文档中的
invser属性设置为true(即：inverse=true)<br />
在执行上面的程序，发现，就变成2条insert语句啦。。。。。(update没啦。。。)<br />
看来第三条的update语句和inverse有着密切的关系（他两有一腿~）。</span></span></span></span></span></span></p>
<p><span style="font-size: 14pt;"><span style="font-size: 14pt;"><span style="font-size: 10pt;"><span style="font-size: 12pt;"><span style="font-size: 12pt;"><span style="font-size: 10pt;">所以我们下边，就来介绍一下inverse属性:</span></span></span></span></span></span></p>
<p><span style="font-size: 14pt;"><span style="font-size: 14pt;"><span style="font-size: 10pt;"><span style="font-size: 12pt;"><span style="font-size: 12pt;"><span style="font-size: 10pt;">当调用
Class.getStudents().add(stu)方法，进行添加操作时， <br />
(即：向 "这个Class对象"所属的&#8220;集合
(也就是调用getStudents方法所返回的那个Set集合)&#8221;中添加一个Student(即
add(stu))，也就是说，这个&#8220;新&#8221;添加的Student对象(stu)，
<br />
他的Student.class_id字段&#8220;必须&#8221;，要等于&#8220;被添加方Class&#8221;的主键(即:Class.cid)。
<br />
从&#8220;数据库&#8221;层面来讲，也就是说，这个&#8220;新&#8221;添加的&#8220;Student&#8221;的class_id字段，必须要与&#8220;Class&#8221;的cid字段，存在"主外键关联"。)
</span></span></span></span></span></span></p>
<p><span style="font-size: 14pt;"><span style="font-size: 14pt;"><span style="font-size: 10pt;"><span style="font-size: 12pt;"><span style="font-size: 12pt;"><span style="font-size: 10pt;">正因为如此：所以Hibernate&#8220;怕&#8221; 在进行
"Class.getStudents().add(stu)" 这样的操作时， <br />
出现意外情况(如:
stu.getClass=null，即：stu没有所属班级)，<br />
即&#8220;添加方&#8221;(Student)与&#8220;被添加方&#8221;(Class)，存在&#8220;外键&#8221;不一致的情况发生。
<br />
所以就出现了 那条多余的update语句。即：one-to-many（Class端）主动去维护Child.Class_id
<br />
所以就是说，Hibernate怕出错，就给你多执行一次无用的更新语句，以保证 add 到
Class&#8220;集合&#8221;中的所有Student<br />
都是要与Class有外键关联的。</span></span></span></span></span></span></p>
<p><span style="font-size: 14pt;"><span style="font-size: 14pt;"><span style="font-size: 10pt;"><span style="font-size: 12pt;"><span style="font-size: 12pt;"><span style="font-size: 10pt;">用普通话说就是:<br />
一年1班.getStudents().add(小白兔);<br />
一年1班.getStudents().add(大白兔);</span></span></span></span></span></span></p>
<p><span style="font-size: 14pt;"><span style="font-size: 14pt;"><span style="font-size: 10pt;"><span style="font-size: 12pt;"><span style="font-size: 12pt;"><span style="font-size: 10pt;">也就是说现在不管是 小白兔 还是 大白兔
<br />
如果他们，目前还没有自己的班级的话，<br />
一年1班的班主任就会主动邀请他们成为一年1班的同学啦~。</span></span></span></span></span></span></p>
<p><span style="font-size: 14pt;"><span style="font-size: 14pt;"><span style="font-size: 10pt;"><span style="font-size: 12pt;"><span style="font-size: 12pt;"><span style="font-size: 10pt;">也就是说 一年1班的班主任 主动邀请 同学，而不是
同学自己来~~~ 所以效率也降低了。。。。</span></span></span></span></span></span></p>
<p><span style="font-size: 14pt;"><span style="font-size: 14pt;"><span style="font-size: 10pt;"><span style="font-size: 12pt;"><span style="font-size: 12pt;"><span style="font-size: 10pt;">所以我们一般把 一对多端
invser设置为true，即：不让主控端去维护主键关联，<br />
（即：让同学自己去找班级）<br />
说白了，就是，one-to-many端不用去管理
&#8220;新添加对象&#8221; 的主外键约束问题。</span></span></span></span></span></span></p>
<p><span style="font-size: 14pt;"><span style="font-size: 14pt;"><span style="font-size: 10pt;"><span style="font-size: 12pt;"><span style="font-size: 12pt;"><span style="font-size: 10pt;">把one-to-many端（即:class端)的invser设置为true<br />
(即：每次向class.getStudents这个集合中添加
student时，不去主动update对应的外键)，<br />
而是在student端去手动设置<br />
例如：<br />
student.setClass(class);<br />
session.save(student);<br />
这样手动设置
student与class关联啦。。。。<br />
所以上面的程序&#8220;最好&#8221;还是写成这样：</span></span></span></span></span></span></p>
<p><span style="font-size: 14pt;"><span style="font-size: 14pt;"><span style="font-size: 10pt;"><span style="font-size: 12pt;"><span style="font-size: 12pt;"><span style="font-size: 10pt;">Class class = new
Class();<br />
class.setName("一年级1班");<br />
session.save(class);</span></span></span></span></span></span></p>
<p><span style="font-size: 14pt;"><span style="font-size: 14pt;"><span style="font-size: 10pt;"><span style="font-size: 12pt;"><span style="font-size: 12pt;"><span style="font-size: 10pt;">Student stu = new
Student();<br />
stu.setName("小白兔");<br />
stu.setClass(class);<br />
session.save(class);</span></span></span></span></span></span></p>
<p><span style="font-size: 14pt;"><span style="font-size: 14pt;"><span style="font-size: 10pt;"><span style="font-size: 12pt;"><span style="font-size: 12pt;"><span style="font-size: 10pt;">/*<br />
此时向class集合add内容，不会进行数据库操作(update)。<br />
&#8220;更新&#8221;的只是session缓存中，数据镜像。<br />
这样做的好处是：不仅减少了update语句，<br />
而且，同时也更新了session缓存。<br />
------------------------<br />
而在原来:<br />
one-to-many端inverse=false时，虽然也更新seesion缓存中的class集合，<br />
但是有却又多余update<br />
*/<br />
class.getStudents().add(stu);<br />
//
提交</span></span></span></span></span></span></p>
<p><span style="font-size: 14pt;"><span style="font-size: 14pt;"><span style="font-size: 10pt;"><span style="font-size: 12pt;"><span style="font-size: 12pt;"><span style="font-size: 10pt;">总结:<br />
当inverse=false
并且向one-to-many端的关联集合，添加&#8220;新对象(即: 自由态对象)&#8221; 时，<br />
Hibernate就会自动，去update那&#8220;个刚刚到来的&#8221;
&#8220;自由态对象&#8221;的外键。<br />
（如果你向，one-to-many端添的集合中，add一个&#8220;已经持久化了的对象&#8221;，那就不会出现update了(因为已经持久化过了)，除非，你去
更改&#8220;那个持久化对象&#8221;所对应的外键。。。那样的话。。。呵呵呵~~~<br />
你可以试一试，应该不会报错，你可以当做练习去做一下，加深cascade和inverse这两个属性的理解）</span></span></span></span></span></span></p>
<p><br />
<span style="font-size: 14pt;"><span style="font-size: 14pt;"><span style="font-size: 10pt;"><span style="font-size: 12pt;"><span style="font-size: 12pt;"><span style="font-size: 10pt;">//
如果看懂了上面的内容。来看一下，下面的东西。<br />
假如，将one-to-many端(即:Class端)的 hbm.xml 文档中的cascade移除掉
或把cascade="none"。<br />
那么上面的代码会出现什么情况呢。<br />
结果会出现2条HQL，和一堆Exception</span></span></span></span></span></span></p>
<p><span style="font-size: 14pt;"><span style="font-size: 14pt;"><span style="font-size: 10pt;"><span style="font-size: 12pt;"><span style="font-size: 12pt;"><span style="font-size: 10pt;">insert into demo.class
(cid, cname) values (66666666666666666666666666666666, 一年级1班)<br />
update
demo.student set class_id=66666666666666666666666666666666 where
sid=8888888888888888811cb2e04c888888<br />
Hibernate
Exceptinon......................................
</span></span></span></span></span></span></p>
<p><span style="font-size: 14pt;"><span style="font-size: 14pt;"><span style="font-size: 10pt;"><span style="font-size: 12pt;"><span style="font-size: 12pt;"><span style="font-size: 10pt;">相比较cascade被设置"save-update"的时候，缺少了1条
insert语句，而且也多了一些Exception。</span></span></span></span></span></span></p>
<p><span style="font-size: 14pt;"><span style="font-size: 14pt;"><span style="font-size: 10pt;"><span style="font-size: 12pt;"><span style="font-size: 12pt;"><span style="font-size: 10pt;">那么，到底是少了哪1条insert语句呢？<br />
就是这条：<br />
insert into
demo.student (sid,sname,class_id) values (8888888888888888811cb2e04c888888, 小白兔,
66666666666666666666666666666666)</span></span></span></span></span></span></p>
<p><span style="font-size: 14pt;"><span style="font-size: 14pt;"><span style="font-size: 10pt;"><span style="font-size: 12pt;"><span style="font-size: 12pt;"><span style="font-size: 10pt;">之所以会出现，这样的现象，想必您已经早就看出来了。<br />
因为，我没有设置Class端的Cascade，所以在save(class)的时候，并没有自动将其所关联的&#8220;自由态对象&#8221;进行持久化操作。<br />
然而，又因为
Class端的inverse=false，所以，Class会自动去维持，那个 &#8220;新来的student&#8221;
的外键。<br />
所以会出现，没有insert就要update啦。。。。<br />
然后在就是Exception了</span></span></span></span></span></span></p>
</div>
<img src ="http://www.blogjava.net/noaso/aggbug/338247.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/noaso/" target="_blank">noaso</a> 2010-11-17 13:31 <a href="http://www.blogjava.net/noaso/archive/2010/11/17/338247.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>hibernate 中createQuery与createSQLQuery两者区别</title><link>http://www.blogjava.net/noaso/archive/2010/11/09/337652.html</link><dc:creator>noaso</dc:creator><author>noaso</author><pubDate>Tue, 09 Nov 2010 09:42:00 GMT</pubDate><guid>http://www.blogjava.net/noaso/archive/2010/11/09/337652.html</guid><wfw:comment>http://www.blogjava.net/noaso/comments/337652.html</wfw:comment><comments>http://www.blogjava.net/noaso/archive/2010/11/09/337652.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/noaso/comments/commentRss/337652.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/noaso/services/trackbacks/337652.html</trackback:ping><description><![CDATA[<p><br />
前者用的hql语句进行查询，后者可以用sql语句查询<br />
前者以hibernate生成的Bean为对象装入list返回<br />
后者则是以对象数组进行存储<br />
所以使用createSQLQuery有时候也想以hibernate生成的Bean为对象装入list返回，就不是很方便<br />
突然发现createSQLQuery有这样一个方法可以直接转换对象<br />
Query query = session.createSQLQuery(sql).addEntity(XXXXXXX.class);<br />
XXXXXXX 代表以hibernate生成的Bean的对象，也就是数据表映射出的Bean。<br />
呵呵以后多注意，还是时不时的要看看hibernate各个对象方法的使用。</p>
<p>还有另外一个相关的小细节应注意：<br />
比如有这样一个po<br />
PO: User.class<br />
properties: userId,userName<br />
DDL: create table tuser (userid varchar(10),username varchar(20));<br />
当执行：<br />
&nbsp;&nbsp;&nbsp;  session.createQuery("from User u").list()时生成的SQL：<br />
select userid,username from tuser;<br />
当执行：<br />
&nbsp;&nbsp;  <br />
session.createQuery("from User u").iterator()时生成的SQL：<br />
<br />
select userid from tuser;<br />
<br />
可以看出list()一次将数据从数据库中读出直接填充到List中<br />
<br />
iterator()将数据的主键从数据库中读出，当循环这个Iterator时才添加执行：<br />
<br />
select userid,username from user where userid=?;把数据读出。<br />
在不同的应用范围使用不同的方法，具体在hibernate应用中应当注意。</p>
<p><font color="#ff0000">另外涉及到hibernate 的一级缓存 二级缓存 以后再研究。</font></p>
<img src ="http://www.blogjava.net/noaso/aggbug/337652.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/noaso/" target="_blank">noaso</a> 2010-11-09 17:42 <a href="http://www.blogjava.net/noaso/archive/2010/11/09/337652.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一只灰机</title><link>http://www.blogjava.net/noaso/archive/2010/11/09/337642.html</link><dc:creator>noaso</dc:creator><author>noaso</author><pubDate>Tue, 09 Nov 2010 08:35:00 GMT</pubDate><guid>http://www.blogjava.net/noaso/archive/2010/11/09/337642.html</guid><wfw:comment>http://www.blogjava.net/noaso/comments/337642.html</wfw:comment><comments>http://www.blogjava.net/noaso/archive/2010/11/09/337642.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/noaso/comments/commentRss/337642.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/noaso/services/trackbacks/337642.html</trackback:ping><description><![CDATA[<div align="center">一只灰机<br />
</div>
<div align="center"><img src="http://www.blogjava.net/images/blogjava_net/noaso/20090116161608625.jpg" alt="" border="0" height="162" width="384" /></div>
<br />
<img src ="http://www.blogjava.net/noaso/aggbug/337642.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/noaso/" target="_blank">noaso</a> 2010-11-09 16:35 <a href="http://www.blogjava.net/noaso/archive/2010/11/09/337642.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>正则匹配端口表达式</title><link>http://www.blogjava.net/noaso/archive/2010/11/09/337640.html</link><dc:creator>noaso</dc:creator><author>noaso</author><pubDate>Tue, 09 Nov 2010 08:31:00 GMT</pubDate><guid>http://www.blogjava.net/noaso/archive/2010/11/09/337640.html</guid><wfw:comment>http://www.blogjava.net/noaso/comments/337640.html</wfw:comment><comments>http://www.blogjava.net/noaso/archive/2010/11/09/337640.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/noaso/comments/commentRss/337640.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/noaso/services/trackbacks/337640.html</trackback:ping><description><![CDATA[<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;"> <br />
<br />
<br />
String&nbsp;regex&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">^([1-9]|[1-9]\\d{1,3}|[1-6][0-5][0-5][0-3][0-5])$</span><span style="color: #000000;">"</span><span style="color: #000000;">;<br />
&nbsp;
<br />
<br />
<br />
</span><span style="color: #000000;"><br />
</span></div>
<img src ="http://www.blogjava.net/noaso/aggbug/337640.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/noaso/" target="_blank">noaso</a> 2010-11-09 16:31 <a href="http://www.blogjava.net/noaso/archive/2010/11/09/337640.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>