﻿<?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-写程序，做产品，过日子-随笔分类-Java</title><link>http://www.blogjava.net/welkinhu/category/16995.html</link><description>Write what I like</description><language>zh-cn</language><lastBuildDate>Wed, 19 Mar 2008 08:17:43 GMT</lastBuildDate><pubDate>Wed, 19 Mar 2008 08:17:43 GMT</pubDate><ttl>60</ttl><item><title>Maven 2 Mirror的陷阱</title><link>http://www.blogjava.net/welkinhu/archive/2008/03/19/187255.html</link><dc:creator>Welkin Hu</dc:creator><author>Welkin Hu</author><pubDate>Wed, 19 Mar 2008 07:03:00 GMT</pubDate><guid>http://www.blogjava.net/welkinhu/archive/2008/03/19/187255.html</guid><wfw:comment>http://www.blogjava.net/welkinhu/comments/187255.html</wfw:comment><comments>http://www.blogjava.net/welkinhu/archive/2008/03/19/187255.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/welkinhu/comments/commentRss/187255.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/welkinhu/services/trackbacks/187255.html</trackback:ping><description><![CDATA[<p>&nbsp;</p>
<p>Maven 2的安装和使用虽然不是一点即用，但也不是很复杂。然而，这两天我新装Maven，刚刚过了mvn -version，尝试create maven project就出问题了。问题详情如下。</p>
<blockquote>
<p>D:\mavenSample&gt;mvn archetype:create -DgroupId=com.mycompany.app -DartifactId=my-app <br />
[INFO] Scanning for projects...<br />
[INFO] Searching repository for plugin with prefix: 'archetype'.<br />
[INFO] org.apache.maven.plugins: checking for updates from central<br />
[INFO] org.codehaus.mojo: checking for updates from central<br />
[INFO] artifact org.apache.maven.plugins:maven-archetype-plugin: checking for updates from central<br />
[INFO] ------------------------------------------------------------------------<br />
[ERROR] BUILD ERROR<br />
[INFO] ------------------------------------------------------------------------<br />
[INFO] The plugin 'org.apache.maven.plugins:maven-archetype-plugin' does not exist or no valid version could be found<br />
[INFO] ------------------------------------------------------------------------<br />
[INFO] For more information, run Maven with the -e switch<br />
[INFO] ------------------------------------------------------------------------<br />
[INFO] Total time: 3 seconds<br />
[INFO] Finished at: Wed Mar 19 14:26:49 CST 2008<br />
[INFO] Final Memory: 1M/2M<br />
[INFO] ------------------------------------------------------------------------</p>
</blockquote>
<p>&nbsp;</p>
<p>开始以为是internet 代理设置有问题。网上也有帖子这么说。可是换到ADSL后，不用代理了，问题仍然存在。</p>
<p>几经周折后发现，原因在于我画蛇添足多加了几个镜像，其中有的镜像没有同步更新maven库。经过测试，如下maven 镜像工作正常：</p>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->&nbsp;&nbsp;&nbsp; &lt;mirror&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;id&gt;ibiblio.org&lt;/id&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;name&gt;ibiblio Mirror of <a href="http://repo1.maven.org/maven2/">http://repo1.maven.org/maven2/</a>&lt;/name&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;url&gt;<a href="http://mirrors.ibiblio.org/pub/mirrors/maven2">http://mirrors.ibiblio.org/pub/mirrors/maven2</a>&lt;/url&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;mirrorOf&gt;central&lt;/mirrorOf&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- United States, North Carolina --&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/mirror&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;mirror&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;id&gt;redv.com&lt;/id&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;url&gt;<a href="http://mirrors.redv.com/maven2">http://mirrors.redv.com/maven2</a>&lt;/url&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;mirrorOf&gt;central&lt;/mirrorOf&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- Shanghai, China , Very fast--&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/mirror&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;mirror&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;id&gt;dotsrc.org&lt;/id&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;url&gt;<a href="http://mirrors.dotsrc.org/maven2">http://mirrors.dotsrc.org/maven2</a>&lt;/url&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;mirrorOf&gt;central&lt;/mirrorOf&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- Denmark --&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/mirror&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;mirror&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;id&gt;sunsite.dk&lt;/id&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;url&gt;<a href="http://mirrors.sunsite.dk/maven2">http://mirrors.sunsite.dk/maven2</a>&lt;/url&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;mirrorOf&gt;central&lt;/mirrorOf&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- Denmark --&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/mirror&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;mirror&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;id&gt;skynet.be&lt;/id&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;url&gt;<a href="http://maven2.mirrors.skynet.be/pub/maven2">http://maven2.mirrors.skynet.be/pub/maven2</a>&lt;/url&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;mirrorOf&gt;central&lt;/mirrorOf&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- Belgium --&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/mirror&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;mirror&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;id&gt;cica.es&lt;/id&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;url&gt;<a href="http://ftp.cica.es/mirrors/maven2">http://ftp.cica.es/mirrors/maven2</a>&lt;/url&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;mirrorOf&gt;central&lt;/mirrorOf&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- Spain, Sevilla --&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/mirror&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;!-- these just point to ibiblio.org --&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;mirror&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;id&gt;ibiblio.net&lt;/id&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;name&gt;ibiblio.net Mirror of <a href="http://repo1.maven.org/maven2/">http://repo1.maven.org/maven2/</a>&lt;/name&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;url&gt;<a href="http://www.ibiblio.net/pub/packages/maven2">http://www.ibiblio.net/pub/packages/maven2</a>&lt;/url&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;mirrorOf&gt;central&lt;/mirrorOf&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- United States, North Carolina&nbsp; Fast--&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/mirror&gt;</div>
<p><br />
</p>
<p>&nbsp;</p>
<p>而下面的Maven镜像都有问题。</p>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">mirror</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">id</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">planetmirror</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">id</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">name</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">Australian&nbsp;Mirror&nbsp;of&nbsp;http://repo1.maven.org/maven2/</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">name</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">url</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">http://public.planetmirror.com/maven2/</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">url</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">mirrorOf</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">central</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">mirrorOf</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">mirror</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">mirror</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">id</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">lsu.edu</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">id</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">url</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">http://ibiblio.lsu.edu/main/pub/packages/maven2</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">url</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">mirrorOf</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">central</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">mirrorOf</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">&lt;!--</span><span style="color: #008000;">&nbsp;United&nbsp;States,&nbsp;Louisiana&nbsp;</span><span style="color: #008000;">--&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">mirror</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">mirror</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">id</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">sateh.com</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">id</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">url</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">http://maven.sateh.com/repository</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">url</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">mirrorOf</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">central</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">mirrorOf</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">&lt;!--</span><span style="color: #008000;">&nbsp;The&nbsp;Netherlands,&nbsp;Amsterdam&nbsp;</span><span style="color: #008000;">--&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">mirror</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">mirror</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">id</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">ggi-project.org</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">id</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">url</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">http://ftp.ggi-project.org/pub/packages/maven2</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">url</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">mirrorOf</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">central</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">mirrorOf</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">&lt;!--</span><span style="color: #008000;">&nbsp;The&nbsp;Netherlands,&nbsp;Amsterdam&nbsp;</span><span style="color: #008000;">--&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">mirror</span><span style="color: #0000ff;">&gt;</span></div>
<img src ="http://www.blogjava.net/welkinhu/aggbug/187255.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/welkinhu/" target="_blank">Welkin Hu</a> 2008-03-19 15:03 <a href="http://www.blogjava.net/welkinhu/archive/2008/03/19/187255.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>开源项目托管站点SourceForge, Google Code, CodePlex</title><link>http://www.blogjava.net/welkinhu/archive/2008/02/27/182406.html</link><dc:creator>Welkin Hu</dc:creator><author>Welkin Hu</author><pubDate>Wed, 27 Feb 2008 02:20:00 GMT</pubDate><guid>http://www.blogjava.net/welkinhu/archive/2008/02/27/182406.html</guid><wfw:comment>http://www.blogjava.net/welkinhu/comments/182406.html</wfw:comment><comments>http://www.blogjava.net/welkinhu/archive/2008/02/27/182406.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/welkinhu/comments/commentRss/182406.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/welkinhu/services/trackbacks/182406.html</trackback:ping><description><![CDATA[<p>近来根据公司要求，学习Microsoft.Net。于是仿照EyeLoveU，写了一个C#的小程序。现在比较稳定了，就想放到在SoruceForge这样的网站上去秀一秀。<br />
<br />
最开始考虑的自然是SourceForge。但在公司需要通过Proxy访问sourceforge.net时，速度奇慢。<br />
<br />
第二个考虑的是Google Code。无论在家通过ADSL访问，还是在公司通过Proxy访问，速度都可以接受。最好用的是支持对Issue, Discussion, Document等自定义属性标签，如priority, type, milestone等。<br />
<br />
无论是SourceForge，还是Google Code，与subversion和eclipse的集成都非常好。可是我用的是Microsoft Visual Studio 2008和C#，与这两个东家都不合拍：<br />
</p>
<ul>
    <li>&nbsp;Subversion 与VS2008的集成需要购买Visual SVN</li>
    <li>VS2008不能发布下载包到SourceForge和Google Code上。</li>
</ul>
<p>最后我发现CodePlex这个网站，居然提供Visual Studio Team Fundation Server的服务。与我用的VS2008完全是一家！可惜的是它的网速非常不稳定，很难访问。估计服务器只在美国。最要命的是，在公司的Proxy环境下，我可以从IE访问CodePlex的VSTS服务器，但VS2008的Team Explorer怎么也访问不了。</p>
<img src ="http://www.blogjava.net/welkinhu/aggbug/182406.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/welkinhu/" target="_blank">Welkin Hu</a> 2008-02-27 10:20 <a href="http://www.blogjava.net/welkinhu/archive/2008/02/27/182406.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hiberante Collection Mapping Samples</title><link>http://www.blogjava.net/welkinhu/archive/2007/10/24/155524.html</link><dc:creator>Welkin Hu</dc:creator><author>Welkin Hu</author><pubDate>Wed, 24 Oct 2007 03:09:00 GMT</pubDate><guid>http://www.blogjava.net/welkinhu/archive/2007/10/24/155524.html</guid><wfw:comment>http://www.blogjava.net/welkinhu/comments/155524.html</wfw:comment><comments>http://www.blogjava.net/welkinhu/archive/2007/10/24/155524.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/welkinhu/comments/commentRss/155524.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/welkinhu/services/trackbacks/155524.html</trackback:ping><description><![CDATA[<h1>Collection mapping table</h1> <table cellspacing="0" cellpadding="2" width="400" border="0"> <tbody> <tr> <td valign="top" width="133"><strong>HBM Element</strong></td> <td valign="top" width="133"><strong>Java Interface</strong></td> <td valign="top" width="133"><strong>Java Implementation</strong></td></tr> <tr> <td valign="top" width="133">&lt;set&gt;</td> <td valign="top" width="133">Set</td> <td valign="top" width="133">HashSet</td></tr> <tr> <td valign="top" width="133">&lt;set&gt; with order</td> <td valign="top" width="133">SortedSet</td> <td valign="top" width="133">TreeSet</td></tr> <tr> <td valign="top" width="133">&lt;list&gt;</td> <td valign="top" width="133">List</td> <td valign="top" width="133">ArrayList</td></tr> <tr> <td valign="top" width="133">&lt;bag&gt;, &lt;idbag&gt;</td> <td valign="top" width="133">Collection</td> <td valign="top" width="133">ArrayList</td></tr> <tr> <td valign="top" width="133">&lt;map&gt;</td> <td valign="top" width="133">Map</td> <td valign="top" width="133">HashMap</td></tr> <tr> <td valign="top" width="133">&lt;map&gt; with order</td> <td valign="top" width="133">SortedMap</td> <td valign="top" width="133">TreeMap</td></tr> <tr> <td valign="top" width="133">&lt;array&gt;, &lt;primitive-array&gt;</td> <td valign="top" width="133">N/A</td> <td valign="top" width="133">array</td></tr></tbody></table> <p>&nbsp;</p> <h2>Sample Tables</h2> <blockquote> <p>CREATE TABLE `core_sample_company` (<br>&nbsp; `companyId` decimal(18,0) NOT NULL,<br>&nbsp; `companyName` varchar(128) NOT NULL,<br>&nbsp; `description` varchar(1024) default NULL,<br>&nbsp; PRIMARY KEY&nbsp; (`companyId`)<br>); <p>CREATE TABLE `core_sample_role` (<br>&nbsp; `roleId` decimal(18,0) NOT NULL,<br>&nbsp; `roleName` varchar(128) NOT NULL,<br>&nbsp; `companyId` decimal(18,0) NOT NULL,<br>&nbsp; `description` varchar(1024) default NULL,<br>&nbsp; PRIMARY KEY&nbsp; (`roleId`)<br>);</p></blockquote> <blockquote> <p>CREATE TABLE `core_sample_user` (<br>&nbsp; `userId` decimal(18,0) NOT NULL,<br>&nbsp; `userName` varchar(128) NOT NULL,<br>&nbsp; `companyId` decimal(18,0) NOT NULL,<br>&nbsp; `defaultRoleId` decimal(18,0) default NULL,<br>&nbsp; `description` varchar(1024) default NULL,<br>&nbsp; PRIMARY KEY&nbsp; (`userId`)<br>);</p></blockquote> <blockquote> <p>CREATE TABLE `core_sample_user_role` (<br>&nbsp; `userId` decimal(18,0) NOT NULL,<br>&nbsp; `roleId` decimal(18,0) NOT NULL,<br>&nbsp; `pripority` int(11) NOT NULL,<br>&nbsp; PRIMARY KEY&nbsp; (`userId`,`roleId`)<br>);</p></blockquote> <h1>HBM defintion</h1> <p>The definiton of &lt;set&gt;, &lt;bag&gt;, &lt;list&gt; is similar. </p> <h2>Defines a collection whose element type is simple data type.</h2> <p>&lt;class name="SampleCompany" table="core_sample_company"&gt;</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;bag name="roleNames" table="core_sample_role" lazy="false" &gt; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;key column="companyId"/&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;element column="roleName" type="string"/&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/bag&gt; <p>&lt;/class&gt; <p>Query HQL: select c.id, c.name, r from SampleCompany c left join c.roleNames r <h2>Defines a collection whose element type is another mapped java class</h2> <p>&lt;class name="SampleCompany" table="core_sample_company"&gt;&nbsp;&nbsp;&nbsp; </p> <p>&nbsp;&nbsp; &lt;bag name="roles" cascade="none"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;key column="companyId"/&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;one-to-many class="SampleRole" not-found="ignore"/&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/bag&gt;</p> <p>&lt;/class&gt;</p> <p>Query HQL: select c.id, c.name, r.name from SampleCompany c left join c.role r <p>Pay attention that key column is a foreign column of SampleRole table. <h2>Defines a list with list-index</h2> <p>&lt;list&gt; is not a popular element. It request a index column in table. The index column is the index of java List, it has to be a sequence starts from 0. </p> <p>&lt;class name="SampleUser" table="core_sample_user"&gt;</p> <p>&nbsp;&nbsp;&nbsp;&nbsp; &lt;list name="roles" table="core_sample_user_role" cascade="all" lazy="false" &gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;key&gt;&lt;column name="userId" sql-type="integer"/&gt;&lt;/key&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;index column="priority"&gt;&lt;/index&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;many-to-many class="SampleRole"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;column name="roleId"&gt;&lt;/column&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/many-to-many&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/list&gt; <p>&lt;/class&gt; <p>The benifit of &lt;list&gt; is it alwasy sorts list by index column. However, It is hard to resort the list. I tried remove a role from role list and add it to another poisition. When save the role list, an exception throwed: <p>java.sql.BatchUpdateException: Duplicate entry 'user001-role003 for key 1 <p>This should be a hibernate bug. <h2>Defines a bag with relationship table</h2> <p>&lt;class name="SampleRole" table="core_sample_role"&gt;</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;bag name="users" table="core_sample_user_role" cascade="none" lazy="false"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;key&gt;&lt;column name="roleId" sql-type="integer"/&gt;&lt;/key&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;many-to-many class="SampleUser"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;column name="userId"&gt;&lt;/column&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/many-to-many&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/bag&gt; <p>&lt;/class&gt; <ul> <li>Key column is foreign column from relationship table to current table(SampleRole&gt;</li> <li>many-to-many sub column is foreign column from relationship table to target table (SampleUser)</li></ul> <img src ="http://www.blogjava.net/welkinhu/aggbug/155524.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/welkinhu/" target="_blank">Welkin Hu</a> 2007-10-24 11:09 <a href="http://www.blogjava.net/welkinhu/archive/2007/10/24/155524.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Eclipse 3.3下Sysdeo3.2.1配置的几个问题</title><link>http://www.blogjava.net/welkinhu/archive/2007/07/03/127927.html</link><dc:creator>Welkin Hu</dc:creator><author>Welkin Hu</author><pubDate>Tue, 03 Jul 2007 10:06:00 GMT</pubDate><guid>http://www.blogjava.net/welkinhu/archive/2007/07/03/127927.html</guid><wfw:comment>http://www.blogjava.net/welkinhu/comments/127927.html</wfw:comment><comments>http://www.blogjava.net/welkinhu/archive/2007/07/03/127927.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/welkinhu/comments/commentRss/127927.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/welkinhu/services/trackbacks/127927.html</trackback:ping><description><![CDATA[<p>Sysdeo是知名的Tomcat插件。今天在构建eclipse 3.3 + sysdeo3.2.1 + tomcat 6.0.13时，发现如下几个注意点。</p> <ol> <li>Sysdeo主配置项中Tomcat Home是配置Tomcat目录的，注意最后不要加“\”。比如F:\java\tomcat-6.0.13是对了，F:\java\tomcat-6.0.13\就不对了。  <li>Sysdeo advance配置中的Tomcat Base指的是配置Tomcat运行时的基准目录。实际上这个配置项是多余的，可以不配，也不应当配。它必须和Sysdeo主配置项中Tomcat Home一致，否则会有一些Tomcat系统文件找不到。  <li>如果不通过eclipse和Sysdeo，直接运行Tomcat的startup.bat，基准目录是%TOMCAT_HOME%/webapps。而sysdeo设定的基准目录是%TOMCAT_HOME%。这个会导致一些冲突。比如放在%TOMCAT_HOME%/logs/中的log文件的位置，直接运行要写成“../logs/app.log”，运行sysdeo时要写成“logs/app.log”</li></ol><img src ="http://www.blogjava.net/welkinhu/aggbug/127927.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/welkinhu/" target="_blank">Welkin Hu</a> 2007-07-03 18:06 <a href="http://www.blogjava.net/welkinhu/archive/2007/07/03/127927.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>泛型使用小结</title><link>http://www.blogjava.net/welkinhu/archive/2007/06/20/125241.html</link><dc:creator>Welkin Hu</dc:creator><author>Welkin Hu</author><pubDate>Wed, 20 Jun 2007 01:37:00 GMT</pubDate><guid>http://www.blogjava.net/welkinhu/archive/2007/06/20/125241.html</guid><wfw:comment>http://www.blogjava.net/welkinhu/comments/125241.html</wfw:comment><comments>http://www.blogjava.net/welkinhu/archive/2007/06/20/125241.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/welkinhu/comments/commentRss/125241.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/welkinhu/services/trackbacks/125241.html</trackback:ping><description><![CDATA[<p>1、不得在超类中使用通配符，例如</p> <p>public class PojoModelTree extends IdentifiableTree&lt;? extends PojoModel&gt;</p> <p>错误信息如下：</p> <p>The type PojoModelTree cannot extend or implement IdentifiableTree&lt;? extends PojoModel&gt;. A <br>supertype may not specify any wildcard</p> <p>&nbsp;</p> <p>2、只有&lt;? super Type&gt;，没有&lt;E super Type&gt;</p> <p>正确用法：TreeNode&lt;? super Node&gt; getTree()</p> <p>错误用法　&lt;E super Node&gt; E getParent();</p> <p>&nbsp;</p> <p>3、函数返回值类型不应使用通配符：</p> <p>错误用法：TreeNode&lt;? extends T&gt; getChildNode(String pKey)</p> <p>这种用法本身无错，但在赋返回值给其它变量时会报类型不匹配。</p> <p>正确用法：&lt;N extends T&gt; TreeNode&lt;N&gt; getChildNode(String pKey)</p> <p>&nbsp;</p> <p>4、带通配符的泛型集合不能使用add方法。不带通配符的泛型集合也可接收子类元素。</p> <p>错误用法：</p> <p>List&lt;? extends Number&gt; list1 = new ArrayList&lt;Number&gt;();<br>list1.add(new Integer(11)); // 类型不匹配。  <p>第二行报错为：  <p>The method add(capture#1-of ? extends Number) in the type List&lt;capture#1-of ? extends <br>Number&gt; is not applicable for the arguments (Integer)  <p>&nbsp;  <p>正确用法：  <p>List&lt;Number&gt; list1 = new ArrayList&lt;Number&gt;();<br>list1.add(new Integer(11));  <p>&nbsp;  <p>显然，在泛型的检查之下，仍可向集合中添加指定泛型的子类元素。以下代码也是合法的：  <p>List&lt;Number&gt; list1 = new ArrayList&lt;Number&gt;();<br>list1.add(new Integer(11));<br>List&lt;Integer&gt; list2 = new ArrayList&lt;Integer&gt;();<br>list2.add(33);<br>list2.add(44);<br>list1.addAll(list2);  <p>但是，如果写list1=list2就不合法了。  <img src ="http://www.blogjava.net/welkinhu/aggbug/125241.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/welkinhu/" target="_blank">Welkin Hu</a> 2007-06-20 09:37 <a href="http://www.blogjava.net/welkinhu/archive/2007/06/20/125241.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring中如何获取和重置一个BeanFactory对象？或者说，如何动态修改Hibernate Configuration?</title><link>http://www.blogjava.net/welkinhu/archive/2007/06/11/123434.html</link><dc:creator>Welkin Hu</dc:creator><author>Welkin Hu</author><pubDate>Mon, 11 Jun 2007 09:46:00 GMT</pubDate><guid>http://www.blogjava.net/welkinhu/archive/2007/06/11/123434.html</guid><wfw:comment>http://www.blogjava.net/welkinhu/comments/123434.html</wfw:comment><comments>http://www.blogjava.net/welkinhu/archive/2007/06/11/123434.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/welkinhu/comments/commentRss/123434.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/welkinhu/services/trackbacks/123434.html</trackback:ping><description><![CDATA[<p>Spring对Hibernate Session Factory提供了高度封装。如下例所示。</p>
<p>&nbsp;</p>
<p>&lt;bean id="mySessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"&gt;<br>&lt;property name="dataSource" ref="myDataSource"/&gt;<br>&lt;property name="mappingResources"&gt;<br>&lt;list&gt;<br>&lt;value&gt;product.hbm.xml&lt;/value&gt;<br>&lt;/list&gt;<br>&lt;/property&gt;<br>&lt;property name="hibernateProperties"&gt;<br>&lt;value&gt;<br>hibernate.dialect=org.hibernate.dialect.HSQLDialect<br>&lt;/value&gt;<br>&lt;/property&gt;<br>&lt;/bean&gt;
<p>&nbsp;
<p>然而，在我的案例中，因为业务需要，我们必须在运行时加入新的HBM。在单独使用Hibernate的时，只要取到Hiberante Configuration对象，修改一下配置，然后rebuild　session factory就可以了。
<p>可是经Spring这一封装，我只能取到一个只读的SessionFactory对象，无法进行重置。
<p>这里有两种可能方法，但我都不知道如何做。
<p>1，取到LocalSessionFactoryBean对象进行重置。
<p>2，取到Hibernate Configuration对象进行重置。 </p>
<img src ="http://www.blogjava.net/welkinhu/aggbug/123434.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/welkinhu/" target="_blank">Welkin Hu</a> 2007-06-11 17:46 <a href="http://www.blogjava.net/welkinhu/archive/2007/06/11/123434.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring断想：接口粘合</title><link>http://www.blogjava.net/welkinhu/archive/2007/05/11/116668.html</link><dc:creator>Welkin Hu</dc:creator><author>Welkin Hu</author><pubDate>Fri, 11 May 2007 02:00:00 GMT</pubDate><guid>http://www.blogjava.net/welkinhu/archive/2007/05/11/116668.html</guid><wfw:comment>http://www.blogjava.net/welkinhu/comments/116668.html</wfw:comment><comments>http://www.blogjava.net/welkinhu/archive/2007/05/11/116668.html#Feedback</comments><slash:comments>9</slash:comments><wfw:commentRss>http://www.blogjava.net/welkinhu/comments/commentRss/116668.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/welkinhu/services/trackbacks/116668.html</trackback:ping><description><![CDATA[<p>Spring和AOP像一个强力的粘合剂，将完全独立开发的组件（或说是模块，下同）粘合成一个有机的，完整的，可扩展的系统。正是有了这个粘合剂的帮助，才实现了比较彻底的独立组件开发。</p> <p>说它是“比较彻底”，是因为它极大的减少了组件之间的依赖。在你开发一个组件时，基本上不会因为其它组件没有开发完成，或出现Bug而影响到你的进度。</p> <p>但是，它并没有完全消除开发时组件之间的依赖，你仍然得依赖于其它组件提供的API接口。为此，我们不得不把一个组件拆成两个jar包：一个component-api.jar，一个component-impl.jar。由于api包内全是公用接口和Value Object，所以它相对稳定，可以早早的提供出来。这样，一个组件如果要使用另一个组件的服务，在开发阶段，只须依赖于api包即可。运行时，Spring再根据服务提供组件的配置信息找到正确的实现类。</p> <p>&nbsp;</p> <p>昨天，我们在一个讨论会上发现了一个有趣的问题：</p> <p>组件UIA是一个UI组件，它要求提供一些数据，于时它把自己的要求写时接口ProviderA中。组件C1和C2是两个不同的业务组件，它们的UI中都有使用UIA这个组件，而它们都提供了自己的数据接口ServiceC1和ServiceC2。</p> <p>ProviderA所要求的方法，在ServiceC1和ServiceC2中都有提供。这个时候怎么做才能使各个组件完独立呢。</p> <p>一、让ServiceC1和ServiceC2继承于ProviderA。但是这样将导致业务组件依赖于UI组件。有谁知道一共有多少个UI组件需要依赖啊？而且UI组件是最易变的。</p> <p>二、把ProviderA从uia.jar抽出来，放到单独的uia-api.jar中。这个就未免小题大做了。一个系统少说也有几十个UI组件，难道要生成上百个jar包不成？</p> <p>三、把所有的UI的要求的API都抽出来，放到一个ui-api.jar中。这样jar包是少了，可是单个的UI组件就失去独立性了。</p> <p>上面三个方案，不管怎么管理UI组件的接口，都没有解决业务组件依赖于不定数目的UI组件这个问题。</p> <p>&nbsp;</p> <p>最后，我们采用的方法是：把UI组件视为某个业务组件的子组件，UI组件自己不定义接口。所有对外的接口和对UI的接口，都放在业务组件的api包中。</p> <p>这样做，业务组件和UI组件都依赖于api包，互相之间没有依赖。当然，这样做，UI组件就不能游离于大的业务组件之外。而我们采用这个方案的原因也在于，我们认定为多个组件提供服务的UI组件是很少的。</p> <p>&nbsp;</p> <p>显然我们采用的方法只是就事论事的一个折衷方案。并没有解决服务提供者和消费者之间的交叉依赖。</p> <p>要解决这种交叉依赖，我的思路是再提供一个接口之间的粘合机制。消费者定义自己要求的服务接口，提供者定义自己提供的服务接口。最后用一个配置文件，将二者粘合起来。</p> <p>目前，Spring还没有提供这种功能。</p><img src ="http://www.blogjava.net/welkinhu/aggbug/116668.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/welkinhu/" target="_blank">Welkin Hu</a> 2007-05-11 10:00 <a href="http://www.blogjava.net/welkinhu/archive/2007/05/11/116668.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>终于明白了AOP中的方面是什么意思</title><link>http://www.blogjava.net/welkinhu/archive/2007/04/24/113138.html</link><dc:creator>Welkin Hu</dc:creator><author>Welkin Hu</author><pubDate>Tue, 24 Apr 2007 04:07:00 GMT</pubDate><guid>http://www.blogjava.net/welkinhu/archive/2007/04/24/113138.html</guid><wfw:comment>http://www.blogjava.net/welkinhu/comments/113138.html</wfw:comment><comments>http://www.blogjava.net/welkinhu/archive/2007/04/24/113138.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/welkinhu/comments/commentRss/113138.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/welkinhu/services/trackbacks/113138.html</trackback:ping><description><![CDATA[<p>AOP的概念已经热了很久了，我一直不太关注，也不太理解这个面向方面编程中的方面是什么意思。由于AOP和OOP仅一字之差，所以在网上看到大量的文章来拿这两个作对比，看完后还是稀里糊涂的。</p>
<p>&nbsp;</p>
<p>这段时间开始拿Spring做新产品，于是开始仔细研究AOP。这才发现AOP和OOP讲的根本不是同一类的东西。　</p>
<p>AOP中的方面是指问题的一个方面，相对于问题的全部来说的。AOP就是针对问题的一个方面编程。它把一个问题（或者说是需求）从程序级别上拆分成几个方面，让程序员在编程时只关注自己应当关注的方面，而完全忽略其它的方面。最后由AOP框架来组合不同程序员（或者说是不同模块）的程序。</p>
&nbsp;
<p>从这点上来说，AOP的确对模块化开发有很大的裨益。</p>
<br>
<p><br></p>
AOP的好处，主要有两点。<br>一、完全消除了编码时模块之间的依赖，解决了团队开发中一龙拦住千江水的瓶颈问题。当然，做到这一点除了AOP外，还必须做到面向接口编程。<br>二、可以在任意阶段，向已有功能模块中填加新功能，且不侵入原有功能。<br> <img src ="http://www.blogjava.net/welkinhu/aggbug/113138.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/welkinhu/" target="_blank">Welkin Hu</a> 2007-04-24 12:07 <a href="http://www.blogjava.net/welkinhu/archive/2007/04/24/113138.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用Myeclipse的理由</title><link>http://www.blogjava.net/welkinhu/archive/2007/04/18/111509.html</link><dc:creator>Welkin Hu</dc:creator><author>Welkin Hu</author><pubDate>Wed, 18 Apr 2007 02:05:00 GMT</pubDate><guid>http://www.blogjava.net/welkinhu/archive/2007/04/18/111509.html</guid><wfw:comment>http://www.blogjava.net/welkinhu/comments/111509.html</wfw:comment><comments>http://www.blogjava.net/welkinhu/archive/2007/04/18/111509.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.blogjava.net/welkinhu/comments/commentRss/111509.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/welkinhu/services/trackbacks/111509.html</trackback:ping><description><![CDATA[<p>Myeclipse无疑是最优秀的Java开发平台之一。它以年费方式销售，标准版31.75美元，专业版52.95美元。对老美来说实在是太便宜了。但换成人民币可就不菲。</p>
<p>这里列几个Myelipse做得好与不好的地方，供大家参考。以下为个人体验，不代表官方意见:)</p>
<p>用Myeclipse的理由：</p>
<ol>
    <li>可视化的HTML/JSP/JSF编辑器。</li>
    <li>JSP, Javascripte调试功能</li>
    <li>良好的XML编辑器。</li>
    <li>良好的Hibernate集成。</li>
</ol>
<p>在以上几个方面，Bea　workshop都有相关功能，而且界面做得非常好。可惜一来价钱太贵，二来在我的机子上出现茂名其妙的bug，所以就放弃了。</p>
<p>Myeclipse使用Hibernate Tools集成了很多功能，除了HQL编辑器的集成我不满意外，其它的都不错。</p>
<p>XML编辑器，个人一直很纳闷为什么eclipse本身不提供一个这样的插件，居然缺省用普通文本编辑器编辑XML。其它开源的XML插件都差强人意，收费倒是有一些。但仅为XML买一个插件，有点冤。Myeclipse的刚刚够用，好！</p>
<p>开源的插件中，没有可视化的HTML/JSP/JSF编辑器。想要这个功能，只能选Myeclipse或Bea workshop了。</p>
<p>再说说Myelipse做得不好的地方。</p>
<ol>
    <li>UML功能，可用性很不好，没有MDA，一些开源软件都做得比它好。</li>
    <li>项目粒度过细，做一个ear，至少要做三个项目：ear, war，ejb。</li>
    <li>图片编辑，这是个鸡肋功能。</li>
    <li>对eclipse, hibernate, spring等开源软件的新版本支持不及时。</li>
</ol>
<p>UML和图片编辑是Myelipse专业本才有的功能。如此看来，用标准版就足够满足我的需要。但是标准版中没有Java script 调试功能，这个确实不爽。</p>
<p>最后说说Netbeans. Netbeans 6中提供了UML功能，虽然易用性上不及Rose和Powerdesigner，但是比一般的开源UML工具好用。如果它再提供可视化的HTML/JSP开发，我就转向Netbeans了。说来也奇怪，Netbeans支持可视化的JSF开发，却不支持可视化的HTML/JSP开发。</p>
<br>
<p><br></p>
<p>2007-4-27: 这两天受到UML功能的吸引，再次试了一下Netbeans5.5和6.0M8。6.0M8还很不稳定，经常有些错误框跳出来。两个版本都通过mavenide2这个插件支持maven。但是支持的很不好。所有的maven项目都不能单独debug一个java class，全部要求在Junit下运行。看来还不是用netbeans的时候。</p><img src ="http://www.blogjava.net/welkinhu/aggbug/111509.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/welkinhu/" target="_blank">Welkin Hu</a> 2007-04-18 10:05 <a href="http://www.blogjava.net/welkinhu/archive/2007/04/18/111509.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>实测显示Hibernate的batch_size配置没有作用</title><link>http://www.blogjava.net/welkinhu/archive/2007/03/27/106612.html</link><dc:creator>Welkin Hu</dc:creator><author>Welkin Hu</author><pubDate>Tue, 27 Mar 2007 02:43:00 GMT</pubDate><guid>http://www.blogjava.net/welkinhu/archive/2007/03/27/106612.html</guid><wfw:comment>http://www.blogjava.net/welkinhu/comments/106612.html</wfw:comment><comments>http://www.blogjava.net/welkinhu/archive/2007/03/27/106612.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.blogjava.net/welkinhu/comments/commentRss/106612.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/welkinhu/services/trackbacks/106612.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Insert title here														为了验证						Hibernate						批量数据插入的性能，选择合适的						batchsize						，我做了一个						benchmark						的测试。可是测试的结果非常奇怪。						Jdbc.batch_size						的设置对性能基本没有影响。...&nbsp;&nbsp;<a href='http://www.blogjava.net/welkinhu/archive/2007/03/27/106612.html'>阅读全文</a><img src ="http://www.blogjava.net/welkinhu/aggbug/106612.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/welkinhu/" target="_blank">Welkin Hu</a> 2007-03-27 10:43 <a href="http://www.blogjava.net/welkinhu/archive/2007/03/27/106612.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JBoss上的J2EE数据源配置</title><link>http://www.blogjava.net/welkinhu/archive/2007/03/07/102319.html</link><dc:creator>Welkin Hu</dc:creator><author>Welkin Hu</author><pubDate>Wed, 07 Mar 2007 01:51:00 GMT</pubDate><guid>http://www.blogjava.net/welkinhu/archive/2007/03/07/102319.html</guid><wfw:comment>http://www.blogjava.net/welkinhu/comments/102319.html</wfw:comment><comments>http://www.blogjava.net/welkinhu/archive/2007/03/07/102319.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/welkinhu/comments/commentRss/102319.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/welkinhu/services/trackbacks/102319.html</trackback:ping><description><![CDATA[<p>&nbsp;</p> <h3>ejb-jar.xml in ejb/META-INF </h3> <p>&nbsp;</p> <p>&lt;session &gt;<br>... ...</p> <blockquote> <p>&lt;resource-ref&gt;<br>&lt;res-ref-name&gt;XPCDataSource&lt;/res-ref-name&gt;<br>&lt;res-type&gt;javax.sql.DataSource&lt;/res-type&gt;<br>&lt;res-auth&gt;Application&lt;/res-auth&gt;<br>&lt;res-sharing-scope&gt;Shareable&lt;/res-sharing-scope&gt;<br>&lt;/resource-ref&gt; </p></blockquote> <p>&lt;/session&gt;  <p>&nbsp;  <h3>jboss.xml in ejb/META-INF</h3> <p>&nbsp;  <p>&lt;?xml version="1.0"?&gt;<br>&lt;!DOCTYPE jboss PUBLIC<br>"-//JBoss//DTD JBOSS 3.0//EN"<br>"<a href="http://www.jboss.org/j2ee/dtd/jboss_3_0.dtd&quot;">http://www.jboss.org/j2ee/dtd/jboss_3_0.dtd"</a>&gt;  <p>&lt;jboss&gt;<br>&lt;enterprise-beans&gt;<br>&lt;session&gt;<br>&lt;ejb-name&gt;CacheDemo1&lt;/ejb-name&gt;<br>&lt;jndi-name&gt;ejb/CacheDemo1&lt;/jndi-name&gt;<br>&lt;local-jndi-name&gt;ejb/CacheDemo1Local&lt;/local-jndi-name&gt;<br>&lt;resource-ref&gt;<br>&lt;res-ref-name&gt;XPCDataSource&lt;/res-ref-name&gt;<br>&lt;jndi-name&gt;java:/XPCDataSource&lt;/jndi-name&gt;<br>&lt;/resource-ref&gt;<br>&lt;/session&gt; <br>&lt;/enterprise-beans&gt;<br>&lt;/jboss&gt;  <p>&nbsp;  <h3>web.xml&nbsp; in web/WEB-INF</h3> <p>&lt;resource-ref&gt;<br>&lt;res-ref-name&gt;XPCDataSource&lt;/res-ref-name&gt;<br>&lt;res-type&gt;javax.sql.DataSource&lt;/res-type&gt;<br>&lt;res-auth&gt;Application&lt;/res-auth&gt;<br>&lt;res-sharing-scope&gt;Shareable&lt;/res-sharing-scope&gt;<br>&lt;/resource-ref&gt;  <p>&nbsp;  <h3>jboss-web.xml in web/WEB-INF</h3> <p>&lt;resource-ref&gt;<br>&lt;res-ref-name&gt;XPCDataSource&lt;/res-ref-name&gt;<br>&lt;jndi-name&gt;java:/XPCDataSource&lt;/jndi-name&gt;<br>&lt;/resource-ref&gt;  <p>&nbsp;  <h3>创建Data Source </h3> <p>Context c = new InitialContext();<br>Object obj = c.lookup("java:comp/env/XPCDataSource");<br>DataSource ds = (DataSource)narrow(obj, DataSource.class); <br>connection = ds.getConnection();</p> <p>&nbsp;</p> <h3>取得Transaction</h3> <p>//context is javax.ejb.SessionContext</p> <p>//Transaction should be getten from EJB</p> <p>UserTransaction tx = context.getUserTransaction();</p> <p>&nbsp;</p> <p>Webspere deployer will change ejb-jar.xml. Never put struts to Webspere/lib/ext</p><img src ="http://www.blogjava.net/welkinhu/aggbug/102319.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/welkinhu/" target="_blank">Welkin Hu</a> 2007-03-07 09:51 <a href="http://www.blogjava.net/welkinhu/archive/2007/03/07/102319.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Myeclipse J2EE Project, 折腾死我了。</title><link>http://www.blogjava.net/welkinhu/archive/2007/02/16/100062.html</link><dc:creator>Welkin Hu</dc:creator><author>Welkin Hu</author><pubDate>Fri, 16 Feb 2007 08:15:00 GMT</pubDate><guid>http://www.blogjava.net/welkinhu/archive/2007/02/16/100062.html</guid><wfw:comment>http://www.blogjava.net/welkinhu/comments/100062.html</wfw:comment><comments>http://www.blogjava.net/welkinhu/archive/2007/02/16/100062.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/welkinhu/comments/commentRss/100062.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/welkinhu/services/trackbacks/100062.html</trackback:ping><description><![CDATA[
		<p>这两天因为想测试一下群集Cache，用Myeclipse 建了一个测试程序，快把我折腾死了。</p>
		<p>在Myeclipse的设计中，Project的粒度很细。EAR Project, WAR Project, 和EJB Project是三个不同的Project。它不支持EAR Project包打天下不太一样。</p>
		<p>我按照这个要求，创建了四个项目：EAR, WAR, EJB和一个公用的Pojo Project。</p>
		<p>公司刚刚换用了SubVersion首先涮了我一把。Subeclipse 1.0.1只认一个项目一个项目的check out。一下子把我的四个项目合并成一个什么都不是的大项目。　我只好把这个大项目关掉，再一个一个的导入进来。</p>
		<p>可是碰在新建Subversion库的当口上，项目的服务器路径变动了好几次。每次都要我这么弄几下。迫不得已，装上TortoiseSVN-1.4.3。这东西爽！可以一下子把四个项目全取下来，而且不破坏eclipse项目结构。</p>
		<p>然而，当我打开eclipse，又碰到一个经典问题: subeclipse 1.0.1和TortoiseSVN-1.4.3不兼容，报告说我的subversion客户端太老（其实是它自己老了），直接罢工了。</p>
		<p>左找右找，终于发现有人说subeclipse 1.1.6搞定了这个问题。于是升级，搞定了这个问题。</p>
		<p> </p>
		<p>要说Myeclipse对于EJB和JSP的支持确实漂亮，轻轻松松的就开发完成了。部署并初步运行也是成功的。</p>
		<p>只有一个美中不足：它生成的war包和jar包不能指定名字。在EAR的.mymetadata中，有这么一段配置：</p>
		<blockquote>
				<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 src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
						<span style="COLOR: #0000ff">&lt;</span>
						<span style="COLOR: #800000">project-modules</span>
						<span style="COLOR: #0000ff">&gt;</span>
						<span style="COLOR: #000000">
								<br />
								<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
						</span>
						<span style="COLOR: #0000ff">&lt;</span>
						<span style="COLOR: #800000">project-module<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span>
						<span style="COLOR: #ff0000">type</span>
						<span style="COLOR: #0000ff">="WEB"</span>
						<span style="COLOR: #ff0000">
								<br />
								<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />name</span>
						<span style="COLOR: #0000ff">="Cache Web"</span>
						<span style="COLOR: #ff0000">
								<br />
								<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />id</span>
						<span style="COLOR: #0000ff">="myeclipse.1171417787608"</span>
						<span style="COLOR: #ff0000">
								<br />
								<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />context-root</span>
						<span style="COLOR: #0000ff">="/cache"</span>
						<span style="COLOR: #ff0000">
								<br />
								<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />j2ee-spec</span>
						<span style="COLOR: #0000ff">="1.4"</span>
						<span style="COLOR: #ff0000">
								<br />
								<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />archive</span>
						<span style="COLOR: #0000ff">="Cache Web.war"</span>
						<span style="COLOR: #0000ff">&gt;</span>
						<span style="COLOR: #000000">
								<br />
								<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
						</span>
						<span style="COLOR: #0000ff">&lt;</span>
						<span style="COLOR: #800000">attributes</span>
						<span style="COLOR: #0000ff">&gt;</span>
						<span style="COLOR: #000000">
								<br />
								<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
						</span>
						<span style="COLOR: #0000ff">&lt;</span>
						<span style="COLOR: #800000">attribute </span>
						<span style="COLOR: #ff0000">name</span>
						<span style="COLOR: #0000ff">="webrootdir"</span>
						<span style="COLOR: #ff0000"> value</span>
						<span style="COLOR: #0000ff">="/root"</span>
						<span style="COLOR: #ff0000"> </span>
						<span style="COLOR: #0000ff">/&gt;</span>
						<span style="COLOR: #000000">
								<br />
								<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
						</span>
						<span style="COLOR: #0000ff">&lt;/</span>
						<span style="COLOR: #800000">attributes</span>
						<span style="COLOR: #0000ff">&gt;</span>
						<span style="COLOR: #000000">
								<br />
								<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
						</span>
						<span style="COLOR: #0000ff">&lt;/</span>
						<span style="COLOR: #800000">project-module</span>
						<span style="COLOR: #0000ff">&gt;</span>
						<span style="COLOR: #000000">
								<br />
								<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
						</span>
						<span style="COLOR: #0000ff">&lt;</span>
						<span style="COLOR: #800000">project-module<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span>
						<span style="COLOR: #ff0000">type</span>
						<span style="COLOR: #0000ff">="EJB"</span>
						<span style="COLOR: #ff0000">
								<br />
								<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />name</span>
						<span style="COLOR: #0000ff">="Cache Ejb"</span>
						<span style="COLOR: #ff0000">
								<br />
								<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />id</span>
						<span style="COLOR: #0000ff">="myeclipse.1171417692847"</span>
						<span style="COLOR: #ff0000">
								<br />
								<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />j2ee-spec</span>
						<span style="COLOR: #0000ff">="1.4"</span>
						<span style="COLOR: #ff0000">
								<br />
								<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />archive</span>
						<span style="COLOR: #0000ff">="Cache Ejb.jar"</span>
						<span style="COLOR: #ff0000"> </span>
						<span style="COLOR: #0000ff">/&gt;</span>
						<span style="COLOR: #000000">
								<br />
								<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
						</span>
						<span style="COLOR: #0000ff">&lt;/</span>
						<span style="COLOR: #800000">project-modules</span>
						<span style="COLOR: #0000ff">&gt;</span>
				</div>
				<p> </p>
		</blockquote>
		<p>包名中带空格可不是我的风格。我尝试修改上面的archive属性。但是最后生成的EAR中，包名还是照旧。很有可能archive属性根本就没有作用。Myeclipse简单的拿工程名做包名。</p>
		<p> </p>
		<p>没办法，将就过吧。继续测试。Pojo是个单独的Hibernate Pojo项目。EJB和JSP都有引用到。</p>
		<p>在EJB中，调用Pojo得到一个List，里面的元素是Order对象。在EJB中从Object转成Order成功。但在JSP中转型时，碰到一个极为古怪的问题：ClassCastException。</p>
		<p>调用EJB得到List都成功了，可怎么从中转出Order对象会出问题呢？打开Debug看看，List中的确是Order对象啊！太古怪了！</p>
		<p>没救了，死马当活马医吧。把远程EJB调用改成本地EJB调用——问题照旧！检查所有配置文件，都简单得不可能出问题啊！</p>
		<p>……神啊，救救我吧。</p>
		<p>最后，在检查部署后的文件时发现了问题。WAR包和EJB包各自把Pojo项目中的所有classs合并了进来。这样在一个EAR中，每个pojo的class都有两份。JSP和EJB各引用各的，从而导致了类型不匹配。</p>
		<p>问题的原因在于Myeclipse中指定的部署方法不对。为了省事，我在WAR和EJB的部署配置中，都选择了“Merge dependent Java Project Delopyment"。如下图所示。</p>
		<p>
				<a href="/images/blogjava_net/welkinhu/WindowsLiveWriter/MyeclipseJ2EEProject_E3F1/image%7B0%7D%5B2%5D.png" atomicselection="true">
						<img style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height="103" src="http://www.blogjava.net/images/blogjava_net/welkinhu/WindowsLiveWriter/MyeclipseJ2EEProject_E3F1/image%7B0%7D_thumb.png" width="350" border="0" />
				</a>
		</p>
		<p>将部署配置改为Ignore之后，然后手工将pojo包放到jboss server的lib中，问题终于解决了。</p>
		<p>可是这样一来，每次我都得手工的部署pojo包。在EAR的配置中有一个"Jar dependent Java projects"。选中它，并且在引用项目中选中Pojo项目。Myeclipse就会自动将Pojo包部署到EAR中。</p>
		<p>
				<a href="/images/blogjava_net/welkinhu/WindowsLiveWriter/MyeclipseJ2EEProject_E3F1/image%7B0%7D%5B5%5D.png" atomicselection="true">
						<img style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height="116" src="http://www.blogjava.net/images/blogjava_net/welkinhu/WindowsLiveWriter/MyeclipseJ2EEProject_E3F1/image%7B0%7D_thumb%5B1%5D.png" width="367" border="0" />
				</a>
		</p>
		<p>然而，它部署是部署了，没把人家放到classpath中去，一运行就报错：ClassNotFound。这个问题好解决，在EJB和WAR的MANIFEST.MF中加入classpath就可以了。</p>
		<p>一开始我用的是pojo.jar这个名字，放到classpath中后运行成功。</p>
		<p>可是Myeclipse在每次自动生成pojo包时，给的是工程名"cache pojo.jar"，里面有个空格。classpath死活不认识它，用引号引起来也不行。</p>
		<p>问题到了最后，还是没有圆满解决——早知今日，我还不如直接用个ant building呢！</p>
<img src ="http://www.blogjava.net/welkinhu/aggbug/100062.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/welkinhu/" target="_blank">Welkin Hu</a> 2007-02-16 16:15 <a href="http://www.blogjava.net/welkinhu/archive/2007/02/16/100062.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JDBC monitor: TronTrackSQL and P6SPY</title><link>http://www.blogjava.net/welkinhu/archive/2007/02/08/98683.html</link><dc:creator>Welkin Hu</dc:creator><author>Welkin Hu</author><pubDate>Thu, 08 Feb 2007 02:38:00 GMT</pubDate><guid>http://www.blogjava.net/welkinhu/archive/2007/02/08/98683.html</guid><wfw:comment>http://www.blogjava.net/welkinhu/comments/98683.html</wfw:comment><comments>http://www.blogjava.net/welkinhu/archive/2007/02/08/98683.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/welkinhu/comments/commentRss/98683.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/welkinhu/services/trackbacks/98683.html</trackback:ping><description><![CDATA[<p>&nbsp;</p> <p><a href="http://www.wujianrong.com/archives/2006/11/jdbc.ht...">http://www.wujianrong.com/archives/2006/11/jdbc.ht...</a></p><img src ="http://www.blogjava.net/welkinhu/aggbug/98683.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/welkinhu/" target="_blank">Welkin Hu</a> 2007-02-08 10:38 <a href="http://www.blogjava.net/welkinhu/archive/2007/02/08/98683.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>myeclipse中右键菜单无效</title><link>http://www.blogjava.net/welkinhu/archive/2007/02/01/97137.html</link><dc:creator>Welkin Hu</dc:creator><author>Welkin Hu</author><pubDate>Thu, 01 Feb 2007 01:15:00 GMT</pubDate><guid>http://www.blogjava.net/welkinhu/archive/2007/02/01/97137.html</guid><wfw:comment>http://www.blogjava.net/welkinhu/comments/97137.html</wfw:comment><comments>http://www.blogjava.net/welkinhu/archive/2007/02/01/97137.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/welkinhu/comments/commentRss/97137.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/welkinhu/services/trackbacks/97137.html</trackback:ping><description><![CDATA[Right-click contex menu doesn't work<a href="http://www.myeclipseide.com/index.php?name=PNphpBB2&amp;file=viewtopic&amp;t=15728"><br />http://www.myeclipseide.com/index.php?name=PNphpBB2&amp;file=viewtopic&amp;t=15728</a><p><a href="http://www.eclipseworld.org/bbs/read.php?tid=9920">http://www.eclipseworld.org/bbs/read.php?tid=9920</a><br /><br /><span class="tpc_content"><font size="2">This is a known problem when installing the 5.1 release of MYEclipse into an install of Eclipse that has the JST and WST plugins already installed (it supreceedes our versions of the plugin that need to get loaded).<br /><br />The workaround is to load the manage configuration dialog from Help &gt; Software Updates &gt; Mangae Configuration. Then find the JST and WST plugins from your Eclipse install (probably under WTP) and disable them, then restart.</font></span></p><img src ="http://www.blogjava.net/welkinhu/aggbug/97137.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/welkinhu/" target="_blank">Welkin Hu</a> 2007-02-01 09:15 <a href="http://www.blogjava.net/welkinhu/archive/2007/02/01/97137.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java IDE与开发工具试用印象</title><link>http://www.blogjava.net/welkinhu/archive/2007/01/28/96383.html</link><dc:creator>Welkin Hu</dc:creator><author>Welkin Hu</author><pubDate>Sun, 28 Jan 2007 09:27:00 GMT</pubDate><guid>http://www.blogjava.net/welkinhu/archive/2007/01/28/96383.html</guid><wfw:comment>http://www.blogjava.net/welkinhu/comments/96383.html</wfw:comment><comments>http://www.blogjava.net/welkinhu/archive/2007/01/28/96383.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/welkinhu/comments/commentRss/96383.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/welkinhu/services/trackbacks/96383.html</trackback:ping><description><![CDATA[
		<p>目前Java IDE的主流自然是eclipse系列，我一直用的也是这个。在Sun积极宣传Netbeans5.5的时候，我也试用了一下，并没有找到从eclipse转移过去的理由。我对它的不满意主要有两点：<br />1、没有所见即所得的JSP/HTML编辑器。<br />2、没有为Hibernate提供开发支持。<br />Netbeans5.5在java 6下的桌面开发能力很强，不过短期内我还用不上。</p>
		<p>下面重点说说Eclipse平台下的一些开发工具。</p>
		<p>1、JSP/HTML编辑工具<br />Lomboz是开源的JSP编辑器，不过它不支持所见即所得的可视化编辑。虽然我并不喜欢在可视化设计界面中通过拖拉来调整页面。但是它对代码的快速定位是我所需要的。<br />Bea Workshop for JSP的确精彩，不过它要求把所有的JSP一个WEB-INF的目录。我的项目很大，每个模块都有独立的JSP目录，这个要求很烦的。好像这个目录可以配置（但是必须有），不过由于其它原因，我已经放弃了。<br />我现在选的是MyEclipse，它的JSP编辑器做得不如Bea Workshop精细和强大，但是自由，够用。另外，MyEclipse比Bea Workshop便宜得多，有可能说服老板买单。不过，MyEclipse集成的Hibernate功能着实让我光火了很长的时间。</p>
		<p>2. Hibernate集成工具<br />在Eclipse中集成Hibernate开发的有三种：Hibernate官方出的Hibernate Tools, Myeclipse和Bea Workshop。Jbuilder 2007也部分支持Hibernate。Hibernate Tools是开源的，其它的工具都是在它的基础上进行增强而来的。</p>
		<p>如果使用Ant命令来操作Hibernate Tools，你会发现它非常强大，可以灵活的在表，HBM和pojo间互相转换。可是它的Eclipse集成太狠了点，只要求一个逆向工程的配置文件，就可以根据数据库表生成所有的HBM和pojo。这个功能貌似一步到位，其实很不灵活。<br />（1）如何写好HBM是很有学问的，我经常需要细心的调理好HBM再生成pojo。<br />（2）每次生成时都一刀切的做法对于增量开发来说是个灾难。好不容易调理好的HBM和Pojo，一下子全被冲掉了。<br />（3）它的数据库连接也有个问题，不会过滤Schema，每次都把所有的数据库列出来。我们的开发数据库服务器上安装有三四十个数据库，想想多么恐怖啊。<br />Hibernate Tools最强的功能，当数HQL编辑器。可以查错，可以检查最终生成的SQL，可以得到运行结果，可以添加参数。这些功能实在是太有用了。</p>
		<p>Myeclipse对Hibernate Tools进行了改进。所以它和原生的Hibernate Tools共存时会发生一些奇怪的问题。Myeclipse中有两个改进非常棒：指定数据库Schema（再也不用在三四个数据库中找我的那份试验田了），根据选中的HBM生成Pojo（放心大胆的用吧，已经做好的HBM和Pojo不会再被冲掉了）。<br />不过，Myeclipse对HQL编辑器的改进就有点让人光火了。首先是连接问题，横竖就是连不上数据库，左找右找找不到原因，最后把Eclipse workspace重建，把相同的配置连接，一下子又可以了。<br />其次，Myeclipse没有提供新建HQL编辑器的菜单，而是在我手工建立一个hql的文件后，在打开它时调用HQL编辑器！打开的过程可能涉及到数据库连接，非常慢。如果你在退出eclipse中没有关掉HQL文件，那么再次进入eclipse的时候，您先去喝杯茶，慢慢等吧。</p>
		<p>Bea Workshop各方面做得都非常精致，Hiberenate集成也不例外，各类编辑器的功能布局明了易用。但是我在试用时碰到一个难以置信的致命的bug：所有Bea Workshop编辑器和对话框中的文本输入框基本不接收光标！<br />这是什么概念？就是说你没法点进文本框，没法输入任何东西。我唯一成功的一次是在没有光标的情况下，乱打了几个字母再回车。对话框没有显示任何东西直接关闭，但在主编辑器中我打的字母显示了出来。不过除了文本框外，其它的如下拉框，选择框都正常。<br />哪个开发人员会出这么离谱的Bug啊！我试过两台机，问题一模一样。难道是因为我的JDK是1.5的缘故？！<br />不管什么原因，我是没办法再试下去了，只好将其请出了我的电脑。在请出之前，通过菜单检查，没有发现指定HBM生成Pojo的功能。这两大原因，足够我放弃它了。</p>
		<p>Jbuilder 2007做得太强了。我用它明显感觉小脚穿大鞋。人家根本不希罕Hibernate。仅仅把Hiberenate作为EJB 3.0和JPA的一种实现方式。所以根据没有HBM这一说。而且是彻头彻尾的可视化MDA开发。真的需要一个明星团队，在严格的流程支持下，才能玩转Jbuilder　2007。我两个条件都不符合，最重要的是老板嫌它太贵，只能放弃。</p>
		<p>
				<span class="ztags">
						<span class="ztagspace">Technorati</span> : <a class="ztag" href="http://technorati.com/tag/eclipse" rel="tag">eclipse</a>, <a class="ztag" href="http://technorati.com/tag/hibernate" rel="tag">hibernate</a>, <a class="ztag" href="http://technorati.com/tag/java" rel="tag">java</a>, <a class="ztag" href="http://technorati.com/tag/jsp" rel="tag">jsp</a>, <a class="ztag" href="http://technorati.com/tag/myeclipse" rel="tag">myeclipse</a></span>
		</p>
<img src ="http://www.blogjava.net/welkinhu/aggbug/96383.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/welkinhu/" target="_blank">Welkin Hu</a> 2007-01-28 17:27 <a href="http://www.blogjava.net/welkinhu/archive/2007/01/28/96383.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JDO 2.0 vs Hibernate 3.2.1 (I)</title><link>http://www.blogjava.net/welkinhu/archive/2007/01/24/95685.html</link><dc:creator>Welkin Hu</dc:creator><author>Welkin Hu</author><pubDate>Wed, 24 Jan 2007 02:50:00 GMT</pubDate><guid>http://www.blogjava.net/welkinhu/archive/2007/01/24/95685.html</guid><wfw:comment>http://www.blogjava.net/welkinhu/comments/95685.html</wfw:comment><comments>http://www.blogjava.net/welkinhu/archive/2007/01/24/95685.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/welkinhu/comments/commentRss/95685.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/welkinhu/services/trackbacks/95685.html</trackback:ping><description><![CDATA[<p>最近正在做JDO 2.0与Hibernate的方案选择。JDO实现选的是Jpox，个别问题也参看了Bea Kodo 4.1。但是今天发现JDO2.0在一项关键功能上无法满足要求，有可能被直接叫停。</p> <p>这个功能就是动态O/R Mapping。就是说，在系统运行时，动态生成一份新的O/R Mapping，或者往原来的O/R Mapping中添加字段。并且这些改动，应当无须重启Application Server就能生效。</p> <p>Hibernate虽然也没有很好的支持这一点，但是提供了可实现的渠道。</p> <p>1. 重建SessionFactory时可以添加新的Mapping文件。</p> <p>2. Dynamic Component可以在pojo中将动态字段表达为Map，这样只用修改Mapping文件，不用修改java类。</p> <p>3. Hibernate 3.2.1还提供不用java类的Mapping方式。在Mapping文件中，只指定entity-name，不指定class，Hiberante就会使用Map来表达它。</p> <p>Jpox没有提供上面三种渠道中的任何一种。我已经在Jpox forum上发贴问了，不知道什么时候能有答复。</p> <p>Kodo的文档中也没有直接提到，本想去bea发贴的，但是网速太慢。</p><img src ="http://www.blogjava.net/welkinhu/aggbug/95685.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/welkinhu/" target="_blank">Welkin Hu</a> 2007-01-24 10:50 <a href="http://www.blogjava.net/welkinhu/archive/2007/01/24/95685.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate的多对一关系是如何延迟加载的？</title><link>http://www.blogjava.net/welkinhu/archive/2007/01/17/94510.html</link><dc:creator>Welkin Hu</dc:creator><author>Welkin Hu</author><pubDate>Wed, 17 Jan 2007 13:54:00 GMT</pubDate><guid>http://www.blogjava.net/welkinhu/archive/2007/01/17/94510.html</guid><wfw:comment>http://www.blogjava.net/welkinhu/comments/94510.html</wfw:comment><comments>http://www.blogjava.net/welkinhu/archive/2007/01/17/94510.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/welkinhu/comments/commentRss/94510.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/welkinhu/services/trackbacks/94510.html</trackback:ping><description><![CDATA[
		<p>一直以为，在Hiberenate中用多对一关系表达外键，并设置为延迟加载时，Hibernate不会在查主表时去查引用表。今天的测试却发现不是这么回事。</p>
		<p>我定义了一个Topic类，其中有一个外键引用Company类：</p>
		<p> </p>
		<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 src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				<span style="COLOR: #0000ff">&lt;</span>
				<span style="COLOR: #800000">many-to-one </span>
				<span style="COLOR: #ff0000">name</span>
				<span style="COLOR: #0000ff">="company"</span>
				<span style="COLOR: #ff0000"> class</span>
				<span style="COLOR: #0000ff">="Company"</span>
				<span style="COLOR: #ff0000"> lazy</span>
				<span style="COLOR: #0000ff">="no-proxy"</span>
				<span style="COLOR: #0000ff">&gt;</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #0000ff">&lt;</span>
				<span style="COLOR: #800000">column </span>
				<span style="COLOR: #ff0000">name</span>
				<span style="COLOR: #0000ff">="COMPANY"</span>
				<span style="COLOR: #ff0000"> length</span>
				<span style="COLOR: #0000ff">="32"</span>
				<span style="COLOR: #ff0000"> </span>
				<span style="COLOR: #0000ff">/&gt;</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #0000ff">&lt;/</span>
				<span style="COLOR: #800000">many-to-one</span>
				<span style="COLOR: #0000ff">&gt;</span>
		</div>
		<p> </p>
		<p>测试HQL如下：select id, company from Topic</p>
		<p>而我期望的SQL应当是这样：select boid, company from DT_TOPIC. </p>
		<p>结果Hiberate Tools 生成的SQL是这样：</p>
		<p> </p>
		<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 src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				<span style="COLOR: #0000ff">select</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />topic0_.BOID </span>
				<span style="COLOR: #0000ff">as</span>
				<span style="COLOR: #000000"> col_0_0_,<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />topic0_.COMPANY </span>
				<span style="COLOR: #0000ff">as</span>
				<span style="COLOR: #000000"> col_1_0_,<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />company1_.COMPID </span>
				<span style="COLOR: #0000ff">as</span>
				<span style="COLOR: #000000"> COMPID409_,<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />company1_.COMPNAME </span>
				<span style="COLOR: #0000ff">as</span>
				<span style="COLOR: #000000"> COMPNAME409_,<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />company1_.DESCRIPTION </span>
				<span style="COLOR: #0000ff">as</span>
				<span style="COLOR: #000000"> DESCRIPT3_409_,<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />company1_.STATUS </span>
				<span style="COLOR: #0000ff">as</span>
				<span style="COLOR: #000000"> STATUS409_ <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span>
				<span style="COLOR: #0000ff">from</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />DT_TOPIC topic0_ <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span>
				<span style="COLOR: #0000ff">inner</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">join</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />XPC_COMPANY company1_ <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span>
				<span style="COLOR: #0000ff">on</span>
				<span style="COLOR: #000000"> topic0_.COMPANY</span>
				<span style="COLOR: #808080">=</span>
				<span style="COLOR: #000000">company1_.COMPID</span>
		</div>
		<p> </p>
		<p>Hibernate生成的SQL多做了两件影响性能的事情：</p>
		<p>1, 与XPC_COMPANY进行inner join。</p>
		<p>2，把XPC＿COMPANY中的所有字段全取出来了。</p>
		<p>这样还叫什么延迟加载啊？</p>
		<p> </p>
		<p>哪位高手能告诉我这是为什么？</p>
<img src ="http://www.blogjava.net/welkinhu/aggbug/94510.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/welkinhu/" target="_blank">Welkin Hu</a> 2007-01-17 21:54 <a href="http://www.blogjava.net/welkinhu/archive/2007/01/17/94510.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>非凡的Altova StyleVision，同源输出HTML，PDF，RTF。</title><link>http://www.blogjava.net/welkinhu/archive/2006/12/30/90983.html</link><dc:creator>Welkin Hu</dc:creator><author>Welkin Hu</author><pubDate>Sat, 30 Dec 2006 04:26:00 GMT</pubDate><guid>http://www.blogjava.net/welkinhu/archive/2006/12/30/90983.html</guid><wfw:comment>http://www.blogjava.net/welkinhu/comments/90983.html</wfw:comment><comments>http://www.blogjava.net/welkinhu/archive/2006/12/30/90983.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/welkinhu/comments/commentRss/90983.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/welkinhu/services/trackbacks/90983.html</trackback:ping><description><![CDATA[
		<p>如今的XML，在文档生成方面可谓大红大紫。使用XML + XSLT可以动态生成HTML文档和表单。而XML + XSL + FO更可以动态生成PDF/RTF文档。</p>
		<p>所谓动态生成，就是在运行，才将数据放到具有指定DTD/schema的XML文档中，使用预定义的XSL文档生成可供浏览或打印的文档。</p>
		<p>一般来说，生成HTML和PDF的XSLT要分别定义。对于HTML和PDF表现差别较大的文档，有必要使用这种方法。</p>
		<p>但是，对于一些格式要求较高的表单和报表，在HTML和PDF下的表现是基本一致的。这个时候就有必要用同一个样式表输出HTML和PDF。要知道，手工定义一份XSLT可是很费工夫的。</p>
		<p>FO似乎能达到这个目标，它具备足够精细的样式定义，借助FOP等工具，可直接输出PDF等格式。可惜的是，目前的主流浏览器，如IE和firefox，并不能直接显示FO文档。必须将其转换成HTML或XHTML。然后，我没有发现任何的开源工具可以做到这一点。</p>
		<p> </p>
		<p>Altove StyleVision，恰到好处的实现上述目标。</p>
		<p>顾名思义，StyleVision就是用来设计样式表的，它提供一个非常友好的GUI设计界面。它使用一个私有的XML格式(SPS)来保存样式表，这个样式表可转换成生成HTML的XSLT和生成FO的XSLT。</p>
		<p>这样，做为开发方，购买一份Altova StyleVision，用来设计样式表，然后将其生成的XSLT发布给用户，就可以实现同源输出报表了。而最终用户可以不购买Altova StyleVision</p>
		<p>附图：两种动态文档生成方案(在图中体现为两条可选的路线):</p>
		<p> </p>
		<p>
				<a href="/images/blogjava_net/welkinhu/WindowsLiveWriter/AltovaStyleVisionHTMLPDFRTF_AEAA/image%7B0%7D%5B5%5D.png" atomicselection="true">
						<img style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height="532" src="http://www.blogjava.net/images/blogjava_net/welkinhu/WindowsLiveWriter/AltovaStyleVisionHTMLPDFRTF_AEAA/image%7B0%7D_thumb%5B3%5D.png" width="526" border="0" />
				</a>
		</p>
<img src ="http://www.blogjava.net/welkinhu/aggbug/90983.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/welkinhu/" target="_blank">Welkin Hu</a> 2006-12-30 12:26 <a href="http://www.blogjava.net/welkinhu/archive/2006/12/30/90983.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何设计数据库表实现完整的RBAC(基于角色权限控制)</title><link>http://www.blogjava.net/welkinhu/archive/2006/12/27/90345.html</link><dc:creator>Welkin Hu</dc:creator><author>Welkin Hu</author><pubDate>Wed, 27 Dec 2006 09:12:00 GMT</pubDate><guid>http://www.blogjava.net/welkinhu/archive/2006/12/27/90345.html</guid><wfw:comment>http://www.blogjava.net/welkinhu/comments/90345.html</wfw:comment><comments>http://www.blogjava.net/welkinhu/archive/2006/12/27/90345.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/welkinhu/comments/commentRss/90345.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/welkinhu/services/trackbacks/90345.html</trackback:ping><description><![CDATA[<p>RBAC(基于角色的权限控制)是一个老话题了，但是这两天我试图设计一套表结构实现完整的RBAC时，发现存在很多困难。</p> <p>我说的完整的RBAC，是指支持角色树形结构和角色分组。具体来说，应当包含如下权限控制需求：</p> <ol> <li>父级角色可以访问甚至是修改其子级的数据，包含直接子级直到最终子级。  <li>角色可以访问其所在组的数据。  <li>父级角色可以访问其所有子级(从直接子级到最终子级)所在组的数据。</li></ol> <p>而具体到我的系统中，还应当有如下需求。</p> <ol> <li>兼容多种数据库产品。只能用简单的表，视图，存储过程和函数等实现。  <li>同时兼容单条数据处理和批量数据处理的需求。</li></ol> <p>且不论这些具体需求，RBAC的基本表应当如下四个：</p> <ul> <li>roleList表，记录所有的角色和角色组。  <ul> <li>roleId: PK,&nbsp;角色/组的ID，全局唯一，不区分角色和组。  <li>roleName:角色/组的名称。  <li>roleType: R - 角色，G - 组</li></ul> <li>rolePermission表，记录每一个角色/组对每一个对象的权限。  <ul> <li>permissionID: PK, 无特定意义。  <li>role: 角色/组的ID。  <li>object: 对象的ID。  <li>permission: 权限标识，如读，写，删等。</li></ul> <li>roleRelationship表，记录角色/组之间的关系。  <ul> <li>relationId: PK, 无特定意义。  <li>superiorRole: 父角色/组的ID。  <li>role:子角色，子组，成员角色，成员组的ID。  <li>relationship: 关系标识，可在如下设置集中选取一个。  <ul> <li>PG标识：P - 父子关系，G - 组/成员关系。  <li>PPGG标识：在PG集上，再加三种：PP - 间接父级关系，GG - 组内组关系，CG - parentRole是组，childRole的子角色或间接子角色是其成员，或其子组(含间接子组）的成员</li></ul></li></ul> <li>objectList表，记录所有的对象。  <ul> <li>objectId: PK，对象ID，全局唯一。  <li>objectName: 对象名称。  <li>... ...</li></ul></li></ul> <p>&nbsp;</p> <p>分析上述表结构，不难发现，问题的关键在于从rolePermission表中读取数据时，如何限定角色/组的范围.</p> <p>方案一</p> <p>如果角色和组的总量不大，比如在100以内，采用PPGG标识关系，读取数据时是最快的。这个时候的SQL只需要一个输入参数?roleId：</p> <p>SELECT object FROM rolePermission p left join roleRelationship r&nbsp;on p.role = r.role&nbsp;WHERE&nbsp; p.role = ?roleId or r.superiorRole = ?roleId. (尚未验证SQL的正确性)</p> <p>但是，这个方案是以极度冗余roleRelationship表的数据为代价的，比如有100个角色，那么roleRelationship中将会有100 * 100 ＝10,000条记录。而在每次调整角色和R角色组的时候，就要在roleRelationship中一次增加或删除100条记录。这个开销是比较大的。</p> <p>方案二</p> <p>只标识PG，查询时接收的输入参数为一个完整的相关角色列表?roleList。</p> <p>SELECT object FROM rolePermission WHERE role in (?roleList)</p> <p>在系统运行时，这个?roleList通常可以从role hierarchy cache中取到，比较方便。这个方案的主要问题有二：</p> <p>1）如果?roleList过长，使用in判断性能会很差。</p> <p>2）在有些情况下，如报表查询和系统外查询时，取得roleList不太方便。</p> <p>方案三</p> <p>只标识PG，但使用如下三个数据库函数来判断角色/组之间的关系。</p> <ul> <li>boolean isChild(role, parentRole) - 如role为parentRole的子，返回true。  <li>boolean isDescendant(role, ancestorRole) - 如role为ancestorRole的子或间接子级，返回true。  <li>boolean isMember(role, group) - 如role为group的成员或子组的成员，返回true。  <li>boolean descendantIsMember(role, group) - 如role的子或间接子级为group的成员，返回true。  <li>boolean isBelong(role, super) - 如role为super的子，间接子，成员或间接员，或者role的子(含间接子)是super的成员或子组成员，返回true。</li></ul> <p>在查询时，也只需要接收一个?roleId：SELECT object FROM rolePemission WHERE isBelong(?roleId, role)</p> <p>如何写出高性能的数据库函数是实现这个方法的关键。</p> <p>&nbsp;</p> <p>上述方法仅是理论分析，我倾向于方案二。</p> <p>&nbsp;</p> <p>终于想到新的方案了。</p> <p>方案四，</p> <p>结合方案一和方案二，在roleRelationship中，对前两级(也可以是三级或四级)角色，保存其所有的下级角色和组。这样，如果以前两级角色查询数据，就使用方案一，如果以第三级及以下的角色查询数据，就使用方案二。</p> <p>仍以100个角色为例，每个角色要保存三个关系：一级主管角色，二级主管角色，直接主管角色，最多有300条数据。</p> <p>每往角色组中加一个角色，也需要加入三条数据：角色本身，一级主管角色，二级主管角色。</p> <p>但往角色组中加一个子组，需要加入的数据量就大一些：子组本身，子组所有角色，子组所有角色的一级主管角色和二级主管角色。如在多个子组中发现同一角色，可重复保存，但应在表中附加说明是由哪个子组导入的。这样在删除子组时就可以有选择性的删除。</p> <p>但重复子组的情况就比较麻烦，还有等考虑。假充有组g01,g11,g12,g21。g01包含g11和g12，g11和g12分别包含g21。从g01中删除g11时，如何判断g21的去留?看来还是应当在维护时判断应不应当删除。</p><img src ="http://www.blogjava.net/welkinhu/aggbug/90345.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/welkinhu/" target="_blank">Welkin Hu</a> 2006-12-27 17:12 <a href="http://www.blogjava.net/welkinhu/archive/2006/12/27/90345.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>UUID and GUID</title><link>http://www.blogjava.net/welkinhu/archive/2006/12/26/90137.html</link><dc:creator>Welkin Hu</dc:creator><author>Welkin Hu</author><pubDate>Tue, 26 Dec 2006 08:59:00 GMT</pubDate><guid>http://www.blogjava.net/welkinhu/archive/2006/12/26/90137.html</guid><wfw:comment>http://www.blogjava.net/welkinhu/comments/90137.html</wfw:comment><comments>http://www.blogjava.net/welkinhu/archive/2006/12/26/90137.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/welkinhu/comments/commentRss/90137.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/welkinhu/services/trackbacks/90137.html</trackback:ping><description><![CDATA[
		<p>
				<a href="http://tb.blog.csdn.net/TrackBack.aspx?PostId=1406125">http://tb.blog.csdn.net/TrackBack.aspx?PostId=1406125</a>
		</p>
		<p>原来GUID只是UUID的一种实现。</p>
		<p>原来UUID虽长，做数据库主键不但不会影响性能，反而对性能有所帮助。</p>
		<p>有时间我实际测试一下。</p>
<img src ="http://www.blogjava.net/welkinhu/aggbug/90137.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/welkinhu/" target="_blank">Welkin Hu</a> 2006-12-26 16:59 <a href="http://www.blogjava.net/welkinhu/archive/2006/12/26/90137.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Outline feature bug of OpenOffice Calc</title><link>http://www.blogjava.net/welkinhu/archive/2006/12/18/88646.html</link><dc:creator>Welkin Hu</dc:creator><author>Welkin Hu</author><pubDate>Mon, 18 Dec 2006 14:07:00 GMT</pubDate><guid>http://www.blogjava.net/welkinhu/archive/2006/12/18/88646.html</guid><wfw:comment>http://www.blogjava.net/welkinhu/comments/88646.html</wfw:comment><comments>http://www.blogjava.net/welkinhu/archive/2006/12/18/88646.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/welkinhu/comments/commentRss/88646.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/welkinhu/services/trackbacks/88646.html</trackback:ping><description><![CDATA[
		<p>I found a serious bug when using outline feature of OpenOffice Calc.</p>
		<p>1 Group 3 rows</p>
		<p>
				<a href="/images/blogjava_net/welkinhu/WindowsLiveWriter/OutlinefeaturebugofOpenOfficeCalc_13665/image%7B0%7D%5B1%5D.png" atomicselection="true">
						<img style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height="91" src="http://www.blogjava.net/images/blogjava_net/welkinhu/WindowsLiveWriter/OutlinefeaturebugofOpenOfficeCalc_13665/image%7B0%7D.png" width="240" border="0" />
				</a>
		</p>
		<p>2 Collapse the group, summary row (row 3#) was collapsed too.</p>
		<p>
				<a href="/images/blogjava_net/welkinhu/WindowsLiveWriter/OutlinefeaturebugofOpenOfficeCalc_13665/image%7B0%7D%5B3%5D.png" atomicselection="true">
						<img style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height="55" src="http://www.blogjava.net/images/blogjava_net/welkinhu/WindowsLiveWriter/OutlinefeaturebugofOpenOfficeCalc_13665/image%7B0%7D%5B2%5D.png" width="240" border="0" />
				</a>
		</p>
		<p> </p>
		<p>3 However, I can drag and redisplay summary row (row 3#)</p>
		<p>
				<a href="/images/blogjava_net/welkinhu/WindowsLiveWriter/OutlinefeaturebugofOpenOfficeCalc_13665/image%7B0%7D%5B5%5D.png" atomicselection="true">
						<img style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height="77" src="http://www.blogjava.net/images/blogjava_net/welkinhu/WindowsLiveWriter/OutlinefeaturebugofOpenOfficeCalc_13665/image%7B0%7D%5B4%5D.png" width="240" border="0" />
				</a>
		</p>
		<p>4 When I collapse it again, summary row (row 3#)  still be collapsed.</p>
		<p> </p>
		<p>Outline of column has same bug. How could I choose OpenOffice?</p>
<img src ="http://www.blogjava.net/welkinhu/aggbug/88646.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/welkinhu/" target="_blank">Welkin Hu</a> 2006-12-18 22:07 <a href="http://www.blogjava.net/welkinhu/archive/2006/12/18/88646.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java World，为什么你们的国际化实现那么差？</title><link>http://www.blogjava.net/welkinhu/archive/2006/12/06/85971.html</link><dc:creator>Welkin Hu</dc:creator><author>Welkin Hu</author><pubDate>Wed, 06 Dec 2006 14:55:00 GMT</pubDate><guid>http://www.blogjava.net/welkinhu/archive/2006/12/06/85971.html</guid><wfw:comment>http://www.blogjava.net/welkinhu/comments/85971.html</wfw:comment><comments>http://www.blogjava.net/welkinhu/archive/2006/12/06/85971.html#Feedback</comments><slash:comments>8</slash:comments><wfw:commentRss>http://www.blogjava.net/welkinhu/comments/commentRss/85971.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/welkinhu/services/trackbacks/85971.html</trackback:ping><description><![CDATA[
		<p>目前Java开源世界的主流力量来自英语国家，单纯的英语背景导致了许多著名的产品虽然号称支持Unicode，在国际化实现上表现极为糟糕。在此略举近期碰到的二三例。</p>
		<ol>
				<li>JRE中的zip类无法正确保存压缩文件的中文名。为此Ant项目不得不写了自己的zip类。 
</li>
				<li>Eclipse中code assistance的快捷键与经典的winnows输入法开关键冲突，同为Ctrl + Space。为此我不得不将code assistance键换为Alt + Z 
</li>
				<li>Java中很难创建一个全新的locale，必须得从rt.jar中选一个。 
</li>
				<li>Java的locale基本上不允许用户再做用户级别定制。<br /></li>
		</ol>
<img src ="http://www.blogjava.net/welkinhu/aggbug/85971.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/welkinhu/" target="_blank">Welkin Hu</a> 2006-12-06 22:55 <a href="http://www.blogjava.net/welkinhu/archive/2006/12/06/85971.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>First Impress of Eclipse Scrapbook</title><link>http://www.blogjava.net/welkinhu/archive/2006/12/06/85964.html</link><dc:creator>Welkin Hu</dc:creator><author>Welkin Hu</author><pubDate>Wed, 06 Dec 2006 14:38:00 GMT</pubDate><guid>http://www.blogjava.net/welkinhu/archive/2006/12/06/85964.html</guid><wfw:comment>http://www.blogjava.net/welkinhu/comments/85964.html</wfw:comment><comments>http://www.blogjava.net/welkinhu/archive/2006/12/06/85964.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/welkinhu/comments/commentRss/85964.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/welkinhu/services/trackbacks/85964.html</trackback:ping><description><![CDATA[
		<p>今晚闲来无事，浏览了一下Eclipse的Helper，发现一个用于java调试的好工具，叫Scrapbook。这个单词的中文意思是剪贴薄。这个工具的功能有点像VB的立即窗口和VS.net中的命令窗口。当你输入一段简单的java表达式或代码时，它可以立即显示出结果值，或执行代码并输出结果到Console中。这个功能能够大大提高检测小段代码的效率。</p>
<img src ="http://www.blogjava.net/welkinhu/aggbug/85964.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/welkinhu/" target="_blank">Welkin Hu</a> 2006-12-06 22:38 <a href="http://www.blogjava.net/welkinhu/archive/2006/12/06/85964.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java开发工具试用印象</title><link>http://www.blogjava.net/welkinhu/archive/2006/11/08/79814.html</link><dc:creator>Welkin Hu</dc:creator><author>Welkin Hu</author><pubDate>Wed, 08 Nov 2006 04:16:00 GMT</pubDate><guid>http://www.blogjava.net/welkinhu/archive/2006/11/08/79814.html</guid><wfw:comment>http://www.blogjava.net/welkinhu/comments/79814.html</wfw:comment><comments>http://www.blogjava.net/welkinhu/archive/2006/11/08/79814.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/welkinhu/comments/commentRss/79814.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/welkinhu/services/trackbacks/79814.html</trackback:ping><description><![CDATA[
		<p>
				<span class="ztags">
						<span class="ztagspace">目前Java IDE的主流自然是eclipse系列，我一直用的也是这个。在Sun积极宣传Netbeans5.5的时候，我也试用了一下，并没有找到从eclipse转移过去的理由。我对它的不满意主要有两点：<br />1、没有所见即所得的JSP/HTML编辑器。<br />2、没有为Hibernate提供开发支持。<br />Netbeans5.5在java 6下的桌面开发能力很强，不过短期内我还用不上。</span>
				</span>
		</p>
		<p>
				<span class="ztags">
						<span class="ztagspace">下面重点说说Eclipse平台下的一些开发工具。</span>
				</span>
		</p>
		<p>
				<span class="ztags">
						<span class="ztagspace">1、JSP/HTML编辑工具<br />Lomboz是开源的JSP编辑器，不过它不支持所见即所得的可视化编辑。虽然我并不喜欢在可视化设计界面中通过拖拉来调整页面。但是它对代码的快速定位是我所需要的。<br />Bea Workshop for JSP的确精彩，不过它要求把所有的JSP一个WEB-INF的目录。我的项目很大，每个模块都有独立的JSP目录，这个要求很烦的。好像这个目录可以配置（但是必须有），不过由于其它原因，我已经放弃了。<br />我现在选的是MyEclipse，它的JSP编辑器做得不如Bea Workshop精细和强大，但是自由，够用。另外，MyEclipse比Bea Workshop便宜得多，有可能说服老板买单。不过，MyEclipse集成的Hibernate功能着实让我光火了很长的时间。</span>
				</span>
		</p>
		<p>
				<span class="ztags">
						<span class="ztagspace">2. Hibernate集成工具<br />在Eclipse中集成Hibernate开发的有三种：Hibernate官方出的Hibernate Tools, Myeclipse和Bea Workshop。Jbuilder 2007也部分支持Hibernate。Hibernate Tools是开源的，其它的工具都是在它的基础上进行增强而来的。</span>
				</span>
		</p>
		<p>
				<span class="ztags">
						<span class="ztagspace">如果使用Ant命令来操作Hibernate Tools，你会发现它非常强大，可以灵活的在表，HBM和pojo间互相转换。可是它的Eclipse集成太狠了点，只要求一个逆向工程的配置文件，就可以根据数据库表生成所有的HBM和pojo。这个功能貌似一步到位，其实很不灵活。<br />（1）如何写好HBM是很有学问的，我经常需要细心的调理好HBM再生成pojo。<br />（2）每次生成时都一刀切的做法对于增量开发来说是个灾难。好不容易调理好的HBM和Pojo，一下子全被冲掉了。<br />（3）它的数据库连接也有个问题，不会过滤Schema，每次都把所有的数据库列出来。我们的开发数据库服务器上安装有三四十个数据库，想想多么恐怖啊。<br />Hibernate Tools最强的功能，当数HQL编辑器。可以查错，可以检查最终生成的SQL，可以得到运行结果，可以添加参数。这些功能实在是太有用了。</span>
				</span>
		</p>
		<p>
				<span class="ztags">
						<span class="ztagspace">Myeclipse对Hibernate Tools进行了改进。所以它和原生的Hibernate Tools共存时会发生一些奇怪的问题。Myeclipse中有两个改进非常棒：指定数据库Schema（再也不用在三四个数据库中找我的那份试验田了），根据选中的HBM生成Pojo（放心大胆的用吧，已经做好的HBM和Pojo不会再被冲掉了）。<br />不过，Myeclipse对HQL编辑器的改进就有点让人光火了。首先是连接问题，横竖就是连不上数据库，左找右找找不到原因，最后把Eclipse workspace重建，把相同的配置连接，一下子又可以了。<br />其次，Myeclipse没有提供新建HQL编辑器的菜单，而是在我手工建立一个hql的文件后，在打开它时调用HQL编辑器！打开的过程可能涉及到数据库连接，非常慢。如果你在退出eclipse中没有关掉HQL文件，那么再次进入eclipse的时候，您先去喝杯茶，慢慢等吧。</span>
				</span>
		</p>
		<p>
				<span class="ztags">
						<span class="ztagspace">Bea Workshop各方面做得都非常精致，Hiberenate集成也不例外，各类编辑器的功能布局明了易用。但是我在试用时碰到一个难以置信的致命的bug：所有Bea Workshop编辑器和对话框中的文本输入框基本不接收光标！<br />这是什么概念？就是说你没法点进文本框，没法输入任何东西。我唯一成功的一次是在没有光标的情况下，乱打了几个字母再回车。对话框没有显示任何东西直接关闭，但在主编辑器中我打的字母显示了出来。不过除了文本框外，其它的如下拉框，选择框都正常。<br />哪个开发人员会出这么离谱的Bug啊！我试过两台机，问题一模一样。难道是因为我的JDK是1.5的缘故？！<br />不管什么原因，我是没办法再试下去了，只好将其请出了我的电脑。在请出之前，通过菜单检查，没有发现指定HBM生成Pojo的功能。这两大原因，足够我放弃它了。</span>
				</span>
		</p>
		<p>
				<span class="ztags">
						<span class="ztagspace">Jbuilder 2007做得太强了。我用它明显感觉小脚穿大鞋。人家根本不希罕Hibernate。仅仅把Hiberenate作为EJB 3.0和JPA的一种实现方式。所以根据没有HBM这一说。而且是彻头彻尾的可视化MDA开发。真的需要一个明星团队，在严格的流程支持下，才能玩转Jbuilder　2007。我两个条件都不符合，最重要的是老板嫌它太贵，只能放弃。<br /><br />Technorati</span> : <a class="ztag" href="http://technorati.com/tag/JSP" rel="tag">JSP</a>, <a class="ztag" href="http://technorati.com/tag/bea%20JSP%20workshop" rel="tag">bea JSP workshop</a>, <a class="ztag" href="http://technorati.com/tag/lomboz" rel="tag">lomboz</a>, <a class="ztag" href="http://technorati.com/tag/myeclipse" rel="tag">myeclipse</a></span>
		</p>
<img src ="http://www.blogjava.net/welkinhu/aggbug/79814.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/welkinhu/" target="_blank">Welkin Hu</a> 2006-11-08 12:16 <a href="http://www.blogjava.net/welkinhu/archive/2006/11/08/79814.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate Issues</title><link>http://www.blogjava.net/welkinhu/archive/2006/11/06/79436.html</link><dc:creator>Welkin Hu</dc:creator><author>Welkin Hu</author><pubDate>Mon, 06 Nov 2006 08:59:00 GMT</pubDate><guid>http://www.blogjava.net/welkinhu/archive/2006/11/06/79436.html</guid><wfw:comment>http://www.blogjava.net/welkinhu/comments/79436.html</wfw:comment><comments>http://www.blogjava.net/welkinhu/archive/2006/11/06/79436.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/welkinhu/comments/commentRss/79436.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/welkinhu/services/trackbacks/79436.html</trackback:ping><description><![CDATA[
		<p>1. Hibernate can not set null value to primitive types.<br />If data is null in DB, and Hibernate maps it as primitive type, An PropertyAccessException will be th rowed when.<br />Our solution (Discussed with Andy):<br />1) Ensure all Database fileds have default value.<br />2) Wrap all primitive value in DTO. (Andy says this is not essential.)<br /></p>
		<p>2. Debug Hibernate in my product</p>
		<p>In single way one-to-many association, when update, Hibernate always update children's id to null!<br />Only when Bi-one-to-many association, Hibernate can update children correctly.<br />Do not use Hibernate List. It need a index/list-index property, which bind to a DB column, but means the real index of Java List. The List often get many null items.<br />Hibernate set is good. But our DTO already use ArrayList as Collection.<br />Children Id is missing after updated it.<br />Hibernate session.save normally call insert, session.update normally call update.<br />When update Bi-one-to-many association, parent always correct. But always insert children, can not delete and update children. CAUSE: I use a modifiable field as PK, because all children's ID is missing from JSP. In this case, I should manual delete and insert children table.</p>
		<p>BTW, Set can not include duplicated items. However. Our DTO have no PK when it created until saved it to DB. This cause add new item fail.</p>
		<br />
		<p class="zoundry_bw_tags">
				<!-- Tag links generated by Zoundry Blog Writer. Do not manually edit. http://www.zoundry.com -->
				<span class="ztags">
						<span class="ztagspace">Technorati</span> : <a class="ztag" href="http://technorati.com/tag/Hibernate" rel="tag">Hibernate</a>, <a class="ztag" href="http://technorati.com/tag/java" rel="tag">java</a></span>
		</p>
<img src ="http://www.blogjava.net/welkinhu/aggbug/79436.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/welkinhu/" target="_blank">Welkin Hu</a> 2006-11-06 16:59 <a href="http://www.blogjava.net/welkinhu/archive/2006/11/06/79436.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Waiting for JasperIntelligence</title><link>http://www.blogjava.net/welkinhu/archive/2006/05/14/46080.html</link><dc:creator>Welkin Hu</dc:creator><author>Welkin Hu</author><pubDate>Sun, 14 May 2006 07:15:00 GMT</pubDate><guid>http://www.blogjava.net/welkinhu/archive/2006/05/14/46080.html</guid><wfw:comment>http://www.blogjava.net/welkinhu/comments/46080.html</wfw:comment><comments>http://www.blogjava.net/welkinhu/archive/2006/05/14/46080.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/welkinhu/comments/commentRss/46080.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/welkinhu/services/trackbacks/46080.html</trackback:ping><description><![CDATA[
		<p>JasperSoft now provide many powerful extension around JasperReports.</p>
		<p>
				<a href="http://jasperintel.sourceforge.net/">http://jasperintel.sourceforge.net/</a>
		</p>
		<p>
				<strong>JasperServer</strong> is specifically designed to provide a Web application around JasperReports. Continuing the philosophy of JasperReports, JasperServer is aimed at providing a managed, stand alone Web reporting environment, as well as being able to be embedded in existing Java Web applications, and services to a variety of technologies through Web services, including the LAMP stack. By focusing on a clean business API and using an advanced inversion of control architecture, JasperServer can be easily integrated and customized for your needs. <br /><br /><strong>JasperIntelligence</strong> is an open source business intelligence platform from JasperSoft, providing common services like security and metadata management, and the capability to easily add additional functionality. The JasperServer is the first service using the JasperIntelligence platform. Following soon will be: <br /></p>
		<ul>
				<li>Report and metadata designers integrated with the platform 
</li>
				<li>OLAP user interfaces 
</li>
				<li>Data warehouse management environments 
</li>
				<li>Data integration services (ETL) </li>
		</ul>
		<p>
				<span class="ftitle" style="PADDING-LEFT: 5px; LINE-HEIGHT: 30px">
						<span style="FONT-SIZE: 2em">
								<span class="ftitle" style="PADDING-LEFT: 5px; LINE-HEIGHT: 30px; FONT-FAMILY: 'Comic Sans MS', 'Brush Script MT',cursive">roadmap</span>
								<br />
						</span>
				</span>
				<br />
				<span class="fsection" style="PADDING-LEFT: 5px">JasperServer Planned Features</span>
		</p>
		<ul style="MARGIN-TOP: 3px; LINE-HEIGHT: 24px">
				<li>Additional report data source types: Hibernate, EJB, POJO, XML 
</li>
				<li>RTF output of reports through the user interface 
</li>
				<li>Additional input control types <br /><span style="PADDING-LEFT: 10px">- Multiple select</span><br /><span style="PADDING-LEFT: 10px">- Select from a database lookup</span></li>
				<li>Import and export of repository contents <br /><span style="PADDING-LEFT: 10px">- Supports moving between repositories ie. test to production</span></li>
				<li>Web services and PHP example application <br /><span style="PADDING-LEFT: 10px">- Support for PDF, Excel and RTF report renderings</span></li>
				<li>iReport plugin for repository browsing and report deployment <br /><span style="PADDING-LEFT: 10px">- Includes Web services for repository management</span></li>
				<li>User Search 
</li>
				<li>Integration of external authentication mechanisms, such as LDAP, JAAS 
</li>
				<li>Session management without the use of cookies 
</li>
				<li>Internationalization of the Web user interface 
</li>
				<li>Management of resource bundles through the user interface 
</li>
				<li>User Preferences 
</li>
				<li>Scheduled report generation <br /><span style="PADDING-LEFT: 10px">- Includes storage of generated content and notifications of new reports to interested users via email</span></li>
				<li>Saving report parameters and rerunning reports using saved parameters 
</li>
				<li>Additional documentation <br /><span style="PADDING-LEFT: 10px">- Architecture overview</span><br /><span style="PADDING-LEFT: 10px">- Javadoc</span></li>
		</ul>
<img src ="http://www.blogjava.net/welkinhu/aggbug/46080.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/welkinhu/" target="_blank">Welkin Hu</a> 2006-05-14 15:15 <a href="http://www.blogjava.net/welkinhu/archive/2006/05/14/46080.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>