﻿<?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-xskow's road.-文章分类-SSH探索</title><link>http://www.blogjava.net/xskowscut/category/33433.html</link><description>&lt;font size=5&gt;做好自己，做好一切。&lt;/font&gt;</description><language>zh-cn</language><lastBuildDate>Thu, 18 Nov 2010 12:00:50 GMT</lastBuildDate><pubDate>Thu, 18 Nov 2010 12:00:50 GMT</pubDate><ttl>60</ttl><item><title>【转】ClassNotFoundException:org.hibernate.hql.ast.HqlToken-weblogic使用hibernate hql问题解决 </title><link>http://www.blogjava.net/xskowscut/articles/338095.html</link><dc:creator>xskow!</dc:creator><author>xskow!</author><pubDate>Mon, 15 Nov 2010 06:51:00 GMT</pubDate><guid>http://www.blogjava.net/xskowscut/articles/338095.html</guid><wfw:comment>http://www.blogjava.net/xskowscut/comments/338095.html</wfw:comment><comments>http://www.blogjava.net/xskowscut/articles/338095.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xskowscut/comments/commentRss/338095.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xskowscut/services/trackbacks/338095.html</trackback:ping><description><![CDATA[<span style="font-size: 13px; color: #555555; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; line-height: 18px; ">
<p style="margin-top: 0.7em; margin-right: 0px; margin-bottom: 0.7em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #555555; font-size: 1em; line-height: 1.4em; ">一般我们使用hibernate，最喜欢用的应该就是hql查询吧，较为灵活写法也跟sql相似，不过有的同志喜欢用criteria查询的可能不会看到这个异常信息，呵呵。</p>
<p style="margin-top: 0.7em; margin-right: 0px; margin-bottom: 0.7em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #555555; font-size: 1em; line-height: 1.4em; ">今天把一hibernate war项目部署到wl10.3.3上，部署是不会报错的，但是当你点到某个功能，这个功能下面有hql查询，就会报错，报错信息如下：</p>
<p style="margin-top: 0.7em; margin-right: 0px; margin-bottom: 0.7em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #555555; font-size: 1em; line-height: 1.4em; ">java.lang.RuntimeException: ClassNotFoundException: org.hibernate.hql.ast.HqlToken [select ...]; nested exception is org.hibernate.QueryException: ClassNotFoundException: org.hibernate.hql.ast.HqlToken [select ...]<br />
at &#8230;<br />
at javax.servlet.http.HttpServlet.service(HttpServlet.java:707)<br />
at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)<br />
at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:227)<br />
at weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:125)<br />
at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:300)<br />
at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:183)<br />
at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.doIt(WebAppServletContext.java:3686)<br />
at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:3650)<br />
at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321)<br />
at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:121)<br />
at weblogic.servlet.internal.WebAppServletContext.securedExecute(WebAppServletContext.java:2268)<br />
at weblogic.servlet.internal.WebAppServletContext.execute(WebAppServletContext.java:2174)<br />
at weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1446)<br />
at weblogic.work.ExecuteThread.execute(ExecuteThread.java:201)<br />
at weblogic.work.ExecuteThread.run(ExecuteThread.java:173)<br />
&gt;</p>
<p style="margin-top: 0.7em; margin-right: 0px; margin-bottom: 0.7em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #555555; font-size: 1em; line-height: 1.4em; ">通过自己做的JarFinder小工具，明显可以在部署的war包中看到&nbsp;org.hibernate.hql.ast.HqlToken 类，在hibernate-core-3.3.0.GA.jar中，这报错不正常啊，估计就是某些包跟wl冲突了，后来google了一下，找到一个国外的帖子，说是antlr的问题，亲身试验了一次，果然是这个问题，现在就把解决方法跟大家分享下：</p>
<p style="margin-top: 0.7em; margin-right: 0px; margin-bottom: 0.7em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #555555; font-size: 1em; line-height: 1.4em; ">将你的war包打入ear包中，当然你还需要有META-INF文件，带有weblogic-application.xml和application.xml，主要就是在weblogic-application.xml中解决，声明prefer-application-packages，如下所示(关键line3-5)：</p>
<div class="wp_code" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #110000; background-color: #f4f5de; overflow-x: hidden; overflow-y: hidden; width: 648px; ">
<div class="pre" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 2px; padding-right: 2px; padding-bottom: 2px; padding-left: 2px; vertical-align: top; ">
<pre class="xml" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; overflow-x: visible; overflow-y: visible; font-family: Times; font-size: 13px; width: 644px; float: none; clear: none; line-height: 1.333; white-space: pre; "><span style="color: #009900; "><span style="color: #000000; font-weight: bold; ">&lt;?xml</span> <span style="color: #000066; ">version</span>=<span style="color: #ff0000; ">"1.0"</span> <span style="color: #000066; ">encoding</span>=<span style="color: #ff0000; ">"UTF8"</span><span style="color: #000000; font-weight: bold; ">?&gt;</span></span>
<span style="color: #009900; "><span style="color: #000000; font-weight: bold; ">&lt;weblogic-application<span style="color: #000000; font-weight: bold; ">&gt;</span></span></span>
<span style="color: #009900; "><span style="color: #000000; font-weight: bold; ">&lt;prefer-application-packages<span style="color: #000000; font-weight: bold; ">&gt;</span></span></span>
<span style="color: #009900; "><span style="color: #000000; font-weight: bold; ">&lt;package-name<span style="color: #000000; font-weight: bold; ">&gt;</span></span></span>antlr.*<span style="color: #009900; "><span style="color: #000000; font-weight: bold; ">&lt;/package-name<span style="color: #000000; font-weight: bold; ">&gt;</span></span></span>
<span style="color: #009900; "><span style="color: #000000; font-weight: bold; ">&lt;/prefer-application-packages<span style="color: #000000; font-weight: bold; ">&gt;</span></span></span>
<span style="color: #009900; "><span style="color: #000000; font-weight: bold; ">&lt;/weblogic-application<span style="color: #000000; font-weight: bold; ">&gt;</span></span></span></pre>
</div>
</div>
<p style="margin-top: 0.7em; margin-right: 0px; margin-bottom: 0.7em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #555555; font-size: 1em; line-height: 1.4em; ">而application.xml就较为简单了，这里就不说了，相信打过ear包的都应该知道怎么回事，呵呵.打包后再次发布，问题解决。</p>
<p style="margin-top: 0.7em; margin-right: 0px; margin-bottom: 0.7em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #555555; font-size: 1em; line-height: 1.4em; ">附上解决问题原帖链接：<a href="http://forum.springsource.org/showthread.php?t=36860" style="text-decoration: none; color: #3478e3; ">http://forum.springsource.org/showthread.php?t=36860</a></p>
<p style="margin-top: 0.7em; margin-right: 0px; margin-bottom: 0.7em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #555555; font-size: 1em; line-height: 1.4em; ">不会写application.xml的可以参考一下java的dtd：<a href="http://java.sun.com/dtd/" style="text-decoration: none; color: #3478e3; ">http://java.sun.com/dtd/</a></p>
<p style="margin-top: 0.7em; margin-right: 0px; margin-bottom: 0.7em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #555555; font-size: 1em; line-height: 1.4em; ">再附上一篇08年的英文文章，blogspot的，讲的是weblogic jws+spring+hibernate开发的，需要翻墙才能看到：<a href="http://timezra.blogspot.com/2008/09/spring-hibernate-and-jax-ws-webservices.html" style="text-decoration: none; color: #3478e3; ">http://timezra.blogspot.com/2008/09/spring-hibernate-and-jax-ws-webservices.html</a></p>
<p style="margin-top: 0.7em; margin-right: 0px; margin-bottom: 0.7em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #555555; font-size: 1em; line-height: 1.4em; ">欢迎讨论~</p>
<p style="margin-top: 0.7em; margin-right: 0px; margin-bottom: 0.7em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #555555; font-size: 1em; line-height: 1.4em; "><br />
</p>
<p style="margin-top: 0.7em; margin-right: 0px; margin-bottom: 0.7em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #555555; font-size: 1em; line-height: 1.4em; ">原文链接：<span  style="color: #000000; font-family: 'Times New Roman'; line-height: normal; font-size: medium; "><a href="http://www.shaojiahao.org/java/hibernate/weblogic-hibernate-hql-problem">http://www.shaojiahao.org/java/hibernate/weblogic-hibernate-hql-problem</a></span></p>
</span>
<img src ="http://www.blogjava.net/xskowscut/aggbug/338095.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xskowscut/" target="_blank">xskow!</a> 2010-11-15 14:51 <a href="http://www.blogjava.net/xskowscut/articles/338095.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于Hibernate Native sql query的诡异问题</title><link>http://www.blogjava.net/xskowscut/articles/281376.html</link><dc:creator>xskow!</dc:creator><author>xskow!</author><pubDate>Thu, 11 Jun 2009 01:57:00 GMT</pubDate><guid>http://www.blogjava.net/xskowscut/articles/281376.html</guid><wfw:comment>http://www.blogjava.net/xskowscut/comments/281376.html</wfw:comment><comments>http://www.blogjava.net/xskowscut/articles/281376.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/xskowscut/comments/commentRss/281376.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xskowscut/services/trackbacks/281376.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当要做连表查询时，比如a和b，如果a1和b1都有一个name字段，使用下面的sql语句:<br />
<span style="color: red">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; select a.name, b.name from a1 a, b1 b<br />
<font color="#000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 假设不作任何处理，毫无疑问返回的是object[]的List，object[0]是a.name, object[1]是b.name。但是，咋们想错了。。。object[0]和object[1]一样是a.name，开始认为是hibernate调用jdbc的resultset时使用了如getString("name")这样的东东，所以得到的都是第0个值。好吧，加个别名试试：<br />
</font><span style="color: red">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; select a.name as name1, b.name as name2&nbsp;from a1 a, b1 b</span><br />
<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这好像可以呀。。。但是却报错，找不到name列。。。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 好吧，来个ResultTransformer吧！假设转换目标类为TestDTO.class:<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="Codehighlighter1_20_108_Open_Image" onclick="this.style.display='none'; Codehighlighter1_20_108_Open_Text.style.display='none'; Codehighlighter1_20_108_Closed_Image.style.display='inline'; Codehighlighter1_20_108_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_20_108_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_20_108_Closed_Text.style.display='none'; Codehighlighter1_20_108_Open_Image.style.display='inline'; Codehighlighter1_20_108_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;TestDTO</span><span id="Codehighlighter1_20_108_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 src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_20_108_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;String&nbsp;name1;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;String&nbsp;name2;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">getters&nbsp;and&nbsp;setters</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span></div>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这回应该好了吧？还是一样的错误。。。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #ff0000">&nbsp;&nbsp;注意：使用ResultTransformer的时候，别名注射不能用{name1}这种形式的，这种形式只适用于addEntity的情况！</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 为什么我要用sql查询？由于特殊情况，我使用一些和数据库有依赖的函数，以后转数据库要是知道不兼容也肯定是sql那块的，而不是hql，解决问题就方便多了。（注:hql一样可以用特定数据库的函数）而且我连的是多个表，每个表字段十来个，如果用实体查询的话，每一行就是三个对象，而我需要的只是5个字段而已。而且如果可以用ResultTransformer的话，操作起来也十分方便。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 不知道有谁也遇到过同样问题？还是说大家都不用hibernate进行sql查询，不管是什么情况？<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 得再次研究hibernate官方文档了。。。从文档的那一章中，完全没有找到有同名字段然后又使用ResultTransformer的情况。。。<br />
<br />
<br />
</span></span>
<img src ="http://www.blogjava.net/xskowscut/aggbug/281376.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xskowscut/" target="_blank">xskow!</a> 2009-06-11 09:57 <a href="http://www.blogjava.net/xskowscut/articles/281376.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>华南理工大学校运会计分系统项目总结(一)</title><link>http://www.blogjava.net/xskowscut/articles/239734.html</link><dc:creator>xskow!</dc:creator><author>xskow!</author><pubDate>Mon, 10 Nov 2008 12:39:00 GMT</pubDate><guid>http://www.blogjava.net/xskowscut/articles/239734.html</guid><wfw:comment>http://www.blogjava.net/xskowscut/comments/239734.html</wfw:comment><comments>http://www.blogjava.net/xskowscut/articles/239734.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/xskowscut/comments/commentRss/239734.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xskowscut/services/trackbacks/239734.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这么一个项目，确实，用了我很多时间，原因是自己在项目开始时可以说对SSH只有一知半解，就坚决地要采用这三个优秀框架来搭建服务。不过，学到的确实不少啊，起码对于这样的应用还是有一定底子了，呵呵。。。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在这个项目当中，有什么值得写在我的小博客上面呢？有的。本项目分层也是采用经典的贫血模式。由底向上共四层，model--&gt;dao--&gt;service--&gt;action。其中model采用Hibernate，底层数据库用MySQL5，在Hibernate方面，我用了比较新的annotations，而不是平常的*.hbm.xml。确实，annotations用起来比较方便，但是和POJO的耦合度就大多了。记得有些配错的时候要一个一个getter去找annotation，呵呵。。。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在Hibernate annotation方面，还是有些东西值得总结一下，首先就是annotation写在是什么地方，最方便的方法是写在各个field的getter上面，这样就不用额外的annotation，也建议大家采用此方法，另一种也就是写在field声明上面，这样的话需要在类上方添加其他annotation，我当时是没成功，呵呵。其次是级联操作，也就是cascade，需要注意的是当两个实体关系是一对多和多对多的时候，比如班级与学生，学生与课程，明显班级与学生是一对多，学生与课程是多对多关系，那么当我们需要设置级联时候怎么办呢？在hibernate中，cascade分有4种，分别是CascadeType.PERSIST,CascadeType.MERGE,CascadeType.REFRESH,CascadeType.REMOVE。比如是persist，如果在刚才的例子来说，应该这样配置：<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"><span style="color: #008080">&nbsp;1</span><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #008000">//</span><span style="color: #008000">班级实体</span><span style="color: #008000"><br />
</span><span style="color: #008080">&nbsp;2</span><span style="color: #008000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #000000">@Entity<br />
</span><span style="color: #008080">&nbsp;3</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />@Table(name</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">T_CLASS</span><span style="color: #000000">"</span><span style="color: #000000">)<br />
</span><span style="color: #008080">&nbsp;4</span><span style="color: #000000"><img id="Codehighlighter1_56_294_Open_Image" style="display: inline" onclick="this.style.display='none'; Codehighlighter1_56_294_Open_Text.style.display='none'; Codehighlighter1_56_294_Closed_Image.style.display='inline'; Codehighlighter1_56_294_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_56_294_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_56_294_Closed_Text.style.display='none'; Codehighlighter1_56_294_Open_Image.style.display='inline'; Codehighlighter1_56_294_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Clazz</span><span id="Codehighlighter1_56_294_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 src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_56_294_Open_Text" style="display: inline"><span style="color: #000000">{<br />
</span><span style="color: #008080">&nbsp;5</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;<img src="http://www.blogjava.net/Images/dot.gif"  alt="" /><br />
</span><span style="color: #008080">&nbsp;6</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;Set</span><span style="color: #000000">&lt;</span><span style="color: #000000">Student</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;students;<br />
</span><span style="color: #008080">&nbsp;7</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;<img src="http://www.blogjava.net/Images/dot.gif"  alt="" /><br />
</span><span style="color: #008080">&nbsp;8</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;<br />
</span><span style="color: #008080">&nbsp;9</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;@OneToMany<br />
</span><span style="color: #008080">10</span><span style="color: #000000"><img id="Codehighlighter1_130_188_Open_Image" onclick="this.style.display='none'; Codehighlighter1_130_188_Open_Text.style.display='none'; Codehighlighter1_130_188_Closed_Image.style.display='inline'; Codehighlighter1_130_188_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_130_188_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_130_188_Closed_Text.style.display='none'; Codehighlighter1_130_188_Open_Image.style.display='inline'; Codehighlighter1_130_188_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;(cascade</span><span style="color: #000000">=</span><span id="Codehighlighter1_130_188_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 src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_130_188_Open_Text"><span style="color: #000000">{CascadeType.REMOVE,CascadeType.MERGE,&nbsp;CascadeType.PERSIST}</span></span><span style="color: #000000">,&nbsp;fetch</span><span style="color: #000000">=</span><span style="color: #000000">FetchType.LAZY,&nbsp;mappedBy</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">clazz</span><span style="color: #000000">"</span><span style="color: #000000">)<br />
</span><span style="color: #008080">11</span><span style="color: #000000"><img id="Codehighlighter1_266_291_Open_Image" onclick="this.style.display='none'; Codehighlighter1_266_291_Open_Text.style.display='none'; Codehighlighter1_266_291_Closed_Image.style.display='inline'; Codehighlighter1_266_291_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_266_291_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_266_291_Closed_Text.style.display='none'; Codehighlighter1_266_291_Open_Image.style.display='inline'; Codehighlighter1_266_291_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;Set</span><span style="color: #000000">&lt;</span><span style="color: #000000">Student</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;getStudents()</span><span id="Codehighlighter1_266_291_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 src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_266_291_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">12</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;students;<br />
</span><span style="color: #008080">13</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;<br />
</span><span style="color: #008080">14</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">15</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
<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"><span style="color: #008080">&nbsp;1</span><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #008000">//</span><span style="color: #008000">学生实体</span><span style="color: #008000"><br />
</span><span style="color: #008080">&nbsp;2</span><span style="color: #008000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #000000">@Entity<br />
</span><span style="color: #008080">&nbsp;3</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />@Table(name</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">T_STUDENT</span><span style="color: #000000">"</span><span style="color: #000000">)<br />
</span><span style="color: #008080">&nbsp;4</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /><br />
</span><span style="color: #008080">&nbsp;5</span><span style="color: #000000"><img id="Codehighlighter1_64_200_Open_Image" onclick="this.style.display='none'; Codehighlighter1_64_200_Open_Text.style.display='none'; Codehighlighter1_64_200_Closed_Image.style.display='inline'; Codehighlighter1_64_200_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_64_200_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_64_200_Closed_Text.style.display='none'; Codehighlighter1_64_200_Open_Image.style.display='inline'; Codehighlighter1_64_200_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Student</span><span id="Codehighlighter1_64_200_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 src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_64_200_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">&nbsp;6</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;<img src="http://www.blogjava.net/Images/dot.gif"  alt="" /><br />
</span><span style="color: #008080">&nbsp;7</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;Clazz&nbsp;clazz;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private Set&lt;Course&gt; courses;<br />
</span><span style="color: #008080">&nbsp;8</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;<img src="http://www.blogjava.net/Images/dot.gif"  alt="" /><br />
</span><span style="color: #008080">&nbsp;9</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;@ManyToOne<br />
</span><span style="color: #008080">10</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;@JoinColumn(name</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">CLAZZ_ID</span><span style="color: #000000">"</span><span style="color: #000000">)<br />
</span><span style="color: #008080">11</span><span style="color: #000000"><img id="Codehighlighter1_170_192_Open_Image" onclick="this.style.display='none'; Codehighlighter1_170_192_Open_Text.style.display='none'; Codehighlighter1_170_192_Closed_Image.style.display='inline'; Codehighlighter1_170_192_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_170_192_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_170_192_Closed_Text.style.display='none'; Codehighlighter1_170_192_Open_Image.style.display='inline'; Codehighlighter1_170_192_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;Clazz&nbsp;getClazz()</span><span id="Codehighlighter1_170_192_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 src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_170_192_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">12</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;clazz;<br />
</span><span style="color: #008080">13</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">14</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;<img src="http://www.blogjava.net/Images/dot.gif"  alt="" /><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@ManyToMany<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @JoinTable(name="T_STUDENT_COURSE")<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public Set&lt;Course&gt; getCourses(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return courses;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;<br />
</span><span style="color: #008080">15</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span></div>
<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"><span style="color: #008080">&nbsp;1</span><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #008000">//</span><span style="color: #008000">课程实体</span><span style="color: #008000"><br />
</span><span style="color: #008080">&nbsp;2</span><span style="color: #008000"><img id="Codehighlighter1_26_198_Open_Image" onclick="this.style.display='none'; Codehighlighter1_26_198_Open_Text.style.display='none'; Codehighlighter1_26_198_Closed_Image.style.display='inline'; Codehighlighter1_26_198_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_26_198_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_26_198_Closed_Text.style.display='none'; Codehighlighter1_26_198_Open_Image.style.display='inline'; Codehighlighter1_26_198_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Course</span><span id="Codehighlighter1_26_198_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 src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_26_198_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">&nbsp;3</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;<img src="http://www.blogjava.net/Images/dot.gif"  alt="" /><br />
</span><span style="color: #008080">&nbsp;4</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;Set</span><span style="color: #000000">&lt;</span><span style="color: #000000">Student</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;students;<br />
</span><span style="color: #008080">&nbsp;5</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;<img src="http://www.blogjava.net/Images/dot.gif"  alt="" /><br />
</span><span style="color: #008080">&nbsp;6</span><span style="color: #000000"><img id="Codehighlighter1_114_133_Open_Image" onclick="this.style.display='none'; Codehighlighter1_114_133_Open_Text.style.display='none'; Codehighlighter1_114_133_Closed_Image.style.display='inline'; Codehighlighter1_114_133_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_114_133_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_114_133_Closed_Text.style.display='none'; Codehighlighter1_114_133_Open_Image.style.display='inline'; Codehighlighter1_114_133_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;@ManyToMany(mappedBy</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">courses</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;cascade</span><span style="color: #000000">=</span><span id="Codehighlighter1_114_133_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 src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_114_133_Open_Text"><span style="color: #000000">{CascadeType.PERSIST, CascadeType.REMOVE}</span></span><span style="color: #000000">)<br />
</span><span style="color: #008080">&nbsp;7</span><span style="color: #000000"><img id="Codehighlighter1_171_196_Open_Image" onclick="this.style.display='none'; Codehighlighter1_171_196_Open_Text.style.display='none'; Codehighlighter1_171_196_Closed_Image.style.display='inline'; Codehighlighter1_171_196_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_171_196_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_171_196_Closed_Text.style.display='none'; Codehighlighter1_171_196_Open_Image.style.display='inline'; Codehighlighter1_171_196_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;Set</span><span style="color: #000000">&lt;</span><span style="color: #000000">Student</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;getStudents()</span><span id="Codehighlighter1_171_196_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 src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_171_196_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">&nbsp;8</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;students;<br />
</span><span style="color: #008080">&nbsp;9</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">10</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span></div>
<p>在Clazz的OneToMany和Course的ManyToMany中，我们都可以看到有CascadeType.PERSIST和CascadeType.REMOVE。具体到底是什么意思呢？persist是指当持久化实体的时候，如果有关联的集合，并且设成persist时，连集合也一并存入数据库当中。但是如果真正写一下，然后使用的话，我们会发现：OneToMany设置这个根本不起作用。比如我新建一个班级，并直接赋予60个学生的一个集合，然后调用dao的save方法，看看数据库，怎么回事，怎么只有班级持久化了，关联学生一个没存到数据库？然后试试新建课程，并且选上要修这门课的学生，然后持久化课程，看看数据库，怎么搞的，这次双方都持久化了，即中间表已经插入了相关的记录。造成OneToMany用persist是什么原因？个人理解：学生属于一个实体，其持久化应当依靠自己相应的dao，一个一个student的存储。就好比student和course的中间表，我们上面假设中间表只有STUDENT_ID和COURSE_ID，并且分别连向student表和course表的主键，如果你有特殊需求，比如是要一个score列（课程成绩），那么这时候你还想用ManyToMany配置的话，会出现好多问题，除非你允许成绩是空的，但是即使成绩可以为空，如果你需要修改成绩怎么办呢？先取出这个学生，然后遍历其课程集合，找到这个课程然后再持久化不行？应该可以吧，但是是不是指需要先删除这个学生选的课程，然后再将这些再次持久化一次？这个方法绝对可以，不过我没人会这样。。。呵呵。。。当中间表有其他与两方表都没有关系的列时，你应当为中间表也映射一个实体，用这个实体的相应dao修改相应的记录。在这种情况下用ManyToMany还有另一个问题，如果你的hibernate session还没有关闭，你会发现提错，说你打算删除即将再次持久化的记录。使用OpenSessionInViewFilter的时候你就会发现这个问题了。呵呵。。。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;还有一个，Hibernate官方不推荐使用联合主键，原来的我就不相信用联合主键会怎样，还不行吗？要不行那还不是你框架太烂？实践过之后，我改变了我的看法。。。假如你是普通的一个表，使用联合主键没有任何问题，但是假如你的表是一个中间表，并且有和两个关联表无关的列，就像T_STUDENT_COURSE，我们在设计数据库的时候，很容易想到用STUDENT_ID和COURSE_ID来作为主键，不错，但是如果你用hibernate映射实体的时候你知道有什么麻烦吗？首先这两个都是外键，在hibernate中就是需要有两个关联实体的对象引用，那么这两个作为@Id是吧？可以啊！但是当你持久化的时候，会提示student在T_STUDENT_COURSE中无法找到。为什么？因为你数据库就一个ID呀，而你这里配的可是一个实体引用呀！其实这也是可以解决了，就是解决办法迂回一点点，在hibernate外键关联的时候可以指定实体引用，就是说比如你StudentCourse实体，有一个student的引用，可以定义这样一个column：studentId，这个Id可以关联student引用，具体写法我就不写出来了，在hibernate官方文档写得相当详细，很容易验证。看，就一个外键都这样了，多个外键还得了？当然，如果普通的单外键引用不会产生这样的问题，直接配一个实体引用就可以解决问题。问题是可以解决的，关键是以后维护起来是否方便？我做过就知道，一点不简单，所以后来还是改了。。。不推荐大家使用联合主键。</p>
<img src ="http://www.blogjava.net/xskowscut/aggbug/239734.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xskowscut/" target="_blank">xskow!</a> 2008-11-10 20:39 <a href="http://www.blogjava.net/xskowscut/articles/239734.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>