﻿<?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-Have been sleeping for long time</title><link>http://www.blogjava.net/ramon/</link><description>The hope, the dream</description><language>zh-cn</language><lastBuildDate>Sat, 17 May 2008 11:11:06 GMT</lastBuildDate><pubDate>Sat, 17 May 2008 11:11:06 GMT</pubDate><ttl>60</ttl><item><title>Something you may ingore when to use Hibernate and JPA.</title><link>http://www.blogjava.net/ramon/archive/2008/04/03/190635.html</link><dc:creator>Find it, try it, experience it</dc:creator><author>Find it, try it, experience it</author><pubDate>Thu, 03 Apr 2008 08:32:00 GMT</pubDate><guid>http://www.blogjava.net/ramon/archive/2008/04/03/190635.html</guid><wfw:comment>http://www.blogjava.net/ramon/comments/190635.html</wfw:comment><comments>http://www.blogjava.net/ramon/archive/2008/04/03/190635.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ramon/comments/commentRss/190635.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ramon/services/trackbacks/190635.html</trackback:ping><description><![CDATA[<strong><span style="color: red;"><span style="color: red;">
The first is about identity generator, this is something I ingored and find really interesting later when I read back the document.</span></span></strong><br />
<br />
&nbsp;&nbsp;&nbsp; When you choose "native" (for plain <a title="hibernate" href="hibernate">hibernate</a>) or "AUTO" (for JPA which use <a title="hibernate" href="hibernate">hibernate</a> as provider) as identity generator, it (actually they are the same identity generator but with different name in different scope) will pick other identity generators like identity, sequence, or hilo, depending on the capabilities of the underlying database. Use this generator to keep your mapping metadata portable to different database management systems.<br />
&nbsp;&nbsp;&nbsp; If your underlying DB is oracle, it will automatically create a sequence for you which means choose the sequence as identity generator, that's really interesting, at least for me for the first time when it comes to me.<br />
<br />
<strong><span style="color: red;">
The second is about the flush and close session operations when to use <a title="hibernate" href="hibernate">hibernate</a> with JTA transaction.</span></strong><br />
<br />
&nbsp;&nbsp;&nbsp; You should manually flush your operation by call flush method and close your session by calling close method when you try to use JTA transaction instead of <a title="hibernate" href="hibernate">hibernate</a> Transaction API, these is because <a title="hibernate" href="hibernate">hibernate</a> Transaction API does thoes operations automatically for you. But, with following configuration, it can also be done automatically for you by <a title="hibernate" href="hibernate">hibernate</a>, though you are still with JTA transaction.<br />
<br />
&nbsp;&nbsp;&nbsp; <a title="hibernate" href="hibernate">hibernate</a>.transaction.flush_before_completion=true<br />
&nbsp;&nbsp;&nbsp; <a title="hibernate" href="hibernate">hibernate</a>.transaction.auto_close_session=true<br />
<br />
<strong><span style="color: red;">The third is about an interesting code snatch listed as follow:</span></strong><br />
&nbsp;&nbsp;&nbsp;
<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: #008080;">1</span>&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #000000;">Session&nbsp;session&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;sessionFactory.openSession();<br />
</span><span style="color: #008080;">2</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;session.beginTransaction();<br />
</span><span style="color: #008080;">3</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;session.save(</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Item());<br />
</span><span style="color: #008080;">4</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;session.close();</span></div>
<br />
&nbsp;&nbsp;&nbsp; What happen if you don't commit the transaction? It's depends on the underlying DB, for oracle it will commit any uncommited transactions, but for many other DB vendors, they will roll back any pending transactions.<br />
&nbsp;&nbsp;&nbsp; <br />
<br /><img src ="http://www.blogjava.net/ramon/aggbug/190635.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ramon/" target="_blank">Find it, try it, experience it</a> 2008-04-03 16:32 <a href="http://www.blogjava.net/ramon/archive/2008/04/03/190635.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>A "Hello" program on EJB3 with Jboss server 4.2.2GA (PART 3) - EJB3 Timer service.</title><link>http://www.blogjava.net/ramon/archive/2008/03/26/188714.html</link><dc:creator>Find it, try it, experience it</dc:creator><author>Find it, try it, experience it</author><pubDate>Wed, 26 Mar 2008 05:30:00 GMT</pubDate><guid>http://www.blogjava.net/ramon/archive/2008/03/26/188714.html</guid><wfw:comment>http://www.blogjava.net/ramon/comments/188714.html</wfw:comment><comments>http://www.blogjava.net/ramon/archive/2008/03/26/188714.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ramon/comments/commentRss/188714.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ramon/services/trackbacks/188714.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp; Timer service in EJB3 with anotation is fairly simple, I give you an example as follow, and it's really simple and self-explanation:<br />
<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: #008080;">&nbsp;1</span>&nbsp;<span style="color: #0000ff;">package</span><span style="color: #000000;">&nbsp;com.ramon.expejb3.session.impl;<br />
</span><span style="color: #008080;">&nbsp;2</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;3</span>&nbsp;<span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;javax.annotation.Resource;<br />
</span><span style="color: #008080;">&nbsp;4</span>&nbsp;<span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;javax.ejb.Stateless;<br />
</span><span style="color: #008080;">&nbsp;5</span>&nbsp;<span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;javax.ejb.Timeout;<br />
</span><span style="color: #008080;">&nbsp;6</span>&nbsp;<span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;javax.ejb.Timer;<br />
</span><span style="color: #008080;">&nbsp;7</span>&nbsp;<span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;javax.ejb.TimerService;<br />
</span><span style="color: #008080;">&nbsp;8</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;9</span>&nbsp;<span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;com.ramon.expejb3.session.Greeting;<br />
</span><span style="color: #008080;">10</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">11</span>&nbsp;<span style="color: #000000;">@Stateless(name&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">Greeting</span><span style="color: #000000;">"</span><span style="color: #000000;">)<br />
</span><span style="color: #008080;">12</span>&nbsp;<span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;GreetingBean&nbsp;</span><span style="color: #0000ff;">implements</span><span style="color: #000000;">&nbsp;Greeting&nbsp;{<br />
</span><span style="color: #008080;">13</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080;">14</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;@Resource<br />
</span><span style="color: #008080;">15</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;TimerService&nbsp;ts;<br />
</span><span style="color: #008080;">16</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">17</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/*</span><span style="color: #008000;">&nbsp;(non-Javadoc)<br />
</span><span style="color: #008080;">18</span>&nbsp;<span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@see&nbsp;com.ramon.expejb3.session.Greeting#greeting(java.lang.String)<br />
</span><span style="color: #008080;">19</span>&nbsp;<span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">20</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;greeting(String&nbsp;name)&nbsp;{<br />
</span><span style="color: #008080;">21</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000;">"</span><span style="color: #000000;">Hello&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;name&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">.</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
</span><span style="color: #008080;">22</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ts.createTimer(</span><span style="color: #000000;">1</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1000</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">5</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1000</span><span style="color: #000000;">,&nbsp;name);<br />
</span><span style="color: #008080;">23</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000;">"</span><span style="color: #000000;">Create&nbsp;timer&nbsp;for&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;name&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">.</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
</span><span style="color: #008080;">24</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080;">25</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080;">26</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;@Timeout<br />
</span><span style="color: #008080;">27</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;timeout(Timer&nbsp;timer)&nbsp;{<br />
</span><span style="color: #008080;">28</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;name&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;(String)timer.getInfo();<br />
</span><span style="color: #008080;">29</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(name&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;TIME&nbsp;OUT.</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
</span><span style="color: #008080;">30</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">timer.cancel();</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">31</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">32</span> <span style="color: #000000;">}<br />
</span><span style="color: #008080;">33</span> </div>
&nbsp;&nbsp;&nbsp; It's the "<span style="color: #000000;">GreetingBean</span>" I introduced in part one of this series article with TimerService injected, <span style="color: #000000;">@Resource anotation inject the time service we want, it's totally free which is supported by the J2EE container that means we do not need any further steps to get the powerful schedule service. In the line 22, I crate a new timer, I think this could be more fit if it was called Task instead, there are several "createTimer" methods with different parameters, the one I used here describe the task should be execute 1 second delay and every 5 second one time in the future, the third parameter can be anything you want to pass in to the task, it can be get back use method Timer.getInfo() like line 28 does here.<br />
&nbsp;&nbsp;&nbsp; Another important anotation here is the @Timeout anotation, this anotation tell container which method will be called when timeout for this task to be executed, you can only specify one timeout method for each Bean, if there is no @Timeout anotation at all, you will get some exception like "No timeout method specified" in Jboss server. Something funny here is that you should mark the timeout method as "public", otherwise, you will get the same error as no timeout method does, I do NOT think it's necessary, because the time out method should only be called by the container, "private" signature is enought for that, with "private" signature container still has the right to access this method with java reflection, nevertheless timer service in EJB3 is still a good tools for use.<br />
</span>&nbsp;&nbsp;&nbsp; I summarize what good/bad for timer service in EJB3 as follow:<br />
&nbsp;&nbsp;&nbsp; Good news:<br />
<ul>
    <li>&nbsp;&nbsp;&nbsp; It's free, it's supported by the EJB container.</li>
    <li>&nbsp;&nbsp;&nbsp; It's portable, it's supported by the EJB container as specified in EJB3 specification.</li>
    <li>&nbsp;&nbsp;&nbsp; It's easy to use, no need to learn more.</li>
</ul>
&nbsp;&nbsp;&nbsp; Bad news:<br />
<ul>
    <li>&nbsp;&nbsp;&nbsp; The feature of EJB3 timer sevice is not as powerful as some third party timer service such as Quartz, but it's enough with EJB3 for ordinary daily job.</li>
    <li>&nbsp;&nbsp;&nbsp; There is no UI for you to monitor the timer you created.</li>
</ul>
<br /><img src ="http://www.blogjava.net/ramon/aggbug/188714.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ramon/" target="_blank">Find it, try it, experience it</a> 2008-03-26 13:30 <a href="http://www.blogjava.net/ramon/archive/2008/03/26/188714.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>A "Hello" program on EJB3 with Jboss server 4.2.2GA (PART 2) - EJB3 MDB with Jboss server. </title><link>http://www.blogjava.net/ramon/archive/2008/03/25/188546.html</link><dc:creator>Find it, try it, experience it</dc:creator><author>Find it, try it, experience it</author><pubDate>Tue, 25 Mar 2008 09:42:00 GMT</pubDate><guid>http://www.blogjava.net/ramon/archive/2008/03/25/188546.html</guid><wfw:comment>http://www.blogjava.net/ramon/comments/188546.html</wfw:comment><comments>http://www.blogjava.net/ramon/archive/2008/03/25/188546.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ramon/comments/commentRss/188546.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ramon/services/trackbacks/188546.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;&nbsp; MDB is the MVP(most valuable player) both in previous EJB versionand EJB3. Although coding with MDB is simple in EJB2.x, EJB3 make itmuch more friendly to you. Let's get to the ...&nbsp;&nbsp;<a href='http://www.blogjava.net/ramon/archive/2008/03/25/188546.html'>阅读全文</a><img src ="http://www.blogjava.net/ramon/aggbug/188546.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ramon/" target="_blank">Find it, try it, experience it</a> 2008-03-25 17:42 <a href="http://www.blogjava.net/ramon/archive/2008/03/25/188546.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>A "Hello" program on EJB3 with Jboss server 4.2.2GA.</title><link>http://www.blogjava.net/ramon/archive/2008/03/21/187713.html</link><dc:creator>Find it, try it, experience it</dc:creator><author>Find it, try it, experience it</author><pubDate>Fri, 21 Mar 2008 08:02:00 GMT</pubDate><guid>http://www.blogjava.net/ramon/archive/2008/03/21/187713.html</guid><wfw:comment>http://www.blogjava.net/ramon/comments/187713.html</wfw:comment><comments>http://www.blogjava.net/ramon/archive/2008/03/21/187713.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ramon/comments/commentRss/187713.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ramon/services/trackbacks/187713.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp; Recently I did some research on EJB3 programming, find that it's really simple than programming with previous EJB version. Coding in EJB2.X or previous version is really a nightmare for most developers, maybe for this, EJB3 gives me much more impression than Spring when it first comes to me, this article is the first one of these series articles which record the new knowledge I find interesting in EJB3. <br />
<br />
&nbsp;&nbsp;&nbsp; Well, let's begin.<br />
<br />
&nbsp;&nbsp;&nbsp; EJB3 is simple with AOP and DI, there is no Home interface any more, only with Service Interface and your Service implementation you can create an typical EJB3 application. I will create a simple hello world program in this article, the service interface as follow:<br />
<br />
<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: #008080;">&nbsp;1</span>&nbsp;<span style="color: #0000ff;">package</span><span style="color: #000000;">&nbsp;com.ramon.expejb3.session;<br />
</span><span style="color: #008080;">&nbsp;2</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;3</span>&nbsp;<span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;javax.ejb.Remote;<br />
</span><span style="color: #008080;">&nbsp;4</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;5</span>&nbsp;<span style="color: #000000;">@Remote<br />
</span><span style="color: #008080;">&nbsp;6</span>&nbsp;<span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">interface</span><span style="color: #000000;">&nbsp;Greeting&nbsp;{<br />
</span><span style="color: #008080;">&nbsp;7</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080;">&nbsp;8</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/**</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">&nbsp;9</span>&nbsp;<span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;say&nbsp;hello&nbsp;test<br />
</span><span style="color: #008080;">10</span>&nbsp;<span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080;">@param</span><span style="color: #008000;">&nbsp;name<br />
</span><span style="color: #008080;">11</span>&nbsp;<span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">12</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;greeting(String&nbsp;name);<br />
</span><span style="color: #008080;">13</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">14</span>&nbsp;<span style="color: #000000;">}</span></div>
<br />
&nbsp;&nbsp;&nbsp; It's really simple, especially for you that are familiar with programing with Interface, after that is the service implementation code:<br />
<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: #008080;">&nbsp;1</span>&nbsp;<span style="color: #0000ff;">package</span><span style="color: #000000;">&nbsp;com.ramon.expejb3.session.impl;<br />
</span><span style="color: #008080;">&nbsp;2</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;3</span>&nbsp;<span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;javax.annotation.PostConstruct;<br />
</span><span style="color: #008080;">&nbsp;4</span>&nbsp;<span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;javax.annotation.PreDestroy;<br />
</span><span style="color: #008080;">&nbsp;5</span>&nbsp;<span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;javax.ejb.Stateless;<br />
</span><span style="color: #008080;">&nbsp;6</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;7</span>&nbsp;<span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;com.ramon.expejb3.session.Greeting;<br />
</span><span style="color: #008080;">&nbsp;8</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;9</span>&nbsp;<span style="color: #000000;">@Stateless(name&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">Greeting</span><span style="color: #000000;">"</span><span style="color: #000000;">)<br />
</span><span style="color: #008080;">10</span>&nbsp;<span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;GreetingBean&nbsp;</span><span style="color: #0000ff;">implements</span><span style="color: #000000;">&nbsp;Greeting&nbsp;{<br />
</span><span style="color: #008080;">11</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080;">12</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;@PostConstruct<br />
</span><span style="color: #008080;">13</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;init()&nbsp;{<br />
</span><span style="color: #008080;">14</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000;">"</span><span style="color: #000000;">Init&nbsp;Greeting&nbsp;Bean.</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
</span><span style="color: #008080;">15</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080;">16</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080;">17</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;@PreDestroy<br />
</span><span style="color: #008080;">18</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;destroy()&nbsp;{<br />
</span><span style="color: #008080;">19</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000;">"</span><span style="color: #000000;">Garbage&nbsp;collect&nbsp;Greeting&nbsp;Bean.</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
</span><span style="color: #008080;">20</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080;">21</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">22</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/*</span><span style="color: #008000;">&nbsp;(non-Javadoc)<br />
</span><span style="color: #008080;">23</span>&nbsp;<span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@see&nbsp;com.ramon.expejb3.session.Greeting#greeting(java.lang.String)<br />
</span><span style="color: #008080;">24</span>&nbsp;<span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">25</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;greeting(String&nbsp;name)&nbsp;{<br />
</span><span style="color: #008080;">26</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000;">"</span><span style="color: #000000;">Hello&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;name&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">.</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
</span><span style="color: #008080;">27</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080;">28</span>&nbsp;<span style="color: #000000;">}<br />
</span><span style="color: #008080;">29</span>&nbsp;</div>
&nbsp;&nbsp;&nbsp; Still simple and very self-explanation, <span style="color: #000000;">@Stateless(name&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">Greeting</span><span style="color: #000000;">"</span><span style="color: #000000;">) specify the JNDI name for client invocation. OK, that's all for our EJB jar file, no more file needed for this simple hello application. Execute your ANT script make a jar for it, part of ANT script may look like:<br />
</span>
<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: #008080;">&nbsp;1</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">target&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="prepareexpejb3"</span><span style="color: #ff0000;">&nbsp;description</span><span style="color: #0000ff;">="Create&nbsp;exp_jsf&nbsp;distribution."</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;2</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">mkdir&nbsp;</span><span style="color: #ff0000;">dir</span><span style="color: #0000ff;">="${dist.dir}"</span><span style="color: #ff0000;">&nbsp;</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;3</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">mkdir&nbsp;</span><span style="color: #ff0000;">dir</span><span style="color: #0000ff;">="${build.dir}"</span><span style="color: #ff0000;">&nbsp;</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;4</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">mkdir&nbsp;</span><span style="color: #ff0000;">dir</span><span style="color: #0000ff;">="${build.core.dir}"</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;5</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">target</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;6</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;7</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">&lt;!--</span><span style="color: #008000;">&nbsp;=================================&nbsp;<br />
</span><span style="color: #008080;">&nbsp;8</span>&nbsp;<span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;target:&nbsp;Compile&nbsp;expejb3&nbsp;classes&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080;">&nbsp;9</span>&nbsp;<span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=================================&nbsp;</span><span style="color: #008000;">--&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">10</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">target&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="compileexpejb3"</span><span style="color: #ff0000;">&nbsp;depends</span><span style="color: #0000ff;">="cleanDist,prepareexpejb3"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">11</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">javac&nbsp;</span><span style="color: #ff0000;">destdir</span><span style="color: #0000ff;">="${build.core.dir}"</span><span style="color: #ff0000;">&nbsp;debug</span><span style="color: #0000ff;">="yes"</span><span style="color: #ff0000;">&nbsp;deprecation</span><span style="color: #0000ff;">="on"</span><span style="color: #ff0000;">&nbsp;srcdir</span><span style="color: #0000ff;">="${src.dir}"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">12</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">include&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="${core.src.dir}/**"</span><span style="color: #ff0000;">&nbsp;</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">13</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">classpath&nbsp;</span><span style="color: #ff0000;">refid</span><span style="color: #0000ff;">="expejb3.classpath"</span><span style="color: #ff0000;">&nbsp;</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">14</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">javac</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">15</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080;">16</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">target</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">17</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">18</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">&lt;!--</span><span style="color: #008000;">&nbsp;=================================&nbsp;<br />
</span><span style="color: #008080;">19</span>&nbsp;<span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;target:&nbsp;Create&nbsp;EJB3&nbsp;jar<br />
</span><span style="color: #008080;">20</span>&nbsp;<span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=================================&nbsp;</span><span style="color: #008000;">--&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">21</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">target&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="createEJB3Jar"</span><span style="color: #ff0000;">&nbsp;depends</span><span style="color: #0000ff;">="compileexpejb3"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">22</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">jar&nbsp;</span><span style="color: #ff0000;">jarfile</span><span style="color: #0000ff;">="${dist.dir}/${expejb3.core.name}.jar"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">23</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">fileset&nbsp;</span><span style="color: #ff0000;">dir</span><span style="color: #0000ff;">="${build.core.dir}"</span><span style="color: #0000ff;">&gt;&lt;/</span><span style="color: #800000;">fileset</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">24</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">jar</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">25</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">target</span><span style="color: #0000ff;">&gt;</span></div>
<br />
<span style="color: #000000;">&nbsp;&nbsp;&nbsp; Put the EJB jar into jboss server </span>server\default\deploy, you should see some log from jboss console like:<br />
&nbsp;&nbsp;&nbsp;
<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: #008080;">1</span>&nbsp;<span style="color: #000000;">10</span><span style="color: #000000;">:</span><span style="color: #000000;">59</span><span style="color: #000000;">:</span><span style="color: #000000;">27</span><span style="color: #000000;">,</span><span style="color: #000000;">036</span><span style="color: #000000;">&nbsp;INFO&nbsp;&nbsp;</span><span style="color: #800000; font-weight: bold;">[</span><span style="color: #800000;">JmxKernelAbstraction</span><span style="color: #800000; font-weight: bold;">]</span><span style="color: #000000;">&nbsp;creating&nbsp;wrapper&nbsp;delegate&nbsp;for:&nbsp;org.jboss.ejb3.stateless.St<br />
</span><span style="color: #008080;">2</span>&nbsp;<span style="color: #000000;">atelessContainer<br />
</span><span style="color: #008080;">3</span>&nbsp;<span style="color: #000000;">10</span><span style="color: #000000;">:</span><span style="color: #000000;">59</span><span style="color: #000000;">:</span><span style="color: #000000;">27</span><span style="color: #000000;">,</span><span style="color: #000000;">051</span><span style="color: #000000;">&nbsp;INFO&nbsp;&nbsp;</span><span style="color: #800000; font-weight: bold;">[</span><span style="color: #800000;">JmxKernelAbstraction</span><span style="color: #800000; font-weight: bold;">]</span><span style="color: #000000;">&nbsp;installing&nbsp;MBean:&nbsp;jboss.j2ee:jar</span><span style="color: #000000;">=</span><span style="color: #000000;">expejb3core.jar</span><span style="color: #000000;">,</span><span style="color: #000000;">name</span><span style="color: #000000;">=</span><span style="color: #000000;">Gree<br />
</span><span style="color: #008080;">4</span>&nbsp;<span style="color: #000000;">ting</span><span style="color: #000000;">,</span><span style="color: #000000;">service</span><span style="color: #000000;">=</span><span style="color: #000000;">EJB3&nbsp;with&nbsp;dependencies:<br />
</span><span style="color: #008080;">5</span>&nbsp;<span style="color: #000000;">10</span><span style="color: #000000;">:</span><span style="color: #000000;">59</span><span style="color: #000000;">:</span><span style="color: #000000;">27</span><span style="color: #000000;">,</span><span style="color: #000000;">208</span><span style="color: #000000;">&nbsp;INFO&nbsp;&nbsp;</span><span style="color: #800000; font-weight: bold;">[</span><span style="color: #800000;">EJBContainer</span><span style="color: #800000; font-weight: bold;">]</span><span style="color: #000000;">&nbsp;STARTED&nbsp;EJB:&nbsp;com.ramon.expejb3.session.impl.GreetingBean&nbsp;ejbName:<br />
</span><span style="color: #008080;">6</span>&nbsp;<span style="color: #000000;">Greeting</span></div>
&nbsp;&nbsp;&nbsp; Which mean that you have successfully deploy your EJB into jboss server, create a client code to invoke your EJB service:<br />
<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: #008080;">&nbsp;1</span>&nbsp;<span style="color: #0000ff;">package</span><span style="color: #000000;">&nbsp;com.ramon.expejb3.session;<br />
</span><span style="color: #008080;">&nbsp;2</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;3</span>&nbsp;<span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;java.util.Properties;<br />
</span><span style="color: #008080;">&nbsp;4</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;5</span>&nbsp;<span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;javax.naming.Context;<br />
</span><span style="color: #008080;">&nbsp;6</span>&nbsp;<span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;javax.naming.InitialContext;<br />
</span><span style="color: #008080;">&nbsp;7</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;8</span>&nbsp;<span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;junit.framework.TestCase;<br />
</span><span style="color: #008080;">&nbsp;9</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">10</span>&nbsp;<span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;ExpEJB3BaseTestCase&nbsp;</span><span style="color: #0000ff;">extends</span><span style="color: #000000;">&nbsp;TestCase&nbsp;{<br />
</span><span style="color: #008080;">11</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">12</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;Properties&nbsp;properties&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">;<br />
</span><span style="color: #008080;">13</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080;">14</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;Context&nbsp;context;<br />
</span><span style="color: #008080;">15</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">16</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">protected</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;setUp()&nbsp;</span><span style="color: #0000ff;">throws</span><span style="color: #000000;">&nbsp;Exception&nbsp;{<br />
</span><span style="color: #008080;">17</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">super</span><span style="color: #000000;">.setUp();<br />
</span><span style="color: #008080;">18</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;properties&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Properties();<br />
</span><span style="color: #008080;">19</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;properties.put(</span><span style="color: #000000;">"</span><span style="color: #000000;">java.naming.factory.initial</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">org.jnp.interfaces.NamingContextFactory</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
</span><span style="color: #008080;">20</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;properties.put(</span><span style="color: #000000;">"</span><span style="color: #000000;">java.naming.factory.url.pkgs</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">org.jboss.naming:org.jnp.interfaces</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
</span><span style="color: #008080;">21</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;properties.put(</span><span style="color: #000000;">"</span><span style="color: #000000;">java.naming.provider.url</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">localhost:1099</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
</span><span style="color: #008080;">22</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;context&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;InitialContext(properties);<br />
</span><span style="color: #008080;">23</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080;">24</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">25</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">protected</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;tearDown()&nbsp;</span><span style="color: #0000ff;">throws</span><span style="color: #000000;">&nbsp;Exception&nbsp;{<br />
</span><span style="color: #008080;">26</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">super</span><span style="color: #000000;">.tearDown();<br />
</span><span style="color: #008080;">27</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;context&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">;<br />
</span><span style="color: #008080;">28</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;properties&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">;<br />
</span><span style="color: #008080;">29</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080;">30</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">31</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">final</span><span style="color: #000000;">&nbsp;Context&nbsp;getContext()&nbsp;{<br />
</span><span style="color: #008080;">32</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;context;<br />
</span><span style="color: #008080;">33</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080;">34</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">35</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">final</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;setContext(Context&nbsp;context)&nbsp;{<br />
</span><span style="color: #008080;">36</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.context&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;context;<br />
</span><span style="color: #008080;">37</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080;">38</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">39</span>&nbsp;<span style="color: #000000;">}<br />
</span><span style="color: #008080;">40</span>&nbsp;</div>
<br />
<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: #008080;">&nbsp;1</span>&nbsp;<span style="color: #0000ff;">package</span><span style="color: #000000;">&nbsp;com.ramon.expejb3.session.impl;<br />
</span><span style="color: #008080;">&nbsp;2</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;3</span>&nbsp;<span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;javax.naming.NamingException;<br />
</span><span style="color: #008080;">&nbsp;4</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;5</span>&nbsp;<span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;com.ramon.expejb3.session.ExpEJB3BaseTestCase;<br />
</span><span style="color: #008080;">&nbsp;6</span>&nbsp;<span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;com.ramon.expejb3.session.Greeting;<br />
</span><span style="color: #008080;">&nbsp;7</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;8</span>&nbsp;<span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;GreetingBeanTest&nbsp;</span><span style="color: #0000ff;">extends</span><span style="color: #000000;">&nbsp;ExpEJB3BaseTestCase&nbsp;{<br />
</span><span style="color: #008080;">&nbsp;9</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">10</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;testGreeting()&nbsp;{<br />
</span><span style="color: #008080;">11</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">try</span><span style="color: #000000;">&nbsp;{<br />
</span><span style="color: #008080;">12</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Greeting&nbsp;greetService&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;(Greeting)</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.getContext().lookup(</span><span style="color: #000000;">"</span><span style="color: #000000;">Greeting/remote</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
</span><span style="color: #008080;">13</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;greetService.greeting(</span><span style="color: #000000;">"</span><span style="color: #000000;">Ramon</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
</span><span style="color: #008080;">14</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff;">catch</span><span style="color: #000000;">&nbsp;(NamingException&nbsp;e)&nbsp;{<br />
</span><span style="color: #008080;">15</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;TODO&nbsp;Auto-generated&nbsp;catch&nbsp;block</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">16</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
</span><span style="color: #008080;">17</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080;">18</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080;">19</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">20</span>&nbsp;<span style="color: #000000;">}<br />
</span><span style="color: #008080;">21</span>&nbsp;</div>
&nbsp;&nbsp;&nbsp; That's really simple, right? What you should note is that you must include following jars into your classpath when you run this clien test case, otherwise you will get the annoying classNotFound Exception:<br />
<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: #008080;">&nbsp;1</span>&nbsp;<span style="color: #000000;">concurrent.jar<br />
</span><span style="color: #008080;">&nbsp;2</span>&nbsp;<span style="color: #000000;">jboss-aop-jdk50.jar<br />
</span><span style="color: #008080;">&nbsp;3</span>&nbsp;<span style="color: #000000;">jboss-aspect-library-jdk50.jar<br />
</span><span style="color: #008080;">&nbsp;4</span>&nbsp;<span style="color: #000000;">jboss-common.jar<br />
</span><span style="color: #008080;">&nbsp;5</span>&nbsp;<span style="color: #000000;">jboss-ejb3.jar<br />
</span><span style="color: #008080;">&nbsp;6</span>&nbsp;<span style="color: #000000;">jboss-ejb3-client.jar<br />
</span><span style="color: #008080;">&nbsp;7</span>&nbsp;<span style="color: #000000;">jboss-remoting.jar<br />
</span><span style="color: #008080;">&nbsp;8</span>&nbsp;<span style="color: #000000;">jbossx-client.jar<br />
</span><span style="color: #008080;">&nbsp;9</span>&nbsp;<span style="color: #000000;">jboss-transaction-client.jar<br />
</span><span style="color: #008080;">10</span>&nbsp;<span style="color: #000000;">jnp-client.jar</span></div>
<br />
<br />
&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp; <br /><img src ="http://www.blogjava.net/ramon/aggbug/187713.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ramon/" target="_blank">Find it, try it, experience it</a> 2008-03-21 16:02 <a href="http://www.blogjava.net/ramon/archive/2008/03/21/187713.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>编码字符集与Java －Java World乱码问题根源之所在。</title><link>http://www.blogjava.net/ramon/archive/2006/09/24/71505.html</link><dc:creator>Find it, try it, experience it</dc:creator><author>Find it, try it, experience it</author><pubDate>Sat, 23 Sep 2006 16:08:00 GMT</pubDate><guid>http://www.blogjava.net/ramon/archive/2006/09/24/71505.html</guid><wfw:comment>http://www.blogjava.net/ramon/comments/71505.html</wfw:comment><comments>http://www.blogjava.net/ramon/archive/2006/09/24/71505.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.blogjava.net/ramon/comments/commentRss/71505.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ramon/services/trackbacks/71505.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 本文介绍了编码字符集的概念以及Java与编码字符集之间的关系，文章的内容来自于本人工作过程中的经验积累以及网络中的相关文章介绍，如果文章中有任何纰漏欢迎读者指正，让我们共同讨论学习J1．      字符字符是抽象的最小文本单位。它没有固定的形状（可能是一个字形），而且没有值。“A”是一个字符，“€”（德国、法国和许多其他欧洲国家通用货币的标志）也是一个字符。“中”“国”这是两个汉字字符。字符仅仅代...&nbsp;&nbsp;<a href='http://www.blogjava.net/ramon/archive/2006/09/24/71505.html'>阅读全文</a><img src ="http://www.blogjava.net/ramon/aggbug/71505.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ramon/" target="_blank">Find it, try it, experience it</a> 2006-09-24 00:08 <a href="http://www.blogjava.net/ramon/archive/2006/09/24/71505.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>计算机中[1]和[-1]的趣事.</title><link>http://www.blogjava.net/ramon/archive/2006/09/20/70900.html</link><dc:creator>Find it, try it, experience it</dc:creator><author>Find it, try it, experience it</author><pubDate>Wed, 20 Sep 2006 12:59:00 GMT</pubDate><guid>http://www.blogjava.net/ramon/archive/2006/09/20/70900.html</guid><wfw:comment>http://www.blogjava.net/ramon/comments/70900.html</wfw:comment><comments>http://www.blogjava.net/ramon/archive/2006/09/20/70900.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ramon/comments/commentRss/70900.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ramon/services/trackbacks/70900.html</trackback:ping><description><![CDATA[首先感谢南老师!<br /><br />      在计算机里的有符号数，最高位的1用来表示负号，所以，用 0000 0001表示正1，1000 0001表示-1，确实对人来说很直观。但其实，计算机里的数是用“补码”表示的。其中正数的补码就是原来的数（称为原码），而负数的补码是这么算的，我用倒推的来说：<br />      补码 = 反码 + 1<br />      反码 = 原码按位取反（1变0，0变1）<br />      所以，-1就是1取补码，过程如下：<br />      先取反 0000 0001 ---&gt; 1111 1110 <br />      然后加1得补码： 1111 1110 + 1 = 1111 1111 <br />    （当然这里为了方便，就取了8位，其实整数现在都是32位了，结果是32个1）。<br /><br />     现在，你知道如何计算-2了吗？ 为什么要搞反码，补码这么个转换呢？ 这个原因要说长就很长的，但简单地讲，这又是一个在人的直观和机器的高效之间取一个平衡：<br />     我们先来看一个10进制的数运算：<br />     1 + (-1) = 0 //10进制中，1加负1应为0.<br />     然后，假如用1000 0001来表示－1的话。按照计算机计算加法的规则，它是每位加的，结果是：<br />     0000 0001 + 1000 0001 = 1000 0010  //-2<br />     结果变成－2了，其中后面两个0001 相加变成2，而前面的用于表示负号的1，被“继承”下来了……显然，原来计算机最直观的（对人来说也很直观的）算法，不灵了！怎么办？痛苦<br /><br />    但更痛苦的事还在0这个数上。按10进制，0和-0可是完全相等的。但如果用二进制，0000 0000 和 1000 0000 参加起运算，可是完全不同。或许可以通过电路设计，来强制让计算机去实现一个规则： 碰到1000 0000就先转换为0000 0000。但可要知道加减法计算是计算机计算一切的基础，如果从这最底层就必须有一个转换会极大影响性能！何况前面那个问题也必须有个强制规则！规则最好越简单越好，那就是规定前面的补码转换规则，这个转换过程对于计算机来说很迅速的逻辑电路转换。<br /><br />    你看，第一个问题 1 ＋ （－1）<br />    0000 0001 + 1111 1111 = 0000 0000 <br />    看明白这个计算过程吗？其实就是最低位的两个1相加后，造成每一位都进位，最高位直接溢出（丢了）。如果你还算不清，就算算这个10进制的：<br />    1 + 999 =  1000 (最高位1丢失，就成0了)<br />    然后是第二个问题，0的表示。如果您把0当成正数，那么它是这样表示的：<br />    0000 0000<br />    如果你当它是负数，那么<br />    取反 1111 1111 ，再加1，以求补 ，哈哈又成 0000 0000这回在逻辑上没有错误了！明白了吧？当补我在学习这一段知识时，只能说：高，实在高！ 想出补码的前辈，真是高人啊。<img src ="http://www.blogjava.net/ramon/aggbug/70900.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ramon/" target="_blank">Find it, try it, experience it</a> 2006-09-20 20:59 <a href="http://www.blogjava.net/ramon/archive/2006/09/20/70900.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Unit Testing against Struts action(Controller in MVC), In-Container or Mock Objects which One Should We Choose? </title><link>http://www.blogjava.net/ramon/archive/2006/07/06/57051.html</link><dc:creator>Find it, try it, experience it</dc:creator><author>Find it, try it, experience it</author><pubDate>Thu, 06 Jul 2006 15:11:00 GMT</pubDate><guid>http://www.blogjava.net/ramon/archive/2006/07/06/57051.html</guid><wfw:comment>http://www.blogjava.net/ramon/comments/57051.html</wfw:comment><comments>http://www.blogjava.net/ramon/archive/2006/07/06/57051.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ramon/comments/commentRss/57051.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ramon/services/trackbacks/57051.html</trackback:ping><description><![CDATA[<p>This article is focused on which approach we should choose for unit testing against Struts action, I hope it will give you some help when you have question on how to do unit testing against the controller in MVC.<br /><br />OK, let's begin!</p>
		<p>
				<strong>
						<font color="#ff0000">In container? Mock objects?</font>
				</strong>
				<br />
				<br />There are two kinds of testing, one is in-container and the other is do testing with mock objects. Generally speaking, it was considered to be more really and truly unit testing when you do testing with mock objects, especially when you do testing against java source files which should be run in J2EE container, but as our code become complex which contain more layers, the controller(Struts) will have more depends on the other layer which may be EJB service or other business objects, so when you do unit testing against view layer(here is Struts),<font color="#0000ff"> it will be a huge work for you to construct the mock objects and also it will have more source code changed as you apply mock objects in your source code</font>, the following is a simply description which describe the classic three layers project, and also considerd to be the most common type of web based project.<br /><br /><em>e.g. the Struts action class first call the EJB factory to get an EJB service, and then ask this EJB service to do the work according to the business logic and return the value we need, with the value EJB service returned the action class can choose which page to redirect or do some other data processing ,this could be the classic three layers type, maybe the most common type project we used in our project.</em></p>
		<p>Therefore, it may not be the best choice for every web based project to apply mock objects unit testing. In the case that Struts action class is close tied with your business object, in-container testing may be an alternate choice for you, because it save your time to write mock objects and the workload to apply the mock objects into your source files but supply the same testing resluts.</p>
		<p>In-container testing sounds good, but when you do testing in this style, it first assume that the depended business service classes used in our Struts action must be verified, if the depended service classes have some defect that happen to be met when we run in-container testing, it will take more time to find which cause the error indeed. </p>
		<p>But I think if we have a complete testing procedure, which cover the service layer and the controller, the service layer have already been verified properly, in-container testing is really the best choice for you to use for testing action class. For project in practice, <u>the Struts action is more or less close tied with other layer</u>, it's not realistic to spend more time on writing mock objects or modifying your source code to apply the mock objects. <font color="#0000ff">In my opinion, the recommended solution is that you should focus on Struts layer testing, if the Struts action code is close tied with other service layer which I mean is that there may be only one execute() method in every Struts action take charge for the whole business logic, you should use in-container testing, let other unit testing stuff take charge for service layer which may be out of container unit testing against EJB, in this way you can write your test case at your pleasure, forget the depended layers for a while, the container will take care for other layers for you, and also it will save you lots of time for writing mock objects, the container will give you the real objects instead of mock objects.</font><u>Mock object testing is more often used for the simple Struts action or the case that it could be influenced by the container when you do unit testing against Struts action.</u></p><img src ="http://www.blogjava.net/ramon/aggbug/57051.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ramon/" target="_blank">Find it, try it, experience it</a> 2006-07-06 23:11 <a href="http://www.blogjava.net/ramon/archive/2006/07/06/57051.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Wow~~ It will be a new beginning for me!</title><link>http://www.blogjava.net/ramon/archive/2006/07/05/56627.html</link><dc:creator>Find it, try it, experience it</dc:creator><author>Find it, try it, experience it</author><pubDate>Tue, 04 Jul 2006 17:06:00 GMT</pubDate><guid>http://www.blogjava.net/ramon/archive/2006/07/05/56627.html</guid><wfw:comment>http://www.blogjava.net/ramon/comments/56627.html</wfw:comment><comments>http://www.blogjava.net/ramon/archive/2006/07/05/56627.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ramon/comments/commentRss/56627.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ramon/services/trackbacks/56627.html</trackback:ping><description><![CDATA[I will write some thing when I have time tomorrow, sorry, it's already 1:00 AM at midnight, so you guys could see some thing right now, hey hey. It's mainly about how to automatic do unit testing in container with strutstestcase and ANT, hope it will be useful for you guys.<img src ="http://www.blogjava.net/ramon/aggbug/56627.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ramon/" target="_blank">Find it, try it, experience it</a> 2006-07-05 01:06 <a href="http://www.blogjava.net/ramon/archive/2006/07/05/56627.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>好久一段时间没有更新了....明天继续java学习旅途，哈哈哈，加油！</title><link>http://www.blogjava.net/ramon/archive/2005/05/07/4066.html</link><dc:creator>Find it, try it, experience it</dc:creator><author>Find it, try it, experience it</author><pubDate>Sat, 07 May 2005 09:16:00 GMT</pubDate><guid>http://www.blogjava.net/ramon/archive/2005/05/07/4066.html</guid><wfw:comment>http://www.blogjava.net/ramon/comments/4066.html</wfw:comment><comments>http://www.blogjava.net/ramon/archive/2005/05/07/4066.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/ramon/comments/commentRss/4066.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ramon/services/trackbacks/4066.html</trackback:ping><description><![CDATA[自己的激励帖！<img src ="http://www.blogjava.net/ramon/aggbug/4066.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ramon/" target="_blank">Find it, try it, experience it</a> 2005-05-07 17:16 <a href="http://www.blogjava.net/ramon/archive/2005/05/07/4066.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>one-to-one的效率问题，用one-to-many来替代？</title><link>http://www.blogjava.net/ramon/archive/2005/03/30/2604.html</link><dc:creator>Find it, try it, experience it</dc:creator><author>Find it, try it, experience it</author><pubDate>Wed, 30 Mar 2005 05:26:00 GMT</pubDate><guid>http://www.blogjava.net/ramon/archive/2005/03/30/2604.html</guid><wfw:comment>http://www.blogjava.net/ramon/comments/2604.html</wfw:comment><comments>http://www.blogjava.net/ramon/archive/2005/03/30/2604.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.blogjava.net/ramon/comments/commentRss/2604.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ramon/services/trackbacks/2604.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;由于最近在把以前的一个设计移到hibernate上来，所以需要用到one-to-one，因为在以前的设计中需要用到在一个主表中对于多个子表的主键关联，所以一开始就想到了one-to-one的应用，觉得这样解决不但不会引起以前数据设计的改变，也能够很好的利用hibernate所带来的OR优势，可是当实际使用的时候发现，在插入数据的时候可以有选择的在任意子表中进行插入，所有的结果都在原来的预期之中，但是在查询的时候，比如说只查询主表中的内容<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#008000>From tableMain</FONT><BR><BR>仅仅执行看起来十分简单的一条语句，你所期望的是他紧紧查询T_MAIN这张主表，可是结果确实hibernate通过多个外连接将所有的子表一口气的全部查询出来<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#008000>select * from t_main main outer join t_sub1 sub1 on main.id = sub1.id outer join t_sub2 sub2 on main.id = sub2.id...</FONT><BR><BR>&nbsp;如此的效率绝对让你头痛不已，不仅如此，如果你通过首先获得子表t_sub1的某个主键ID，然后通过这个主键查询出子表对象，在关联至住表，同样的情况又会发生，又会生成类似的SQL语句，这样一来看来对于这个设计应用one-to-one本身就是一种错误，是这样吗？<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;或许有人认为我们在每个one-to-one中加入lazy="true"这个属性会杜绝上述情况的发生，经过笔者的证实即便你加入了lazy="true"，也不会带来任何的改变；又或者在hibernate.config中加入fetch depth属性以及在每个关联中设置outer-join="false"，这些都不会引起本质上的变化，加入outer-join="false"其实结果只是将原有的outer join语句改变成多条sql语句而已，并没发生什么本质变化，反而效率更低了。<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;该怎么办呢？我们先仔细研究一下one-to-one的概念，one to one代表一对一，在一般的模型中很少会遇到one-to-one这种概念，因为他十分强调一对一的概念，就好比一个人他只有一个身体和一个头而已，头和身体是十分好的例子，因为有身体必定只有一个头，而且说到了身体必定要说头，就好像看了某个女孩的身材必定想知道她的长相如何（-_-），所以在这时我们使用one-to-one，因为这种一对一的关系是很强的，而且从对象中取得body必定会取得他所关联的head，这样的情况下使用outer-join是十分方便和有效率的，因为它使用了outer join查询从而避免了两条到数据库的查询语句，而且在这种情况下也只需要在body_hbm.xml中设置一个one-to-one即可，所以在这种确实是一对一<STRONG>而且</STRONG>在主表中一对一的关联个数（即主表中one-to-one标签）十分少的情况下，使用one-to-one是一种很不错的解决办法。<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;如果一个主表会对多个子表都进行one-to-one关联呢，就像我们一开始遇到的这种情况，比如你不仅仅只想了解那个你中意的女孩的身材和脸蛋，而且还想知道他的学历，身世等等一切，在这种情况下，如果我们都是用多个one-to-one在主表中的话，那情况正如我们一开始看见的，是十分可怕的，该怎么做呢？不妨考虑一下使用one-to-many，什么，many?一开始听到many这个词的时候，我也觉得挺惊讶的这明明是多个一对一的关联为什么要用到many呢？其实many并没有一定要说是大于一的，你就只在它的many中存在一个关联它有能乃你何呢？如果用到many的话，我们就需要改动数据表的设计了，在每个有关连的子表中加入一列main_id代表主表中该记录的主键子段值，只需要这样子改动就可以了，这样所带来的效果绝对是值得你这样做的，然后我们就按照以往的one-to-many来设计就好了<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在body.hbm.xml加入（一到head的关联举例，其他的关联按照这样的格式添加即可）<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;set name="head" inverse="true" lazy="true" cascade="all-delete-orphan"&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;key column="ID0000"/&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;one-to-many class="com.xx.Head"/&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/set&gt;<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在head.hbm.xml加入<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;many-to-one name="body" column="ID0000" class="com.xx.Body" not-null="true"/&gt;<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;行了，经过上面的改动我们就摆脱了查询时多个outer-join的困扰，只在需要的时候才对子表进行查询，因为设置了lazy="true"，所以一切的一切都在我们的预料之中，我们如果希望获得body的话hibernate绝对不会把它的head 也查询出来，节省了查询是所需要的负担，除非到了我们十分需要head的情况才会进行关联查询，获得所需要的head结果。<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;所以由此看来<FONT color=#0000ff><STRONG>在one-to-one这种一对一的关系不是很强的情况下，或者是在一张表中存在多个one-to-one的情况下，使用one-to-many来代替one-to-one不失为一种不错的做法</STRONG></FONT>，当然更重要的良好的数据库设计，hibernate毕竟只是末，<STRONG>千万不要本末倒置</STRONG>。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR><BR><img src ="http://www.blogjava.net/ramon/aggbug/2604.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ramon/" target="_blank">Find it, try it, experience it</a> 2005-03-30 13:26 <a href="http://www.blogjava.net/ramon/archive/2005/03/30/2604.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>