﻿<?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/stingh711/category/329.html</link><description>Pretend to be happy when you feel blue, that is not very hard to do.</description><language>zh-cn</language><lastBuildDate>Thu, 17 Jan 2008 15:54:55 GMT</lastBuildDate><pubDate>Thu, 17 Jan 2008 15:54:55 GMT</pubDate><ttl>60</ttl><item><title>用hibernate mapping collections of component class,遇到一个奇怪的问题</title><link>http://www.blogjava.net/stingh711/archive/2008/01/17/176048.html</link><dc:creator>django</dc:creator><author>django</author><pubDate>Thu, 17 Jan 2008 11:48:00 GMT</pubDate><guid>http://www.blogjava.net/stingh711/archive/2008/01/17/176048.html</guid><wfw:comment>http://www.blogjava.net/stingh711/comments/176048.html</wfw:comment><comments>http://www.blogjava.net/stingh711/archive/2008/01/17/176048.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/stingh711/comments/commentRss/176048.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stingh711/services/trackbacks/176048.html</trackback:ping><description><![CDATA[有两个类,一个CustomServer,一个WebSite,直接看代码.<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);"> CustomService {<br />  </span><span style="color: rgb(0, 0, 255);">private</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">long</span><span style="color: rgb(0, 0, 0);"> id;<br />  </span><span style="color: rgb(0, 0, 255);">private</span><span style="color: rgb(0, 0, 0);"> List</span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">WebSite</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"> trustedSites;<br />  </span><span style="color: rgb(0, 0, 255);">private</span><span style="color: rgb(0, 0, 0);"> List</span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">WebSite</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"> blockedSites;<br />  <br />  </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> CustomService() {<br />    </span><span style="color: rgb(0, 0, 255);">this</span><span style="color: rgb(0, 0, 0);">.trustedSites </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> ArrayList</span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">WebSite</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);">();<br />    </span><span style="color: rgb(0, 0, 255);">this</span><span style="color: rgb(0, 0, 0);">.blockedSites </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> ArrayList</span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">WebSite</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);">();<br />  }<br /><br />  </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> List</span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">WebSite</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"> getBlockedSites() {<br />    </span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);"> blockedSites;<br />  }<br /><br />  </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);"> setBlockedSites(List</span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">WebSite</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"> blockedSites) {<br />    </span><span style="color: rgb(0, 0, 255);">this</span><span style="color: rgb(0, 0, 0);">.blockedSites </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> blockedSites;<br />  }<br /><br />  </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">long</span><span style="color: rgb(0, 0, 0);"> getId() {<br />    </span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);"> id;<br />  }<br /><br />  </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);"> setId(</span><span style="color: rgb(0, 0, 255);">long</span><span style="color: rgb(0, 0, 0);"> id) {<br />    </span><span style="color: rgb(0, 0, 255);">this</span><span style="color: rgb(0, 0, 0);">.id </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> id;<br />  }<br /><br />  </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> List</span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">WebSite</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"> getTrustedSites() {<br />    </span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);"> trustedSites;<br />  }<br /><br />  </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);"> setTrustedSites(List</span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">WebSite</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"> trustedSites) {<br />    </span><span style="color: rgb(0, 0, 255);">this</span><span style="color: rgb(0, 0, 0);">.trustedSites </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> trustedSites;<br />  }<br />  <br />  </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);"> addTrustedSites(String site, </span><span style="color: rgb(0, 0, 255);">boolean</span><span style="color: rgb(0, 0, 0);"> isNewData) {<br />    </span><span style="color: rgb(0, 0, 255);">this</span><span style="color: rgb(0, 0, 0);">.trustedSites.add(</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> WebSite(site, isNewData));<br />  }<br />  <br />  </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);"> addBlockedSites(String site, </span><span style="color: rgb(0, 0, 255);">boolean</span><span style="color: rgb(0, 0, 0);"> isNewData) {<br />    </span><span style="color: rgb(0, 0, 255);">this</span><span style="color: rgb(0, 0, 0);">.blockedSites.add(</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> WebSite(site, isNewData));<br />  }<br />}</span></div><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);"> WebSite {<br />  </span><span style="color: rgb(0, 0, 255);">private</span><span style="color: rgb(0, 0, 0);"> String website;<br />  </span><span style="color: rgb(0, 0, 255);">private</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">boolean</span><span style="color: rgb(0, 0, 0);"> isNewData;<br />  <br />  </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> WebSite() {<br />    <br />  }<br /><br />  </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> WebSite(String website) {<br />    </span><span style="color: rgb(0, 0, 255);">this</span><span style="color: rgb(0, 0, 0);">.website </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> website;<br />  }<br /><br />  </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> WebSite(String website, </span><span style="color: rgb(0, 0, 255);">boolean</span><span style="color: rgb(0, 0, 0);"> isNewData) {<br />    </span><span style="color: rgb(0, 0, 255);">this</span><span style="color: rgb(0, 0, 0);">.website </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> website;<br />    </span><span style="color: rgb(0, 0, 255);">this</span><span style="color: rgb(0, 0, 0);">.isNewData </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> isNewData;<br />  }<br /><br />  </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">boolean</span><span style="color: rgb(0, 0, 0);"> isIsNewData() {<br />    </span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);"> isNewData;<br />  }<br /><br />  </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);"> setIsNewData(</span><span style="color: rgb(0, 0, 255);">boolean</span><span style="color: rgb(0, 0, 0);"> isNewData) {<br />    </span><span style="color: rgb(0, 0, 255);">this</span><span style="color: rgb(0, 0, 0);">.isNewData </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> isNewData;<br />  }<br /><br />  </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> String getWebsite() {<br />    </span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);"> website;<br />  }<br /><br />  </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);"> setWebsite(String website) {<br />    </span><span style="color: rgb(0, 0, 255);">this</span><span style="color: rgb(0, 0, 0);">.website </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> website;<br />  }<br /><br />  @Override<br />  </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">boolean</span><span style="color: rgb(0, 0, 0);"> equals(Object obj) {<br />    </span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);"> (</span><span style="color: rgb(0, 0, 255);">this</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">==</span><span style="color: rgb(0, 0, 0);"> obj) {<br />      </span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">true</span><span style="color: rgb(0, 0, 0);">;<br />    }<br />    </span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);"> (obj </span><span style="color: rgb(0, 0, 0);">==</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">null</span><span style="color: rgb(0, 0, 0);">) {<br />      </span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">false</span><span style="color: rgb(0, 0, 0);">;<br />    }<br />    </span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);"> (getClass() </span><span style="color: rgb(0, 0, 0);">!=</span><span style="color: rgb(0, 0, 0);"> obj.getClass()) {<br />      </span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">false</span><span style="color: rgb(0, 0, 0);">;<br />    }<br />    </span><span style="color: rgb(0, 0, 255);">final</span><span style="color: rgb(0, 0, 0);"> WebSite other </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> (WebSite) obj;<br />    </span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);"> (</span><span style="color: rgb(0, 0, 255);">this</span><span style="color: rgb(0, 0, 0);">.website </span><span style="color: rgb(0, 0, 0);">==</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">null</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">||</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">!</span><span style="color: rgb(0, 0, 255);">this</span><span style="color: rgb(0, 0, 0);">.website.equals(other.website)) {<br />      </span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">false</span><span style="color: rgb(0, 0, 0);">;<br />    }<br />    </span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);"> (</span><span style="color: rgb(0, 0, 255);">this</span><span style="color: rgb(0, 0, 0);">.isNewData </span><span style="color: rgb(0, 0, 0);">!=</span><span style="color: rgb(0, 0, 0);"> other.isNewData) {<br />      </span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">false</span><span style="color: rgb(0, 0, 0);">;<br />    }<br />    </span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">true</span><span style="color: rgb(0, 0, 0);">;<br />  }<br /><br />  @Override<br />  </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);"> hashCode() {<br />    </span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);"> hash </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">7</span><span style="color: rgb(0, 0, 0);">;<br />    hash </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">13</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);"> hash </span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);"> (</span><span style="color: rgb(0, 0, 255);">this</span><span style="color: rgb(0, 0, 0);">.website </span><span style="color: rgb(0, 0, 0);">!=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">null</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">?</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">this</span><span style="color: rgb(0, 0, 0);">.website.hashCode() : </span><span style="color: rgb(0, 0, 0);">0</span><span style="color: rgb(0, 0, 0);">);<br />    hash </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">13</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);"> hash </span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);"> (</span><span style="color: rgb(0, 0, 255);">this</span><span style="color: rgb(0, 0, 0);">.isNewData </span><span style="color: rgb(0, 0, 0);">?</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);"> : </span><span style="color: rgb(0, 0, 0);">0</span><span style="color: rgb(0, 0, 0);">);<br />    </span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);"> hash;<br />  }<br />  <br />}<br /></span></div><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 0, 255);">&lt;?</span><span style="color: rgb(255, 0, 255);">xml version="1.0"</span><span style="color: rgb(0, 0, 255);">?&gt;</span><span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 0, 255);">&lt;!</span><span style="color: rgb(255, 0, 255);">DOCTYPE hibernate-mapping PUBLIC<br />    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"<br />    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">hibernate-mapping </span><span style="color: rgb(255, 0, 0);">package</span><span style="color: rgb(0, 0, 255);">="model.cnm.cf"</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />  </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">class </span><span style="color: rgb(255, 0, 0);">name</span><span style="color: rgb(0, 0, 255);">="CustomService"</span><span style="color: rgb(255, 0, 0);"> table</span><span style="color: rgb(0, 0, 255);">="custom_services"</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />    </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">id </span><span style="color: rgb(255, 0, 0);">name</span><span style="color: rgb(0, 0, 255);">="id"</span><span style="color: rgb(255, 0, 0);"> column</span><span style="color: rgb(0, 0, 255);">="id"</span><span style="color: rgb(255, 0, 0);"> type</span><span style="color: rgb(0, 0, 255);">="long"</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />      </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">generator </span><span style="color: rgb(255, 0, 0);">class</span><span style="color: rgb(0, 0, 255);">="native"</span><span style="color: rgb(0, 0, 255);">/&gt;</span><span style="color: rgb(0, 0, 0);"><br />    </span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">id</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />    </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">list </span><span style="color: rgb(255, 0, 0);">name</span><span style="color: rgb(0, 0, 255);">="trustedSites"</span><span style="color: rgb(255, 0, 0);"> table</span><span style="color: rgb(0, 0, 255);">="cf_trusted_sites"</span><span style="color: rgb(255, 0, 0);"> cascade</span><span style="color: rgb(0, 0, 255);">="all"</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />      </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">key </span><span style="color: rgb(255, 0, 0);">column</span><span style="color: rgb(0, 0, 255);">="service_id"</span><span style="color: rgb(0, 0, 255);">/&gt;</span><span style="color: rgb(0, 0, 0);"><br />      </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">list-index </span><span style="color: rgb(255, 0, 0);">column</span><span style="color: rgb(0, 0, 255);">="pos"</span><span style="color: rgb(0, 0, 255);">/&gt;</span><span style="color: rgb(0, 0, 0);"><br />      </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">composite-element </span><span style="color: rgb(255, 0, 0);">class</span><span style="color: rgb(0, 0, 255);">="WebSite"</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />        </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">property </span><span style="color: rgb(255, 0, 0);">name</span><span style="color: rgb(0, 0, 255);">="website"</span><span style="color: rgb(255, 0, 0);"> column</span><span style="color: rgb(0, 0, 255);">="site"</span><span style="color: rgb(255, 0, 0);"> type</span><span style="color: rgb(0, 0, 255);">="string"</span><span style="color: rgb(0, 0, 255);">/&gt;</span><span style="color: rgb(0, 0, 0);"><br />        </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">property </span><span style="color: rgb(255, 0, 0);">name</span><span style="color: rgb(0, 0, 255);">="isNewData"</span><span style="color: rgb(255, 0, 0);"> column</span><span style="color: rgb(0, 0, 255);">="isNewData"</span><span style="color: rgb(255, 0, 0);"> type</span><span style="color: rgb(0, 0, 255);">="boolean"</span><span style="color: rgb(0, 0, 255);">/&gt;</span><span style="color: rgb(0, 0, 0);"><br />      </span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">composite-element</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />    </span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">list</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />    </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">list </span><span style="color: rgb(255, 0, 0);">name</span><span style="color: rgb(0, 0, 255);">="blockedSites"</span><span style="color: rgb(255, 0, 0);"> table</span><span style="color: rgb(0, 0, 255);">="cf_blocked_sites"</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />      </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">key </span><span style="color: rgb(255, 0, 0);">column</span><span style="color: rgb(0, 0, 255);">="service_id"</span><span style="color: rgb(0, 0, 255);">/&gt;</span><span style="color: rgb(0, 0, 0);"><br />      </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">index </span><span style="color: rgb(255, 0, 0);">column</span><span style="color: rgb(0, 0, 255);">="pos"</span><span style="color: rgb(0, 0, 255);">/&gt;</span><span style="color: rgb(0, 0, 0);"><br />      </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">composite-element </span><span style="color: rgb(255, 0, 0);">class</span><span style="color: rgb(0, 0, 255);">="WebSite"</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />        </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">property </span><span style="color: rgb(255, 0, 0);">name</span><span style="color: rgb(0, 0, 255);">="website"</span><span style="color: rgb(255, 0, 0);"> column</span><span style="color: rgb(0, 0, 255);">="site"</span><span style="color: rgb(255, 0, 0);"> type</span><span style="color: rgb(0, 0, 255);">="string"</span><span style="color: rgb(0, 0, 255);">/&gt;</span><span style="color: rgb(0, 0, 0);"><br />        </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">property </span><span style="color: rgb(255, 0, 0);">name</span><span style="color: rgb(0, 0, 255);">="isNewData"</span><span style="color: rgb(255, 0, 0);"> column</span><span style="color: rgb(0, 0, 255);">="isNewData"</span><span style="color: rgb(255, 0, 0);"> type</span><span style="color: rgb(0, 0, 255);">="boolean"</span><span style="color: rgb(0, 0, 255);">/&gt;</span><span style="color: rgb(0, 0, 0);"><br />      </span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">composite-element</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />    </span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">list</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />  </span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">class</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">hibernate-mapping</span><span style="color: rgb(0, 0, 255);">&gt;</span></div>CustomService有两个WebSite的list,map到不同的表.接下来是测试代码.<br /><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 128, 128);"> 1</span> <span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);"> CustomServiceTest </span><span style="color: rgb(0, 0, 255);">extends</span><span style="color: rgb(0, 0, 0);"> BaseDaoTestCase {<br /></span><span style="color: rgb(0, 128, 128);"> 2</span> <span style="color: rgb(0, 0, 0);">  </span><span style="color: rgb(0, 0, 255);">private</span><span style="color: rgb(0, 0, 0);"> CustomService service;<br /></span><span style="color: rgb(0, 128, 128);"> 3</span> <span style="color: rgb(0, 0, 0);">  </span><span style="color: rgb(0, 0, 255);">private</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">long</span><span style="color: rgb(0, 0, 0);"> id;<br /></span><span style="color: rgb(0, 128, 128);"> 4</span> <span style="color: rgb(0, 0, 0);">  <br /></span><span style="color: rgb(0, 128, 128);"> 5</span> <span style="color: rgb(0, 0, 0);">  @Test<br /></span><span style="color: rgb(0, 128, 128);"> 6</span> <span style="color: rgb(0, 0, 0);">  </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);"> save() {<br /></span><span style="color: rgb(0, 128, 128);"> 7</span> <span style="color: rgb(0, 0, 0);">    session </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> HibernateUtil.getSession();<br /></span><span style="color: rgb(0, 128, 128);"> 8</span> <span style="color: rgb(0, 0, 0);">    service </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> CustomService();<br /></span><span style="color: rgb(0, 128, 128);"> 9</span> <span style="color: rgb(0, 0, 0);">    service.addBlockedSites(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">www.whitehouse.com</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">, </span><span style="color: rgb(0, 0, 255);">true</span><span style="color: rgb(0, 0, 0);">);<br /></span><span style="color: rgb(0, 128, 128);">10</span> <span style="color: rgb(0, 0, 0);">    service.addBlockedSites(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">www.whitehouse.com</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">, </span><span style="color: rgb(0, 0, 255);">false</span><span style="color: rgb(0, 0, 0);">);<br /></span><span style="color: rgb(0, 128, 128);">11</span> <span style="color: rgb(0, 0, 0);">    <br /></span><span style="color: rgb(0, 128, 128);">12</span> <span style="color: rgb(0, 0, 0);">    service.addTrustedSites(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">www.google.cn</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">, </span><span style="color: rgb(0, 0, 255);">true</span><span style="color: rgb(0, 0, 0);">);<br /></span><span style="color: rgb(0, 128, 128);">13</span> <span style="color: rgb(0, 0, 0);">    service.addTrustedSites(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">www.google.cn</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">, </span><span style="color: rgb(0, 0, 255);">false</span><span style="color: rgb(0, 0, 0);">);<br /></span><span style="color: rgb(0, 128, 128);">14</span> <span style="color: rgb(0, 0, 0);">    <br /></span><span style="color: rgb(0, 128, 128);">15</span> <span style="color: rgb(0, 0, 0);">    <br /></span><span style="color: rgb(0, 128, 128);">16</span> <span style="color: rgb(0, 0, 0);">    session.save(service);<br /></span><span style="color: rgb(0, 128, 128);">17</span> <span style="color: rgb(0, 0, 0);">    id </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> service.getId();<br /></span><span style="color: rgb(0, 128, 128);">18</span> <span style="color: rgb(0, 0, 0);">    session.flush();<br /></span><span style="color: rgb(0, 128, 128);">19</span> <span style="color: rgb(0, 0, 0);">    session.close();<br /></span><span style="color: rgb(0, 128, 128);">20</span> <span style="color: rgb(0, 0, 0);">    <br /></span><span style="color: rgb(0, 128, 128);">21</span> <span style="color: rgb(0, 0, 0);">    session </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> HibernateUtil.getSession();<br /></span><span style="color: rgb(0, 128, 128);">22</span> <span style="color: rgb(0, 0, 0);">    Transaction tr </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">null</span><span style="color: rgb(0, 0, 0);">;<br /></span><span style="color: rgb(0, 128, 128);">23</span> <span style="color: rgb(0, 0, 0);">    </span><span style="color: rgb(0, 0, 255);">try</span><span style="color: rgb(0, 0, 0);"> {<br /></span><span style="color: rgb(0, 128, 128);">24</span> <span style="color: rgb(0, 0, 0);">      tr </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> session.beginTransaction();<br /></span><span style="color: rgb(0, 128, 128);">25</span> <span style="color: rgb(0, 0, 0);">      session.save(service);<br /></span><span style="color: rgb(0, 128, 128);">26</span> <span style="color: rgb(0, 0, 0);">    } </span><span style="color: rgb(0, 0, 255);">catch</span><span style="color: rgb(0, 0, 0);"> (Exception e) {<br /></span><span style="color: rgb(0, 128, 128);">27</span> <span style="color: rgb(0, 0, 0);">      </span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);"> (tr </span><span style="color: rgb(0, 0, 0);">!=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">null</span><span style="color: rgb(0, 0, 0);">) {<br /></span><span style="color: rgb(0, 128, 128);">28</span> <span style="color: rgb(0, 0, 0);">        tr.commit();<br /></span><span style="color: rgb(0, 128, 128);">29</span> <span style="color: rgb(0, 0, 0);">      }<br /></span><span style="color: rgb(0, 128, 128);">30</span> <span style="color: rgb(0, 0, 0);">    } </span><span style="color: rgb(0, 0, 255);">finally</span><span style="color: rgb(0, 0, 0);"> {<br /></span><span style="color: rgb(0, 128, 128);">31</span> <span style="color: rgb(0, 0, 0);">      session.close();<br /></span><span style="color: rgb(0, 128, 128);">32</span> <span style="color: rgb(0, 0, 0);">    }<br /></span><span style="color: rgb(0, 128, 128);">33</span> <span style="color: rgb(0, 0, 0);">    <br /></span><span style="color: rgb(0, 128, 128);">34</span> <span style="color: rgb(0, 0, 0);">    session </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> HibernateUtil.getSession();<br /></span><span style="color: rgb(0, 128, 128);">35</span> <span style="color: rgb(0, 0, 0);">    service </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> getService();<br /></span><span style="color: rgb(0, 128, 128);">36</span> <span style="color: rgb(0, 0, 0);">    assertEquals(</span><span style="color: rgb(0, 0, 0);">2</span><span style="color: rgb(0, 0, 0);">, service.getBlockedSites().size());<br /></span><span style="color: rgb(0, 128, 128);">37</span> <span style="color: rgb(0, 0, 0);">    assertEquals(</span><span style="color: rgb(0, 0, 0);">2</span><span style="color: rgb(0, 0, 0);">, service.getTrustedSites().size());<br /></span><span style="color: rgb(0, 128, 128);">38</span> <span style="color: rgb(0, 0, 0);">  }<br /></span><span style="color: rgb(0, 128, 128);">39</span> <span style="color: rgb(0, 0, 0);">  <br /></span><span style="color: rgb(0, 128, 128);">40</span> <span style="color: rgb(0, 0, 0);">  </span><span style="color: rgb(0, 0, 255);">private</span><span style="color: rgb(0, 0, 0);"> CustomService getService() {<br /></span><span style="color: rgb(0, 128, 128);">41</span> <span style="color: rgb(0, 0, 0);">    </span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);"> (CustomService) session.get(CustomService.</span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);">, id);<br /></span><span style="color: rgb(0, 128, 128);">42</span> <span style="color: rgb(0, 0, 0);">  }<br /></span><span style="color: rgb(0, 128, 128);">43</span> <span style="color: rgb(0, 0, 0);">    <br /></span><span style="color: rgb(0, 128, 128);">44</span> <span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 128, 128);">45</span> <span style="color: rgb(0, 0, 0);">}</span></div>这样写测试是可以过得,但如果从22行-32行改成下面的样子,<span style="color: rgb(0, 0, 0);">service.getBlockedSites().size()和</span><span style="color: rgb(0, 0, 0);">service.getTrustedSites().size()通通都变成了0.<br /><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 128, 128);">1</span> <span style="color: rgb(0, 0, 0);">session </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> HibernateUtil.getSession();<br /></span><span style="color: rgb(0, 128, 128);">2</span> <span style="color: rgb(0, 0, 0);">session.save(service);<br /></span><span style="color: rgb(0, 128, 128);">3</span> <span style="color: rgb(0, 0, 0);">session.flush();<br /></span><span style="color: rgb(0, 128, 128);">4</span> <span style="color: rgb(0, 0, 0);">session.close();</span></div>真的是很奇怪.貌似只有第二次save的时候的提交方式不一样.<br />又给CustomService加了一个name字段,结果表明,在直接用session.flush()和session.close()的时候,根本就没有提交.不过奇怪的是,第一次这样做怎么会提交了.<br /></span><img src ="http://www.blogjava.net/stingh711/aggbug/176048.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stingh711/" target="_blank">django</a> 2008-01-17 19:48 <a href="http://www.blogjava.net/stingh711/archive/2008/01/17/176048.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>netbeans6.0 vs eclipse3.3</title><link>http://www.blogjava.net/stingh711/archive/2007/12/26/170654.html</link><dc:creator>django</dc:creator><author>django</author><pubDate>Wed, 26 Dec 2007 09:48:00 GMT</pubDate><guid>http://www.blogjava.net/stingh711/archive/2007/12/26/170654.html</guid><wfw:comment>http://www.blogjava.net/stingh711/comments/170654.html</wfw:comment><comments>http://www.blogjava.net/stingh711/archive/2007/12/26/170654.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/stingh711/comments/commentRss/170654.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stingh711/services/trackbacks/170654.html</trackback:ping><description><![CDATA[工作上一直用eclipse，最近使用了一些netbeans，发觉netbeans还是一如既往的慢，有点失望。<br />简单的对比一下吧。<br />先说缺点吧：<br /><ol><li>速度慢。有时候editor最大化要点好几次才work。如果打开大的project，eclipse虽然慢但还可以work，netbeans基本上就死在那儿了。</li><li>今天发现有时候键盘会失去响应。</li><li>Junit test，如果测试fail的话，比如说assertNull("xxx should be null", "string")，fail掉以后，message “xxx should be null"需要到output的窗口才可以看到，eclipse整合到一个窗口了。</li><li>插件偏少，比如说hibernate的插件，groovy的插件。</li><li>在我的linux下，错误提示都是乱码...<br /></li></ol>优点：<br /><ol><li>For ruby和rails的版本还蛮好用的。</li><li>觉得最好用的就是code template，eclipse上不能用tab键trigger，而且eclipse里面允许重名的template，所以还要选，哪怕只有一个template。而且，eclipse里template只能在编辑java里使用。<br /></li></ol><img src ="http://www.blogjava.net/stingh711/aggbug/170654.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stingh711/" target="_blank">django</a> 2007-12-26 17:48 <a href="http://www.blogjava.net/stingh711/archive/2007/12/26/170654.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>AJAX on java FAQ (zt)</title><link>http://www.blogjava.net/stingh711/archive/2007/10/16/153247.html</link><dc:creator>django</dc:creator><author>django</author><pubDate>Tue, 16 Oct 2007 05:46:00 GMT</pubDate><guid>http://www.blogjava.net/stingh711/archive/2007/10/16/153247.html</guid><wfw:comment>http://www.blogjava.net/stingh711/comments/153247.html</wfw:comment><comments>http://www.blogjava.net/stingh711/archive/2007/10/16/153247.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/stingh711/comments/commentRss/153247.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stingh711/services/trackbacks/153247.html</trackback:ping><description><![CDATA[
		<a href="https://blueprints.dev.java.net/ajax-faq-zh.html#ajax">https://blueprints.dev.java.net/ajax-faq-zh.html#ajax</a>
		<p style="text-align: right; font-size: 8px;">Blogged with <a href="http://www.flock.com/blogged-with-flock" title="Flock" target="_new">Flock</a></p>
		<!-- technorati tags begin -->
		<p style="font-size: 10px; text-align: right;">Tags: <a href="http://technorati.com/tag/java" rel="tag">java</a>, <a href="http://technorati.com/tag/ajax" rel="tag">ajax</a></p>
		<!-- technorati tags end -->
<img src ="http://www.blogjava.net/stingh711/aggbug/153247.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stingh711/" target="_blank">django</a> 2007-10-16 13:46 <a href="http://www.blogjava.net/stingh711/archive/2007/10/16/153247.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>简单的浏览了一下MANIFEST.MF的用途</title><link>http://www.blogjava.net/stingh711/archive/2007/10/10/151659.html</link><dc:creator>django</dc:creator><author>django</author><pubDate>Wed, 10 Oct 2007 03:10:00 GMT</pubDate><guid>http://www.blogjava.net/stingh711/archive/2007/10/10/151659.html</guid><wfw:comment>http://www.blogjava.net/stingh711/comments/151659.html</wfw:comment><comments>http://www.blogjava.net/stingh711/archive/2007/10/10/151659.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/stingh711/comments/commentRss/151659.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stingh711/services/trackbacks/151659.html</trackback:ping><description><![CDATA[可以用的上的有：
<ol><li>Main-Class 指定程序的入口，这样可以直接用java -jar xxx.jar来运行程序。</li><li>Class-Path 指定jar包的依赖关系，class loader会依据这个路径来搜索class。</li></ol>和versioning，seal有关的，看得懂什么意思，但是不知道会怎样被用到。惭愧...有人知道么？
 <p style="text-align: right; font-size: 8px">Blogged with <a href="http://www.flock.com/blogged-with-flock" title="Flock" target="_new">Flock</a></p><!-- technorati tags begin --><p style="font-size:10px;text-align:right;">Tags: <a href="http://technorati.com/tag/java" rel="tag">java</a></p><!-- technorati tags end --><img src ="http://www.blogjava.net/stingh711/aggbug/151659.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stingh711/" target="_blank">django</a> 2007-10-10 11:10 <a href="http://www.blogjava.net/stingh711/archive/2007/10/10/151659.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>解决2000下设置classpath时报the input line is too long</title><link>http://www.blogjava.net/stingh711/archive/2007/10/08/151182.html</link><dc:creator>django</dc:creator><author>django</author><pubDate>Mon, 08 Oct 2007 14:45:00 GMT</pubDate><guid>http://www.blogjava.net/stingh711/archive/2007/10/08/151182.html</guid><wfw:comment>http://www.blogjava.net/stingh711/comments/151182.html</wfw:comment><comments>http://www.blogjava.net/stingh711/archive/2007/10/08/151182.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/stingh711/comments/commentRss/151182.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stingh711/services/trackbacks/151182.html</trackback:ping><description><![CDATA[在2000下命令行长度好像不能超过2k bytes,超过就会报input line is too long.起java程序的时候,如果依赖的jar包很多,classpath一定很长,这时候会没办法运行.Google了一把,也没找到比较满意的答案.<br />最笨的办法就是把用到的jar包重新再打一个,打成一个.后来在网上看到一篇讲manifest.mf的文章,了解到manifest.mf里面可以通过Class-Path来设置jar包所依赖的包.试了一下,还真的ok.只要在build自己程序的jar包的时候,在manifest.mf里面加上依赖的jar包,这样在用bat起程序的时候,就不用再在classpath里面加这些jar包了.不过build.xml会变得变态一点,比以前稍微难维护一点.有一点需要注意的就是,manifest.mf里面Class-Path的路径是相对其所在的jar包的.比如说这个manifest.mf是包含在test.jar的,那么Class-Path里指定的jar包都是相对于test.jar所在的路径.<br />有空学习一下manifest的其他的用途.<br /><p style="text-align: right; font-size: 8px;">Blogged with <a href="http://www.flock.com/blogged-with-flock" title="Flock" target="_new">Flock</a></p><!-- technorati tags begin --><p style="font-size: 10px; text-align: right;">Tags: <a href="http://technorati.com/tag/java" rel="tag">java</a></p><!-- technorati tags end --><img src ="http://www.blogjava.net/stingh711/aggbug/151182.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stingh711/" target="_blank">django</a> 2007-10-08 22:45 <a href="http://www.blogjava.net/stingh711/archive/2007/10/08/151182.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Jetty, a lightweight java web server?</title><link>http://www.blogjava.net/stingh711/archive/2007/09/29/149639.html</link><dc:creator>django</dc:creator><author>django</author><pubDate>Sat, 29 Sep 2007 09:34:00 GMT</pubDate><guid>http://www.blogjava.net/stingh711/archive/2007/09/29/149639.html</guid><wfw:comment>http://www.blogjava.net/stingh711/comments/149639.html</wfw:comment><comments>http://www.blogjava.net/stingh711/archive/2007/09/29/149639.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/stingh711/comments/commentRss/149639.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stingh711/services/trackbacks/149639.html</trackback:ping><description><![CDATA[最近要学tapestry，不想用tomcat，想换个轻量级一点的web
server，于是找到了jetty。猜一下这个lightweight的server有多大？zip包22m...而且有超多的jar包...不知道怎
么用..为什么不像hsqldb一样，一个jar包搞定...奇怪的是，还有一个单独的startup.jar，而且其他的jar包还必需放在和它同目录
的lib目录一下，才可以起来...

刚看了一下tomcat，6.0的tar包只有5.7m...Can I say jetty sucks?
<p style="text-align: right; font-size: 8px">Blogged with <a href="http://www.flock.com/blogged-with-flock" title="Flock" target="_new">Flock</a></p><!-- technorati tags begin --><p style="font-size:10px;text-align:right;">Tags: <a href="http://technorati.com/tag/java" rel="tag">java</a></p><!-- technorati tags end --><img src ="http://www.blogjava.net/stingh711/aggbug/149639.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stingh711/" target="_blank">django</a> 2007-09-29 17:34 <a href="http://www.blogjava.net/stingh711/archive/2007/09/29/149639.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>A Hibernate util written by groovy</title><link>http://www.blogjava.net/stingh711/archive/2006/12/20/89159.html</link><dc:creator>django</dc:creator><author>django</author><pubDate>Wed, 20 Dec 2006 14:54:00 GMT</pubDate><guid>http://www.blogjava.net/stingh711/archive/2006/12/20/89159.html</guid><wfw:comment>http://www.blogjava.net/stingh711/comments/89159.html</wfw:comment><comments>http://www.blogjava.net/stingh711/archive/2006/12/20/89159.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/stingh711/comments/commentRss/89159.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stingh711/services/trackbacks/89159.html</trackback:ping><description><![CDATA[
		<p>
				<code>Hibernate.groovy</code>
		</p>
		<p>
				<br />
				<code>
				</code>
		</p>
		<p>
				<code>
				</code>
		</p>
		<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;">
				<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->
				<span style="color: rgb(0, 0, 255);">import</span>
				<span style="color: rgb(0, 0, 0);"> org.hibernate.cfg.Configuration<br /></span>
				<span style="color: rgb(0, 0, 255);">import</span>
				<span style="color: rgb(0, 0, 0);"> org.hibernate.Session<br /></span>
				<span style="color: rgb(0, 0, 255);">import</span>
				<span style="color: rgb(0, 0, 0);"> org.hibernate.SessionFactory<br /></span>
				<span style="color: rgb(0, 0, 255);">import</span>
				<span style="color: rgb(0, 0, 0);"> org.hibernate.Transaction<br /></span>
				<span style="color: rgb(0, 0, 255);">import</span>
				<span style="color: rgb(0, 0, 0);"> org.hibernate.tool.hbm2ddl.SchemaUpdate<br /><br /></span>
				<span style="color: rgb(0, 0, 255);">class</span>
				<span style="color: rgb(0, 0, 0);"> Hibernate {<br />    def </span>
				<span style="color: rgb(0, 0, 255);">static</span>
				<span style="color: rgb(0, 0, 0);"> sessionFactory<br />    </span>
				<span style="color: rgb(0, 0, 255);">static</span>
				<span style="color: rgb(0, 0, 0);"> { <br />        </span>
				<span style="color: rgb(0, 0, 255);">try</span>
				<span style="color: rgb(0, 0, 0);"> { <br />            Configuration cfg </span>
				<span style="color: rgb(0, 0, 0);">=</span>
				<span style="color: rgb(0, 0, 0);"> </span>
				<span style="color: rgb(0, 0, 255);">new</span>
				<span style="color: rgb(0, 0, 0);"> Configuration()<br />            cfg.configure()            <br />            </span>
				<span style="color: rgb(0, 0, 255);">new</span>
				<span style="color: rgb(0, 0, 0);"> SchemaUpdate(cfg).execute(</span>
				<span style="color: rgb(0, 0, 255);">true</span>
				<span style="color: rgb(0, 0, 0);">, </span>
				<span style="color: rgb(0, 0, 255);">true</span>
				<span style="color: rgb(0, 0, 0);">)      <br />            sessionFactory </span>
				<span style="color: rgb(0, 0, 0);">=</span>
				<span style="color: rgb(0, 0, 0);"> cfg.buildSessionFactory()    <br />        } </span>
				<span style="color: rgb(0, 0, 255);">catch</span>
				<span style="color: rgb(0, 0, 0);"> (Exception e) {     <br />            e.printStackTrace()      <br />        }    <br />    }    <br /><br />    Hibernate() {}   <br /><br />    </span>
				<span style="color: rgb(0, 0, 255);">private</span>
				<span style="color: rgb(0, 0, 0);"> Session getSession() {    <br />        </span>
				<span style="color: rgb(0, 0, 255);">return</span>
				<span style="color: rgb(0, 0, 0);"> sessionFactory.openSession()    <br />    }    <br /><br />    Object execute(closure) {       <br />        def s </span>
				<span style="color: rgb(0, 0, 0);">=</span>
				<span style="color: rgb(0, 0, 0);"> getSession()        <br />            def tr </span>
				<span style="color: rgb(0, 0, 0);">=</span>
				<span style="color: rgb(0, 0, 0);"> </span>
				<span style="color: rgb(0, 0, 255);">null</span>
				<span style="color: rgb(0, 0, 0);">        <br />            def result </span>
				<span style="color: rgb(0, 0, 0);">=</span>
				<span style="color: rgb(0, 0, 0);"> </span>
				<span style="color: rgb(0, 0, 255);">null</span>
				<span style="color: rgb(0, 0, 0);">        <br />            </span>
				<span style="color: rgb(0, 0, 255);">try</span>
				<span style="color: rgb(0, 0, 0);"> {            <br />                tr </span>
				<span style="color: rgb(0, 0, 0);">=</span>
				<span style="color: rgb(0, 0, 0);"> s.beginTransaction()          <br />                    result </span>
				<span style="color: rgb(0, 0, 0);">=</span>
				<span style="color: rgb(0, 0, 0);"> closure.call(s)       <br />                    tr.commit()      <br />            } </span>
				<span style="color: rgb(0, 0, 255);">catch</span>
				<span style="color: rgb(0, 0, 0);"> (Exception e) {     <br />                e.printStackTrace()      <br />                    </span>
				<span style="color: rgb(0, 0, 255);">if</span>
				<span style="color: rgb(0, 0, 0);"> (tr </span>
				<span style="color: rgb(0, 0, 0);">!=</span>
				<span style="color: rgb(0, 0, 0);"> </span>
				<span style="color: rgb(0, 0, 255);">null</span>
				<span style="color: rgb(0, 0, 0);">) {     <br />                        tr.rollback()    <br />                    }        <br />            } </span>
				<span style="color: rgb(0, 0, 255);">finally</span>
				<span style="color: rgb(0, 0, 0);"> {     <br />                s.close()   <br />            }        <br />        </span>
				<span style="color: rgb(0, 0, 255);">return</span>
				<span style="color: rgb(0, 0, 0);"> result   <br />    }    <br /><br />    </span>
				<span style="color: rgb(0, 0, 255);">void</span>
				<span style="color: rgb(0, 0, 0);"> saveOrUpdate(obj) {<br />        def saveClosure </span>
				<span style="color: rgb(0, 0, 0);">=</span>
				<span style="color: rgb(0, 0, 0);"> { s </span>
				<span style="color: rgb(0, 0, 0);">-&gt;</span>
				<span style="color: rgb(0, 0, 0);"> s.saveOrUpdate(obj) }      <br />        execute(saveClosure)    <br />    }    <br /><br />    List executeQuery(hql) {     <br />        execute({ s </span>
				<span style="color: rgb(0, 0, 0);">-&gt;</span>
				<span style="color: rgb(0, 0, 0);"> s.createQuery(hql).list() })   <br />    }    <br /><br />    List executeQuery(hql, parameters) {    <br />        def query </span>
				<span style="color: rgb(0, 0, 0);">=</span>
				<span style="color: rgb(0, 0, 0);"> { s </span>
				<span style="color: rgb(0, 0, 0);">-&gt;</span>
				<span style="color: rgb(0, 0, 0);">        <br />            def q </span>
				<span style="color: rgb(0, 0, 0);">=</span>
				<span style="color: rgb(0, 0, 0);"> s.createQuery(hql)        <br />                </span>
				<span style="color: rgb(0, 0, 255);">if</span>
				<span style="color: rgb(0, 0, 0);"> (parameters </span>
				<span style="color: rgb(0, 0, 0);">!=</span>
				<span style="color: rgb(0, 0, 0);"> </span>
				<span style="color: rgb(0, 0, 255);">null</span>
				<span style="color: rgb(0, 0, 0);">) {         <br />                    </span>
				<span style="color: rgb(0, 0, 255);">for</span>
				<span style="color: rgb(0, 0, 0);"> (i in </span>
				<span style="color: rgb(0, 0, 0);">0</span>
				<span style="color: rgb(0, 0, 0);">..parameters.size()</span>
				<span style="color: rgb(0, 0, 0);">-</span>
				<span style="color: rgb(0, 0, 0);">1</span>
				<span style="color: rgb(0, 0, 0);">) {       <br />                        q.setParameter(i, parameters[i])       <br />                    }            <br />                }            <br />            q.list()       <br />        }        <br />        execute(query)    <br />    }    <br /><br />    def get(clazz, id) {    <br />        </span>
				<span style="color: rgb(0, 0, 255);">return</span>
				<span style="color: rgb(0, 0, 0);"> execute({ s </span>
				<span style="color: rgb(0, 0, 0);">-&gt;</span>
				<span style="color: rgb(0, 0, 0);"> s.get(clazz, id) })   <br />    }    <br /><br />    </span>
				<span style="color: rgb(0, 0, 255);">void</span>
				<span style="color: rgb(0, 0, 0);"> delete(obj) {       <br />        execute({ s </span>
				<span style="color: rgb(0, 0, 0);">-&gt;</span>
				<span style="color: rgb(0, 0, 0);"> s.delete(obj) })   <br />    }<br />}<br /></span>
		</div>
		<br />
		<p>
		</p>
		<p>Instead of interface, I use Closure for callback</p>
		<p style="text-align: right; font-size: 8px;">Blogged with <a href="http://www.flock.com/blogged-with-flock" title="Flock" target="_new">Flock</a></p>
		<!-- technorati tags begin -->
		<p style="font-size: 10px; text-align: right;">Tags: <a href="http://technorati.com/tag/hibernategroovy" rel="tag">hibernategroovy</a></p>
		<!-- technorati tags end -->
<img src ="http://www.blogjava.net/stingh711/aggbug/89159.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stingh711/" target="_blank">django</a> 2006-12-20 22:54 <a href="http://www.blogjava.net/stingh711/archive/2006/12/20/89159.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用httpclient发送soap message</title><link>http://www.blogjava.net/stingh711/archive/2006/12/18/88657.html</link><dc:creator>django</dc:creator><author>django</author><pubDate>Mon, 18 Dec 2006 15:30:00 GMT</pubDate><guid>http://www.blogjava.net/stingh711/archive/2006/12/18/88657.html</guid><wfw:comment>http://www.blogjava.net/stingh711/comments/88657.html</wfw:comment><comments>http://www.blogjava.net/stingh711/archive/2006/12/18/88657.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/stingh711/comments/commentRss/88657.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stingh711/services/trackbacks/88657.html</trackback:ping><description><![CDATA[<p>这两天在写一个tr069的simulator,原理很简单啦,用httpclient模拟tr069的client端,发送soap message到我们的acs server.</p>
<p>发送soap message的代码如下:<br/></p>
<p>public class MessageSender {<br/>/**<br/>* Logger for this class<br/>*/<br/>private static final Log logger = LogFactory.getLog(MessageSender.class);</p>
<p>private HttpClient httpClient;<br/>private PostMethod postMethod;<br/>private MessageFactory messageFactory;<br/>private String url;<br/>private NameValuePair sessionId;<br/><br/>public MessageSender(String ip){<br/>this.httpClient = new HttpClient();</p>
<p>try {<br/>this.messageFactory = MessageFactory.newInstance();<br/>} catch (SOAPException e) {<br/>logger.error(e.getMessage());<br/>}<br/><br/>this.url = generateRequestUrl(ip);<br/>}<br/><br/>private String generateRequestUrl(String ip) {<br/>return "http://" + ip + ":8080/vantage/TR069";<br/>}<br/><br/>public SOAPMessage sendMessage(SOAPMessage input) throws IOException, SOAPException {<br/>this.postMethod = new PostMethod(this.url);<br/>byte[] dataAsBytes = null;<br/><br/>if (input == null) {<br/>logger.debug("Send a empty post");<br/>dataAsBytes = new byte[0];<br/>} else {</p>
<p>ByteArrayOutputStream data = new ByteArrayOutputStream();<br/>input.writeTo(data);<br/>dataAsBytes = data.toByteArray();<br/>}<br/><br/>RequestEntity entity = new ByteArrayRequestEntity(dataAsBytes);<br/>this.postMethod.setRequestEntity(entity);</p>
<p>if (this.sessionId != null) {<br/>this.postMethod.addParameter(this.sessionId);<br/>}<br/><br/>this.httpClient.executeMethod(this.postMethod);</p>
<p>sessionId = this.postMethod.getParameter("SessionID");<br/><br/>InputStream in = this.postMethod.getResponseBodyAsStream();<br/><br/>if (null == in) {<br/>return null;<br/>}</p>
<p>return this.messageFactory.createMessage(null, in);<br/>}<br/>}</p>
<p>最初的code里面,只有一个PostMethod,这样每次会一直keep一个http连接.因为在server端,只直接用http session来保存server的状态的,所以必须要是保持是一个session.用一个PostMethod可以做到这点.不过奇怪的是,在发第二次请求的时候,怎么都拿不到http connection.也不知道是不是httpclient的bug.后来才每次调用都重新create一个PostMethod,但是把第一次得到的sessionID add进去.</p>
<img src ="http://www.blogjava.net/stingh711/aggbug/88657.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stingh711/" target="_blank">django</a> 2006-12-18 23:30 <a href="http://www.blogjava.net/stingh711/archive/2006/12/18/88657.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>inverse tip on hibernate</title><link>http://www.blogjava.net/stingh711/archive/2006/12/11/87085.html</link><dc:creator>django</dc:creator><author>django</author><pubDate>Mon, 11 Dec 2006 15:14:00 GMT</pubDate><guid>http://www.blogjava.net/stingh711/archive/2006/12/11/87085.html</guid><wfw:comment>http://www.blogjava.net/stingh711/comments/87085.html</wfw:comment><comments>http://www.blogjava.net/stingh711/archive/2006/12/11/87085.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/stingh711/comments/commentRss/87085.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stingh711/services/trackbacks/87085.html</trackback:ping><description><![CDATA[
<p>所有双向的关联必须有一端被设置为inverse.在一对多关联中,它必须代表多的一端.在多对多中,可以任意选取一端.</p>
<p>inverse会影响到save时候的行为。如果一端的inverse设为true，则save应该在另一端进行</p>
<img src ="http://www.blogjava.net/stingh711/aggbug/87085.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stingh711/" target="_blank">django</a> 2006-12-11 23:14 <a href="http://www.blogjava.net/stingh711/archive/2006/12/11/87085.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一份简单跟我风格比较一致的coding style</title><link>http://www.blogjava.net/stingh711/archive/2006/11/27/83819.html</link><dc:creator>django</dc:creator><author>django</author><pubDate>Mon, 27 Nov 2006 08:18:00 GMT</pubDate><guid>http://www.blogjava.net/stingh711/archive/2006/11/27/83819.html</guid><wfw:comment>http://www.blogjava.net/stingh711/comments/83819.html</wfw:comment><comments>http://www.blogjava.net/stingh711/archive/2006/11/27/83819.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/stingh711/comments/commentRss/83819.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stingh711/services/trackbacks/83819.html</trackback:ping><description><![CDATA[
		<h2>Introduction</h2>
		<p>The Java language gives you all the room you need to write code that would be very
difficult for others to understand. Java also permits you to write code that is very easy
to understand. Most development teams would prefer the latter.</p>
		<p>A style guide provides provides a map so that the code generated by a group of programmers
will be consistent and, therefore, easier to read and maintain. Many people do not care for the
<a href="http://java.sun.com/docs/codeconv/html/CodeConvTOC.doc.html" target="_blank">style guide</a> offered by Sun.
This document is one alternative. </p>
		<p>This document covers most areas where there could be confusion or difference of opinion.
Areas that have never been a problem in our experience are undocumented.</p>
		<h2>1 - <a href="http://www.javaranch.com/styleLong.jsp#format">Formatting</a></h2>
		<ul>
				<h2>1.1 - Indentation</h2>

All indents are four spaces. All indenting is done with spaces, not tabs.
(<a title="indent" href="http://www.javaranch.com/styleLong.jsp#indent">examples and reasoning</a>)<br />

Matching braces always line up vertically in the same column as their construct.
(<a title="indent" href="http://www.javaranch.com/styleLong.jsp#matching_braces">examples</a>)<br />

All if, while and for statements must use braces even if they control just
one statement. (<a title="while" href="http://www.javaranch.com/styleLong.jsp#while">reasoning and examples</a>)<br /><h2>1.2 - Spacing</h2>

  All method names should be immediately followed by a left parenthesis.<br />
  All array dereferences should be immediately followed by a left square bracket.<br />
  Binary operators should have a space on either side.<br />
  Unary operators should be immediately preceded or followed by their operand.<br />
  Commas and semicolons are always followed by whitespace.<br />
  All casts should be written with no spaces.<br />
  The keywords <code>if</code>, <code>while</code>, <code>for</code>, <code>switch</code>, and <code>catch</code> must be followed by a space.<br />
(<a title="spacing" href="http://www.javaranch.com/styleLong.jsp#spacing">examples</a>)<br /><h2>1.3 - Class Member Ordering</h2><pre>class Order<br />{<br />    // fields<br /><br />    // constructors<br /><br />    // methods<br />}<br /></pre><h2>1.4 - Maximum Line Length</h2>

Avoid making lines longer than 120 characters. 
(<a title="length" href="http://www.javaranch.com/styleLong.jsp#length">reasoning</a>)

<h2>1.5 - Parentheses</h2>

Parentheses should be used in expressions not only to specify order of precedence, but
also to help simplify the expression. When in doubt, parenthesize.

</ul>
		<h2>2 - <a href="http://www.javaranch.com/styleLong.jsp#identifiers">Identifiers</a></h2>
		<p>All identifiers use letters ('A' through 'Z' and 'a' through 'z') and numbers
('0' through '9') only. No underscores, dollar signs or non-ascii characters.</p>
		<ul>
				<h2>2.1 - Classes and Interfaces</h2>
				<p>All class and interface identifiers will use mixed case. The first letter of
each word in the name will be uppercase, including the first letter of the name.
All other letters will be in lowercase, except in the case of an acronym,
which will be all upper case.
(<a title="class" href="http://www.javaranch.com/styleLong.jsp#class">examples</a>)

</p>
				<h2>2.2 - Packages</h2>
				<p>Package names will use lower case characters only. Try to keep the length under
eight (8) characters. Multi-word package names should be avoided.
(<a title="pack" href="http://www.javaranch.com/styleLong.jsp#pack">examples</a>)

</p>
				<h2>2.3 - All Other Identifiers</h2>
All other identifiers, including (but not limited to) fields, local
variables, methods and parameters, will use the following naming
convention. This includes identifiers for constants. <br /><br />
The first letter of each word in the name will be uppercase, except for
the
first letter of the name. All other letters will be in lowercase,
except in the case of an embedded acronym, which will be all uppercase.
Leading acronyms are all lower case. (<a title="other" href="http://www.javaranch.com/styleLong.jsp#other">examples and reasoning</a>)<br /><br />
Hungarian notation and scope identification are not allowed. <a href="http://www.javaranch.com/styleLong.jsp#hungarian">(reasoning and examples)</a><br /><br />
Test code is permitted to use underscores in identifiers for methods and fields. <a href="http://www.javaranch.com/styleLong.jsp#test_code">(reasoning and examples)</a></ul>
		<h2>3 - <a href="http://www.javaranch.com/styleLong.jsp#code">Coding</a></h2>
		<ul>
				<h2>3.1 - Constructs to Avoid</h2>

Never use <code>do..while</code>.
(<a title="do" href="http://www.javaranch.com/styleLong.jsp#do">examples and reasoning</a>)<br />

Never use <code>return</code> in the middle of a method.
(<a title="return" href="http://www.javaranch.com/styleLong.jsp#return">reasoning</a>)<br />

Never use <code>continue</code>.
(<a title="cont" href="http://www.javaranch.com/styleLong.jsp#cont">reasoning</a>)<br />

Never use <code>break</code> other than in a switch statement.
(<a title="break" href="http://www.javaranch.com/styleLong.jsp#break">reasoning</a>)

<h2>3.2 - Do Not Compound Increment Or Decrement Operators</h2><p>Use a separate line for an increment or decrement.
(<a title="inc" href="http://www.javaranch.com/styleLong.jsp#inc">examples and reasoning</a>)</p><p>Never use pre-increment or pre-decrement
(<a title="inc" href="http://www.javaranch.com/styleLong.jsp#inc">examples and reasoning</a>)</p><h2>3.3 - Initialization</h2>

Declare variables as close as possible to where they are used.

(<a title="init" href="http://www.javaranch.com/styleLong.jsp#init">examples</a>)

<h2>3.4 - Access</h2>

All fields must be private, except for some constants.
</ul>
		<h2>4 - <a href="http://www.javaranch.com/styleLong.jsp#doc">Self-Documenting Code</a></h2>
		<pre>
				<em>"Any fool can write code that a computer can understand.<br />Good programmers write code that humans can understand."<br /></em>
		</pre>
		<ul>
				<ul>
						<ul>
								<pre>--- Martin Fowler, Refactoring: Improving the Design of Existing Code<br /></pre>
						</ul>
				</ul>
		</ul>
		<p>Rather than trying to document how you perform a complex algorithm, try to
make the algorithm easier to read by introducing more identifiers. This helps
in the future in case the algorithm changes but someone forgets to change the documentation.
(<a title="doc" href="http://www.javaranch.com/styleLong.jsp#doc">examples and reasoning</a>)</p>
		<br />
		<p>原文链接在 http://www.javaranch.com/style.jsp<br /></p>
<img src ="http://www.blogjava.net/stingh711/aggbug/83819.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stingh711/" target="_blank">django</a> 2006-11-27 16:18 <a href="http://www.blogjava.net/stingh711/archive/2006/11/27/83819.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Using PropertyPlaceHolderConfigurer to separate configuration files in spring</title><link>http://www.blogjava.net/stingh711/archive/2006/11/23/83145.html</link><dc:creator>django</dc:creator><author>django</author><pubDate>Thu, 23 Nov 2006 15:53:00 GMT</pubDate><guid>http://www.blogjava.net/stingh711/archive/2006/11/23/83145.html</guid><wfw:comment>http://www.blogjava.net/stingh711/comments/83145.html</wfw:comment><comments>http://www.blogjava.net/stingh711/archive/2006/11/23/83145.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/stingh711/comments/commentRss/83145.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stingh711/services/trackbacks/83145.html</trackback:ping><description><![CDATA[First of all, add a bean in spring's configuration files like this:<br />&lt;bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderconfigurer"&gt;<br />    &lt;property name="locations"&gt;<br />        &lt;list&gt;<br />            &lt;value&gt;...property files&lt;/value&gt;<br />        &lt;/list&gt;<br />    &lt;/property&gt;<br />&lt;/bean&gt;<br />Put the property files under classpath, then you can use ${property name} to reference properties in your property files in your spring configuration files.<br />Also, system properties and properties sent it by -D are also available through ${property name}.<img src ="http://www.blogjava.net/stingh711/aggbug/83145.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stingh711/" target="_blank">django</a> 2006-11-23 23:53 <a href="http://www.blogjava.net/stingh711/archive/2006/11/23/83145.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用Spring中的Resource接口隔离对文件系统的依赖</title><link>http://www.blogjava.net/stingh711/archive/2006/11/19/82015.html</link><dc:creator>django</dc:creator><author>django</author><pubDate>Sun, 19 Nov 2006 03:54:00 GMT</pubDate><guid>http://www.blogjava.net/stingh711/archive/2006/11/19/82015.html</guid><wfw:comment>http://www.blogjava.net/stingh711/comments/82015.html</wfw:comment><comments>http://www.blogjava.net/stingh711/archive/2006/11/19/82015.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/stingh711/comments/commentRss/82015.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stingh711/services/trackbacks/82015.html</trackback:ping><description><![CDATA[
		<p>在项目中,经常要用到读系统文件.在项目的遗留代码中,都是在系统启动是传入一个APP_HOME,然后根据相对路径去读文件.这样做的缺点是比较难测试,而且自动化的测试更难.</p>
		<p>比如说有这样一个类Server,要根据server.properties来初始化,一开始的代码是这样的:</p>
		<p>
				<span style="FONT-FAMILY: 'Courier New', Courier, monospace">import java.io.File;<br />import java.io.FileInputStream;<br />import java.io.IOException;<br />import java.util.Properties;</span>
		</p>
		<p>
				<font face="Courier New">/**<br />* @author sting<br />*/<br />public class Server {<br />private static final String FILE = "conf" + File.separator + "server.properties";<br /><br />public void initial() throws IOException {<br />FileInputStream in = new FileInputStream(System.getProperty("APP_HOME") + File.separator + FILE);<br />Properties properties = new Properties();<br />properties.load(in);<br />// initial<br />}<br />}</font>
		</p>
		<p>文件路径和文件名都是hard code,很难测试. 我们首先把initial()重构一下,代码如下:</p>
		<p>
				<br />
				<span style="FONT-FAMILY: 'Courier New', Courier, monospace">public void initial(InputStream in) throws IOException {<br />Properties properties = new Properties();<br />properties.load(in);<br />// initial<br />}</span>
		</p>
		<p>
				<span style="FONT-FAMILY: 'Courier New', Courier, monospace">至少,测试时,我们可以传进来自己的InputStream,也可以方便的时候测试用的server.properties,或者干脆使用内联的文件,代码如下:</span>
		</p>
		<p>
				<span style="FONT-FAMILY: 'Courier New', Courier, monospace">class ServerTest extends TestCase {<br />private Server server;<br /><br />public void setUp() throws Exception {<br />this.server = new Server();<br />}<br /><br />public void testInitial() throws Exception {<br />String serverProperties = "port=8080\n" +<br />"run_mode=normal";<br />InputStream in = new ByteArrayInputStream(serverProperties.getBytes());<br /><br />this.server.initial(in);<br />// assert<br />}<br />}</span>
		</p>
		<p>
				<span style="FONT-FAMILY: 'Courier New', Courier, monospace">但是,在实际工作的代码中,文件名和路径依然要hard code进代码中.这时,我们可以使用spring中的Resource接口来进一步改进我们的代码.</span>
		</p>
		<p>
				<span style="FONT-FAMILY: 'Courier New', Courier, monospace">public class Server {<br />private Resource resource;<br /><br />public void setResource(Resource r) {<br />this.resource = r;<br />}<br /><br />public void initial() throws IOException {<br />Properties properties = new Properties();<br />properties.load(this.resource.getInputStream());<br />// initial<br />}<br />}</span>
		</p>
		<p>
				<span style="FONT-FAMILY: 'Courier New', Courier, monospace">再加一段spring的配置文件:</span>
		</p>
		<p>
				<span style="FONT-FAMILY: 'Courier New', Courier, monospace">&lt;beans&gt;<br />&lt;bean id="server" class="Server"&gt;<br />&lt;property name="resource" value="classpath:server.properties"/&gt;<br />&lt;/bean&gt;<br />&lt;/beans&gt;</span>
		</p>
		<p>
				<span style="FONT-FAMILY: 'Courier New', Courier, monospace">这样,Server的代码完全与文件的具体路径和文件名无关,仅仅用配置文件就可以指定,表达更清楚,也更易于测试.<br /><br />当然,仅限于已经使用spring的项目.</span>
		</p>
<img src ="http://www.blogjava.net/stingh711/aggbug/82015.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stingh711/" target="_blank">django</a> 2006-11-19 11:54 <a href="http://www.blogjava.net/stingh711/archive/2006/11/19/82015.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用GroboUtils进行多线程测试</title><link>http://www.blogjava.net/stingh711/archive/2006/06/24/54800.html</link><dc:creator>django</dc:creator><author>django</author><pubDate>Fri, 23 Jun 2006 16:27:00 GMT</pubDate><guid>http://www.blogjava.net/stingh711/archive/2006/06/24/54800.html</guid><wfw:comment>http://www.blogjava.net/stingh711/comments/54800.html</wfw:comment><comments>http://www.blogjava.net/stingh711/archive/2006/06/24/54800.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/stingh711/comments/commentRss/54800.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stingh711/services/trackbacks/54800.html</trackback:ping><description><![CDATA[被测试的类: Buffer.java<br /><br /><font face="Courier New">package test;<br /><br />import java.util.HashMap;<br />import java.util.Map;<br /><br /><br />/**<br />&nbsp;* <br />&nbsp;* @author sting<br />&nbsp;*/<br />public class Buffer {<br />&nbsp;&nbsp;&nbsp; private static Buffer me = new Buffer();<br />&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; public static Buffer getInstance() {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return me;<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; private Map&lt;String, Integer&gt; buff;<br />&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; private Buffer() {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.buff = new HashMap&lt;String, Integer&gt;();<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; public void put(String key, int value) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (!(this.buff.containsKey(key))) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.buff.put(key, value);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; public int get(String key) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (this.buff.containsKey(key)) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return this.buff.get(key);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 0;<br />&nbsp;&nbsp;&nbsp; }<br />}</font><br /><br />TestCase: BufferTest.java<br /><font face="Courier New">package test;<br /><br />import net.sourceforge.groboutils.junit.v1.MultiThreadedTestRunner;<br />import net.sourceforge.groboutils.junit.v1.TestRunnable;<br />import junit.framework.TestCase;<br /><br /><br />/**<br />&nbsp;* <br />&nbsp;* @author sting<br />&nbsp;*/<br />public class BufferTest extends TestCase {<br />&nbsp;&nbsp;&nbsp; private Buffer buff;<br />&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; protected void setUp() throws Exception {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; super.setUp();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; buff = Buffer.getInstance();<br />&nbsp;&nbsp;&nbsp; }<br /><br />&nbsp;&nbsp;&nbsp; protected void tearDown() throws Exception {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; super.tearDown();<br />&nbsp;&nbsp;&nbsp; }<br /><br />&nbsp;&nbsp;&nbsp; public void test() throws Throwable {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TestRunnable[] runnables = new TestRunnable[] {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; new WriteToBuffer(buff, 10),<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; new GetFromBuffer(buff, 10)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; };<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MultiThreadedTestRunner testRunner = <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; new MultiThreadedTestRunner(runnables);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; testRunner.runTestRunnables();<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; private static class WriteToBuffer extends TestRunnable {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private int value;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private Buffer buff;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public WriteToBuffer(Buffer buff, int value) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.buff = buff;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.value = value;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @Override<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void runTest() throws Throwable {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; buff.put(&quot;sting&quot;, value);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; private static class GetFromBuffer extends TestRunnable {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private int value;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private Buffer buff;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public GetFromBuffer(Buffer buff, int value) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.buff = buff;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.value = value;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @Override<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void runTest() throws Throwable {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; assertEquals(value, buff.get(&quot;sting&quot;));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; }<br />}</font><br /><br />运行该test case，结果如下：<br />WARN [Thread-1] (MultiThreadedTestRunner.java:276) - A test thread caused an exception.<br />junit.framework.AssertionFailedError: expected:&lt;10&gt; but was:&lt;0&gt;<br />&nbsp;&nbsp;&nbsp; at junit.framework.Assert.fail(Assert.java:47)<br />&nbsp;&nbsp;&nbsp; at junit.framework.Assert.failNotEquals(Assert.java:282)<br />&nbsp;&nbsp;&nbsp; at junit.framework.Assert.assertEquals(Assert.java:64)<br />&nbsp;&nbsp;&nbsp; at junit.framework.Assert.assertEquals(Assert.java:201)<br />&nbsp;&nbsp;&nbsp; at junit.framework.Assert.assertEquals(Assert.java:207)<br />&nbsp;&nbsp;&nbsp; at test.BufferTest$GetFromBuffer.runTest(BufferTest.java:75)<br />&nbsp;&nbsp;&nbsp; at net.sourceforge.groboutils.junit.v1.TestRunnable.run(TestRunnable.java:154)<br />&nbsp;&nbsp;&nbsp; at java.lang.Thread.run(Unknown Source)<br /><br />把Buffer.java加上同步处理：<br /><font face="Courier New">public class Buffer {<br />&nbsp;&nbsp;&nbsp; private static Buffer me = new Buffer();<br />&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; public static Buffer getInstance() {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return me;<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; private Map&lt;String, Integer&gt; buff;<br />&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; private Buffer() {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.buff = new HashMap&lt;String, Integer&gt;();<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; public void put(String key, int value) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font color="#ff0000">synchronized (this)</font> {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (!(this.buff.containsKey(key))) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.buff.put(key, value);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; public int get(String key) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font color="#ff0000">synchronized (this)</font> {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (this.buff.containsKey(key)) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return this.buff.get(key);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; }<br />}<br /><br />测试通过。<br /><br />这里只是用最简单的code演示了一下如何使用GroboUtils里面提供</font><font face="Courier New">TestRunnable和</font><font face="Courier New">MultiThreadedTestRunner来编写多线程的测试代码。其实也可以自己写code去测试，不过已经有人写了，不用再重复去做了。Please refer to </font><font face="Courier New"><a href="http://groboutils.sourceforge.net/index.html">http://broboutils.sourceforge.net</a></font><font face="Courier New"> to get more information.</font><img src ="http://www.blogjava.net/stingh711/aggbug/54800.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stingh711/" target="_blank">django</a> 2006-06-24 00:27 <a href="http://www.blogjava.net/stingh711/archive/2006/06/24/54800.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>