﻿<?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-semovy-文章分类-EJB</title><link>http://www.blogjava.net/WshmAndLily/category/14042.html</link><description /><language>zh-cn</language><lastBuildDate>Fri, 12 Oct 2007 19:01:09 GMT</lastBuildDate><pubDate>Fri, 12 Oct 2007 19:01:09 GMT</pubDate><ttl>60</ttl><item><title>EJB学习日记(20) </title><link>http://www.blogjava.net/WshmAndLily/articles/152273.html</link><dc:creator>semovy</dc:creator><author>semovy</author><pubDate>Fri, 12 Oct 2007 03:06:00 GMT</pubDate><guid>http://www.blogjava.net/WshmAndLily/articles/152273.html</guid><wfw:comment>http://www.blogjava.net/WshmAndLily/comments/152273.html</wfw:comment><comments>http://www.blogjava.net/WshmAndLily/articles/152273.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/WshmAndLily/comments/commentRss/152273.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/WshmAndLily/services/trackbacks/152273.html</trackback:ping><description><![CDATA[<p><strong style="color: red">非实体的基类映射</strong></p>
<p>最近我们都说了很多继承方面的映射策略，可是有时候我们却需要继承一个非实体的类，这个类存在于我们的工程项目中，但是我们又不希望它成为一个实体类，这个时候怎么办呢？这个时候我们可以用<span style="color: #0000ff">@javax.persistence.MappedSuperclass</span>来注释它，我们现在就修改一下我们前几天的例子，把Person类定义成一个不持久化的类。代码如下：</p>
<p>&nbsp;</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #000000">@MappedSuperclass<br />
</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Person&nbsp;{<br />
&nbsp;&nbsp;&nbsp;@Id&nbsp;@GeneratedValue<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;getId(&nbsp;)&nbsp;{&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;id;&nbsp;}<br />
&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;setId(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;id)&nbsp;{&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.id&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;is;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;String&nbsp;getFirstName(&nbsp;)&nbsp;{&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;firstName;&nbsp;}<br />
&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;setFirstName(String&nbsp;first)&nbsp;{&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.firstName&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;first;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;String&nbsp;getLastName(&nbsp;)&nbsp;{&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;lastName;&nbsp;}<br />
&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;setLastName(String&nbsp;last)&nbsp;{&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.lastName&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;last;&nbsp;}<br />
}<br />
<br />
@Entity<br />
@Table(name</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">CUSTOMER</span><span style="color: #000000">"</span><span style="color: #000000">)<br />
@Inheritance(strategy</span><span style="color: #000000">=</span><span style="color: #000000">InheritanceType.JOINED)<br />
@AttributeOverride(name</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">lastname</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;column</span><span style="color: #000000">=</span><span style="color: #000000">@Column(name</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">SURNAME</span><span style="color: #000000">"</span><span style="color: #000000">))<br />
</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Customer&nbsp;</span><span style="color: #0000ff">extends</span><span style="color: #000000">&nbsp;Person&nbsp;{<br />
<img alt="" src="http://www.blogjava.net/Images/dot.gif" /><br />
}<br />
<br />
@Entity<br />
@Table(name</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">EMPLOYEE</span><span style="color: #000000">"</span><span style="color: #000000">)<br />
@PrimaryKeyJoinColumn(name</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">EMP_PK</span><span style="color: #000000">"</span><span style="color: #000000">)<br />
</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Employee&nbsp;</span><span style="color: #0000ff">extends</span><span style="color: #000000">&nbsp;Customer&nbsp;{<br />
<img alt="" src="http://www.blogjava.net/Images/dot.gif" /><br />
}<br />
</span></div>
<p>&nbsp;</p>
<p>因为Person已经不是一个实体类了，所以在数据库里面将没有它所对应的表，所有的子类都继承了定义在它里面的属性，当然，如果你想在子类里面重新定义在父类里面定义过的属性的时候，你可以用<span style="color: #0000ff">@javax.persistence.AttributeOverride</span>来声明，当我们的代码运行以后，将会在数据库里面建立如下的结构：</p>
<p>&nbsp;</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #0000ff">create</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">table</span><span style="color: #000000">&nbsp;CUSTOMER&nbsp;(<br />
&nbsp;&nbsp;&nbsp;id&nbsp;</span><span style="font-weight: bold; color: #000000">integer</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">primary</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">key</span><span style="color: #000000">&nbsp;</span><span style="color: #808080">not</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">,<br />
&nbsp;&nbsp;&nbsp;firstName&nbsp;<br />
&nbsp;</span><span style="font-weight: bold; color: #000000">varchar</span><span style="color: #000000">(</span><span style="font-weight: bold; color: #800000">255</span><span style="color: #000000">),<br />
&nbsp;&nbsp;&nbsp;SURNAME&nbsp;<br />
&nbsp;</span><span style="font-weight: bold; color: #000000">varchar</span><span style="color: #000000">(</span><span style="font-weight: bold; color: #800000">255</span><span style="color: #000000">),<br />
&nbsp;&nbsp;&nbsp;street&nbsp;</span><span style="font-weight: bold; color: #000000">varchar</span><span style="color: #000000">(</span><span style="font-weight: bold; color: #800000">255</span><span style="color: #000000">),<br />
&nbsp;&nbsp;&nbsp;city&nbsp;</span><span style="font-weight: bold; color: #000000">varchar</span><span style="color: #000000">(</span><span style="font-weight: bold; color: #800000">255</span><span style="color: #000000">),<br />
&nbsp;&nbsp;&nbsp;state&nbsp;</span><span style="font-weight: bold; color: #000000">varchar</span><span style="color: #000000">(</span><span style="font-weight: bold; color: #800000">255</span><span style="color: #000000">),<br />
&nbsp;&nbsp;&nbsp;zip&nbsp;</span><span style="font-weight: bold; color: #000000">varchar</span><span style="color: #000000">(</span><span style="font-weight: bold; color: #800000">255</span><span style="color: #000000">),<br />
);<br />
<br />
</span><span style="color: #0000ff">create</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">table</span><span style="color: #000000">&nbsp;EMPLOYEE&nbsp;(<br />
&nbsp;&nbsp;&nbsp;EMP_PK&nbsp;</span><span style="font-weight: bold; color: #000000">integer</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">primary</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">key</span><span style="color: #000000">&nbsp;</span><span style="color: #808080">not</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">,<br />
&nbsp;&nbsp;&nbsp;employeeId&nbsp;</span><span style="font-weight: bold; color: #000000">integer</span><span style="color: #000000"><br />
);<br />
</span></div>
<p>&nbsp;</p>
<p><br />
就像你看到的，Customer类继承了Person里面的id,firstName ,lastName这些属性，因为用了<span style="color: #0000ff">@AttributeOverride</span>来指定重写的属性，所以在数据库里面lastName对应的列就变成了SURNAME.像这种映射方法在你不想强制你的超类持久化的时候特别有用。</p>
<p><span style="color: #0000ff">@MappedSuperclass</span>不仅可以注释在基类上面，你也可以注释在两个层次的实体类中间，当然，你也可以不加任何注释，不过，当你什么注释都不加的时候，持久化管理器就会完全忽略你的这个类了。</p>
<p>个人还是觉得要映射的时候，写清楚更好一些，不要用太多的默认了，因为默认用多了都不知道是怎么回事了，还有，当一些事情不太确定的时候，不防去试一下，反应试一下也无所谓，自己亲自去试了才能印象更深，希望大家在学EJB的时候，多多动手去写写。我也得努力了：）</p>
<img src ="http://www.blogjava.net/WshmAndLily/aggbug/152273.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/WshmAndLily/" target="_blank">semovy</a> 2007-10-12 11:06 <a href="http://www.blogjava.net/WshmAndLily/articles/152273.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>EJB学习日记(19) </title><link>http://www.blogjava.net/WshmAndLily/articles/152268.html</link><dc:creator>semovy</dc:creator><author>semovy</author><pubDate>Fri, 12 Oct 2007 02:49:00 GMT</pubDate><guid>http://www.blogjava.net/WshmAndLily/articles/152268.html</guid><wfw:comment>http://www.blogjava.net/WshmAndLily/comments/152268.html</wfw:comment><comments>http://www.blogjava.net/WshmAndLily/articles/152268.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/WshmAndLily/comments/commentRss/152268.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/WshmAndLily/services/trackbacks/152268.html</trackback:ping><description><![CDATA[<a class="postTitle2" id="viewpost1_TitleUrl" href="http://www.blogjava.net/hadeslee/archive/2007/10/10/ejb19.html">
<p><span style="color: red"><strong>继承映射策略之----每个子类一张表 </strong></span></p>
<p>在每个子类一张表的映射策略中，每一个子类都有一张属于自己的表，但是这张表只包括了定义在这个子类上面的属性而已，定义在它的父类的属性它的表里面是没有的，所以这样的方式映射的话，就不会浪费一点资源了，每一张表，每一列都是不可少的，也不会出现冗余。这种格式是有点像TABLE_PER_CLASS的策略，只不过这种方案是规范的，没有像TABLE_PER_CLASS一样重复定义列，在这里我们叫它JOINED策略。</p>
<p>按我们的例子，这种策略映射出来的话，数据库的结构将如下所示：</p>
<p>&nbsp;</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #0000ff">create</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">table</span><span style="color: #000000">&nbsp;Person&nbsp;(<br />
&nbsp;&nbsp;&nbsp;id&nbsp;</span><span style="font-weight: bold; color: #000000">integer</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">primary</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">key</span><span style="color: #000000">&nbsp;</span><span style="color: #808080">not</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">,<br />
&nbsp;&nbsp;&nbsp;firstName&nbsp;</span><span style="font-weight: bold; color: #000000">varchar</span><span style="color: #000000">(</span><span style="font-weight: bold; color: #800000">255</span><span style="color: #000000">),<br />
&nbsp;&nbsp;&nbsp;lastName&nbsp;</span><span style="font-weight: bold; color: #000000">varchar</span><span style="color: #000000">(</span><span style="font-weight: bold; color: #800000">255</span><span style="color: #000000">),<br />
);<br />
<br />
</span><span style="color: #0000ff">create</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">table</span><span style="color: #000000">&nbsp;Customer&nbsp;(<br />
&nbsp;&nbsp;&nbsp;id&nbsp;</span><span style="font-weight: bold; color: #000000">integer</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">primary</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">key</span><span style="color: #000000">&nbsp;</span><span style="color: #808080">not</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">,<br />
&nbsp;&nbsp;&nbsp;street&nbsp;</span><span style="font-weight: bold; color: #000000">varchar</span><span style="color: #000000">(</span><span style="font-weight: bold; color: #800000">255</span><span style="color: #000000">),<br />
&nbsp;&nbsp;&nbsp;city&nbsp;</span><span style="font-weight: bold; color: #000000">varchar</span><span style="color: #000000">(</span><span style="font-weight: bold; color: #800000">255</span><span style="color: #000000">),<br />
&nbsp;&nbsp;&nbsp;state&nbsp;</span><span style="font-weight: bold; color: #000000">varchar</span><span style="color: #000000">(</span><span style="font-weight: bold; color: #800000">255</span><span style="color: #000000">),<br />
&nbsp;&nbsp;&nbsp;zip&nbsp;</span><span style="font-weight: bold; color: #000000">varchar</span><span style="color: #000000">(</span><span style="font-weight: bold; color: #800000">255</span><span style="color: #000000">),<br />
);<br />
<br />
</span><span style="color: #0000ff">create</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">table</span><span style="color: #000000">&nbsp;Employee&nbsp;(<br />
&nbsp;&nbsp;&nbsp;EMP_PK&nbsp;</span><span style="font-weight: bold; color: #000000">integer</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">primary</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">key</span><span style="color: #000000">&nbsp;</span><span style="color: #808080">not</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">,<br />
&nbsp;&nbsp;&nbsp;employeeId&nbsp;</span><span style="font-weight: bold; color: #000000">integer</span><span style="color: #000000"><br />
);<br />
</span></div>
<p>&nbsp;</p>
<p>当持久化管理器加载一个类或者查询一个子类的时候，它必须要对数据库做连接动作，所以我们必须要保存这几张表有一个能够彼此连接起来的列。在我们的例子里面，EMPLOYEE, CUSTOMER, 和 PERSON表共享同样的主键值，这种策略的注释也是挺简单的：</p>
<p>&nbsp;</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #000000">@Entity<br />
@Inheritance(strategy</span><span style="color: #000000">=</span><span style="color: #000000">InheritanceType.JOINED)<br />
</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Person&nbsp;{<br />
<img alt="" src="http://www.blogjava.net/Images/dot.gif" /><br />
}<br />
<br />
@Entity<br />
</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Customer&nbsp;</span><span style="color: #0000ff">extends</span><span style="color: #000000">&nbsp;Person&nbsp;{<br />
<img alt="" src="http://www.blogjava.net/Images/dot.gif" /><br />
}<br />
<br />
@Entity<br />
@PrimaryKeyJoinColumn&nbsp;<br />
(name</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">EMP_PK</span><span style="color: #000000">"</span><span style="color: #000000">)<br />
</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Employee&nbsp;</span><span style="color: #0000ff">extends</span><span style="color: #000000">&nbsp;Customer&nbsp;{<br />
<img alt="" src="http://www.blogjava.net/Images/dot.gif" /><br />
}<br />
</span></div>
<p>&nbsp;</p>
<p>在持久化的时候，持久化管理器需要知道每一张表用哪一列来进行连接，所以当我们要指定某一列的时候，就可以用如下注释：</p>
<p><span style="color: #0000ff">&nbsp;@javax.persistence.PrimaryKeyJoinColumn</span>，它的声明如下：<br />
&nbsp;<br />
</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;javax.persistence;<br />
<br />
@Target({TYPE,&nbsp;METHOD,&nbsp;FIELD})<br />
</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;@</span><span style="color: #0000ff">interface</span><span style="color: #000000">&nbsp;PrimaryKeyJoinColumn<br />
&nbsp;&nbsp;&nbsp;String&nbsp;name(&nbsp;)&nbsp;</span><span style="color: #0000ff">default</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">""</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;String&nbsp;referencedColumnName(&nbsp;)&nbsp;</span><span style="color: #0000ff">default</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">""</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;String&nbsp;columnDefinition(&nbsp;)&nbsp;</span><span style="color: #0000ff">default</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">""</span><span style="color: #000000">;<br />
}<br />
</span></div>
<p>&nbsp;</p>
<p>name()方法提出你此表中需要用来连接的列的名字，它默认是与父类的主键进行连接，当我们不想与父类的主键进行连接时，我们可以用referencedColumnName( )这个方法来指定你要连接父类的哪个具体的列，它可以被定义为父类的任意列，但是默认是连接父类的主键列，如果从父类到子类的主键名都是一样的，那么这个属性就没必要再设了，因为Customer和Person的主键是一样的，所以在Customer里面不需要定义任何额外的属性，一切默认就可以了，但是由于Employee里面的主键名和其它的不一样，所以它必须显式地声明它的主键是哪一个。如果有的类有复合主键，那么可以用这个注释：<br />
<span style="color: #0000ff">@javax.persistence.PrimaryKeyJoinColumns</span></p>
<p>&nbsp;</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;javax.persistence;<br />
<br />
@Target({TYPE,&nbsp;METHOD,&nbsp;FIELD})<br />
</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;@</span><span style="color: #0000ff">interface</span><span style="color: #000000">&nbsp;PrimaryKeyJoinColumns&nbsp;{<br />
&nbsp;&nbsp;&nbsp;@PrimaryKeyJoinColumn[]&nbsp;value(&nbsp;);<br />
}<br />
</span></div>
<p>&nbsp;</p>
<p>它包括了多个@PrimaryKeyJoinColumn的注释。</p>
<p>注意：有些持久化实现这种策略会需要一个辨别器列，虽然大部份是不需要的，所以最好是在使用前查看一下你的持久化提供商的实现说明。</p>
<p>优点：<br />
这种策略虽然没有SINGLE_TABLE策略的速度快，但是你可以定义任何的非空约束在任何的表里面，并且这种模式是规范化的。<br />
缺点：<br />
唯一的缺点就是没有SINGLE_TABLE 策略的性能好。</p>
<p>到现在我们三种处理继承映射的策略都说完了，在不同的场合和环境下选择不同的映射策略是最明智的选择，没有一种策略可以胜任所有场合，否则的话，出一种就可以了，干嘛还出三种呢。希望大家在实际工作中选出适合自己的映射策略，更好的提高工作效率。<br />
</p>
</a>
<img src ="http://www.blogjava.net/WshmAndLily/aggbug/152268.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/WshmAndLily/" target="_blank">semovy</a> 2007-10-12 10:49 <a href="http://www.blogjava.net/WshmAndLily/articles/152268.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>EJB学习日记(17) </title><link>http://www.blogjava.net/WshmAndLily/articles/152265.html</link><dc:creator>semovy</dc:creator><author>semovy</author><pubDate>Fri, 12 Oct 2007 02:48:00 GMT</pubDate><guid>http://www.blogjava.net/WshmAndLily/articles/152265.html</guid><wfw:comment>http://www.blogjava.net/WshmAndLily/comments/152265.html</wfw:comment><comments>http://www.blogjava.net/WshmAndLily/articles/152265.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/WshmAndLily/comments/commentRss/152265.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/WshmAndLily/services/trackbacks/152265.html</trackback:ping><description><![CDATA[<p>单个实体BEAN的映射到数据库的方式很简单，但是如果我们的实体BEAN之间存在着继承关系呢？在数据库里面将如何表现这种继承关系？<br />
JAVA持久化规范里面提供了三种方式去处理继承实体的映射方式：<br />
一，所有继承层次共单独一张表<br />
二，每个具体的类一个单独的表<br />
三，每个子类一张表</p>
<p>为了更好的举例说明，我们构造出如下的继承层次，以做为例子使用。</p>
<p><img height="398" alt="" src="http://www.blogjava.net/images/blogjava_net/hadeslee/inheri.JPG" width="512" border="0" /><br />
我们今天先来看看第一种方式，那就是所有的继承层次共单独一张表。</p>
<p><span style="color: red"><strong>一，所有继承层次共单独一张表<br />
<br />
</strong></span>在这种模式中，一张数据库的表里面将放入所有的继承层次的类的属性，在我们的例子中，我们的Person,Customer,Empolyee的实体都将映射在同一张表里面，表的结构如下所示：</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #0000ff">create</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">table</span><span style="color: #000000">&nbsp;PERSON_HIERARCHY&nbsp;<br />
&nbsp;(<br />
&nbsp;&nbsp;&nbsp;id&nbsp;</span><span style="font-weight: bold; color: #000000">integer</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">primary</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">key</span><span style="color: #000000">&nbsp;</span><span style="color: #808080">not</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">,<br />
&nbsp;&nbsp;&nbsp;firstName&nbsp;</span><span style="font-weight: bold; color: #000000">varchar</span><span style="color: #000000">(</span><span style="font-weight: bold; color: #800000">255</span><span style="color: #000000">),<br />
&nbsp;&nbsp;&nbsp;lastName&nbsp;</span><span style="font-weight: bold; color: #000000">varchar</span><span style="color: #000000">(</span><span style="font-weight: bold; color: #800000">255</span><span style="color: #000000">),<br />
&nbsp;&nbsp;&nbsp;street&nbsp;</span><span style="font-weight: bold; color: #000000">varchar</span><span style="color: #000000">(</span><span style="font-weight: bold; color: #800000">255</span><span style="color: #000000">),<br />
&nbsp;&nbsp;&nbsp;city&nbsp;</span><span style="font-weight: bold; color: #000000">varchar</span><span style="color: #000000">(</span><span style="font-weight: bold; color: #800000">255</span><span style="color: #000000">),<br />
&nbsp;&nbsp;&nbsp;state&nbsp;</span><span style="font-weight: bold; color: #000000">varchar</span><span style="color: #000000">(</span><span style="font-weight: bold; color: #800000">255</span><span style="color: #000000">),<br />
&nbsp;&nbsp;&nbsp;zip&nbsp;</span><span style="font-weight: bold; color: #000000">varchar</span><span style="color: #000000">(</span><span style="font-weight: bold; color: #800000">255</span><span style="color: #000000">),<br />
&nbsp;&nbsp;&nbsp;employeeId&nbsp;</span><span style="font-weight: bold; color: #000000">integer</span><span style="color: #000000">,<br />
&nbsp;&nbsp;&nbsp;DISCRIMINATOR&nbsp;</span><span style="font-weight: bold; color: #000000">varchar</span><span style="color: #000000">(</span><span style="font-weight: bold; color: #800000">31</span><span style="color: #000000">)&nbsp;</span><span style="color: #808080">not</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000"><br />
);</span></div>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>正是因为我们把所有继承层次的实体都放在同一张表里面，所以我们需要一个来标志具体类型的列，它指示当前记录是属于哪个类的，这样EntityManager好还原成相应的实体BEAN而不致于出错。我们还是先看看代码是如何告诉EntityManager它的继承实现方式的。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #000000">@Entity<br />
@Table(name</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">PERSON_HIERARCHY</span><span style="color: #000000">"</span><span style="color: #000000">)<br />
@Inheritance(strategy</span><span style="color: #000000">=</span><span style="color: #000000">InheritanceType.SINGLE_TABLE)<br />
@DiscriminatorColumn(name</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">DISCRIMINATOR</span><span style="color: #000000">"</span><span style="color: #000000">,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;discriminatorType</span><span style="color: #000000">=</span><span style="color: #000000">DiscriminatorType.STRING)<br />
@DiscriminatorValue(</span><span style="color: #000000">"</span><span style="color: #000000">PERSON</span><span style="color: #000000">"</span><span style="color: #000000">)<br />
</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Person&nbsp;{<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;id;<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;String&nbsp;firstName;<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;String&nbsp;lastName;<br />
<br />
&nbsp;&nbsp;&nbsp;@Id&nbsp;@GeneratedValue<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;getId(&nbsp;)&nbsp;{&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;id;&nbsp;}<br />
&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;setId(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;id)&nbsp;{&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.id&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;id;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;String&nbsp;getFirstName(&nbsp;)&nbsp;{&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;firstName;&nbsp;}<br />
&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;setFirstName(String&nbsp;first)&nbsp;{&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.firstName&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;first;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;String&nbsp;getLastName(&nbsp;)&nbsp;{&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;lastName;&nbsp;}<br />
&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;setLastName(String&nbsp;last)&nbsp;{&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.lastName&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;last;&nbsp;}<br />
}<br />
</span></div>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;@javax.persistence.Inheritance注释就是用来声明继承的时候它的持久化策略的，它的声明如下：<br />
&nbsp;<br />
</p>
<p>&nbsp;</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;javax.persistence;<br />
<br />
@Target(TYPE)&nbsp;@Retention(RUNTIME)<br />
</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;@</span><span style="color: #0000ff">interface</span><span style="color: #000000">&nbsp;Inheritance&nbsp;{<br />
&nbsp;&nbsp;&nbsp;InheritanceType&nbsp;strategy(&nbsp;)&nbsp;</span><span style="color: #0000ff">default</span><span style="color: #000000">&nbsp;SINGLE_TABLE;&nbsp;<br />
<br />
}<br />
<br />
</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">enum</span><span style="color: #000000">&nbsp;InheritanceType&nbsp;{<br />
&nbsp;&nbsp;&nbsp;SINGLE_TABLE,&nbsp;JOINED,&nbsp;TABLE_PER_CLASS<br />
}<br />
</span></div>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>在这里，strategy()方法定义了我们所使用的继承映射模式，我们在这里用的是单独一张表放所有的继承层次实体，所以我们使用了枚举InheritanceType.SINGLE_TABLE,有一点我们需要注意的是，@Inheritance这个注释仅仅只在继承层次的根类上是必须要有的，一般它的子类都没有必要写这个注释，除非你想改变继承映射的实现方式。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;javax.persistence;<br />
<br />
@Target(TYPE)&nbsp;@Retention(RUNTIME)<br />
</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;@</span><span style="color: #0000ff">interface</span><span style="color: #000000">&nbsp;DiscriminatorColumn<br />
&nbsp;&nbsp;&nbsp;String&nbsp;name(&nbsp;)&nbsp;</span><span style="color: #0000ff">default</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">DTYPE</span><span style="color: #000000">"</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;DiscriminatorType&nbsp;discriminatorType(&nbsp;)&nbsp;</span><span style="color: #0000ff">default</span><span style="color: #000000">&nbsp;STRING;<br />
&nbsp;&nbsp;&nbsp;String&nbsp;columnDefinition(&nbsp;)&nbsp;</span><span style="color: #0000ff">default</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">""</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;length(&nbsp;)&nbsp;</span><span style="color: #0000ff">default</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">10</span><span style="color: #000000">;<br />
}<br />
</span></div>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>因为我们使用一张表来保存所有继承层次的类，所以我们需要一个某种方式好让持久化实现者知道如何去分辨我们真正想要保存的对象是属于哪个继承层次的，我们靠从一个辨别器的列里面去获得这一点。@javax.persistence.DiscriminatorColumn这个流释就是指示我们哪个类将会存储辨别器，看着注释我们可以知道，这个注释并不是必要的，因为它每项都有默认值，对于辨别器的类型，默认是String类型，我们除了String类型之外，还可以用如下几个类型：char,Integer。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;javax.persistence;<br />
<br />
@Target(TYPE)&nbsp;@Retention(RUNTIME)<br />
</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;@</span><span style="color: #0000ff">interface</span><span style="color: #000000">&nbsp;DiscriminatorValue&nbsp;{<br />
&nbsp;&nbsp;&nbsp;String&nbsp;value(&nbsp;)<br />
}<br />
</span></div>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>这个注释是指示我们辨别器的值是多少，这个只是我们提示辨别器的类型是String的时候，还需要我们去写，如果类型是int或者char的时候，是不需要我们去提定它们的辨别器的值的。所以最好还是使用char或者int类型，以使我们从这些细节方面解放出来。</p>
<p>在我们建立了这种映射策略之后，子类的定义就显得简单多了：</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #000000">@Entity<br />
@DiscriminatorValue&nbsp;<br />
(</span><span style="color: #000000">"</span><span style="color: #000000">CUST</span><span style="color: #000000">"</span><span style="color: #000000">)<br />
</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Customer&nbsp;</span><span style="color: #0000ff">extends</span><span style="color: #000000">&nbsp;Person&nbsp;{<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;String&nbsp;street;<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;String&nbsp;city;<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;String&nbsp;state;<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;String&nbsp;zip;<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;String&nbsp;getStreet(&nbsp;)&nbsp;{&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;street;&nbsp;}<br />
&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;setStreet(String&nbsp;street)&nbsp;{&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.street&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;street;&nbsp;}<br />
<img alt="" src="http://www.blogjava.net/Images/dot.gif" /><br />
}</span></div>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>我们也可以都用默认的值，什么额外的注释都不要加</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #000000">@Entity<br />
</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Employee&nbsp;</span><span style="color: #0000ff">extends</span><span style="color: #000000">&nbsp;Customer&nbsp;{<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;employeeId;<br />
<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;getEmployeeId(&nbsp;)&nbsp;{&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;employeeId;&nbsp;}<br />
&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;setEmployeeId(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;id)&nbsp;{&nbsp;employeeId&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;id;&nbsp;}<br />
}<br />
</span></div>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>在这个例子里面，Customer实体的辨别器列的值设为CUST，这是我们人为设置的。当然我们如果不设置的话，就像Employee，那么它的辨别器列的值就会被设为Employee, 因为它的类的名字就是Employee。</p>
<p><span style="color: #0000ff">优点：</span><br />
SINGLE_TABLE的映射策略是最简单的实现并且性能来说，也是比其它两个要高。因为它只有一张表需要去处理。持久化引擎不需要去做任何复杂的连接组合或者子查询等等，因为所有的的数据都存在一张表里面<br />
<span style="color: #0000ff">缺点：</span><br />
这种策略最大的一个缺点就是所有的有关子类的属性的映射列都必须是nullable，因为你不可能让一个类拥有所有的属性，毕竟这些属性是所有的类加起来的，所以你不能为你的类加上NOT NULL的约束。还有，因为所有子类的属性列对于某些实体类来说都是没有用的，所以SINGLE_TABLE 策略也是不符合规范的。</p>
<img src ="http://www.blogjava.net/WshmAndLily/aggbug/152265.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/WshmAndLily/" target="_blank">semovy</a> 2007-10-12 10:48 <a href="http://www.blogjava.net/WshmAndLily/articles/152265.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>EJB学习日记(18) </title><link>http://www.blogjava.net/WshmAndLily/articles/152267.html</link><dc:creator>semovy</dc:creator><author>semovy</author><pubDate>Fri, 12 Oct 2007 02:48:00 GMT</pubDate><guid>http://www.blogjava.net/WshmAndLily/articles/152267.html</guid><wfw:comment>http://www.blogjava.net/WshmAndLily/comments/152267.html</wfw:comment><comments>http://www.blogjava.net/WshmAndLily/articles/152267.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/WshmAndLily/comments/commentRss/152267.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/WshmAndLily/services/trackbacks/152267.html</trackback:ping><description><![CDATA[<span style="color: red"><strong>继承映射策略之----每个具体类一张表<br />
<br />
</strong></span>昨天我们看了继承关系中的实现，昨天是用一张表保存所有级别的类，今天我们来了解一下第二种实现方法，每一个类一个单独的表的实现，在数据库我们的例子表现如下：<br />
<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #0000ff">create</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">table</span><span style="color: #000000">&nbsp;Person&nbsp;(<br />
&nbsp;&nbsp;&nbsp;id&nbsp;</span><span style="font-weight: bold; color: #000000">integer</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">primary</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">key</span><span style="color: #000000">&nbsp;</span><span style="color: #808080">not</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">,<br />
&nbsp;&nbsp;&nbsp;firstName&nbsp;</span><span style="font-weight: bold; color: #000000">varchar</span><span style="color: #000000">(</span><span style="font-weight: bold; color: #800000">255</span><span style="color: #000000">),<br />
&nbsp;&nbsp;&nbsp;lastName&nbsp;</span><span style="font-weight: bold; color: #000000">varchar</span><span style="color: #000000">(</span><span style="font-weight: bold; color: #800000">255</span><span style="color: #000000">),<br />
);<br />
<br />
</span><span style="color: #0000ff">create</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">table</span><span style="color: #000000">&nbsp;Customer&nbsp;(<br />
&nbsp;&nbsp;&nbsp;id&nbsp;</span><span style="font-weight: bold; color: #000000">integer</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">primary</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">key</span><span style="color: #000000">&nbsp;</span><span style="color: #808080">not</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">,<br />
&nbsp;&nbsp;&nbsp;firstName&nbsp;</span><span style="font-weight: bold; color: #000000">varchar</span><span style="color: #000000">(</span><span style="font-weight: bold; color: #800000">255</span><span style="color: #000000">),<br />
&nbsp;&nbsp;&nbsp;lastName&nbsp;</span><span style="font-weight: bold; color: #000000">varchar</span><span style="color: #000000">(</span><span style="font-weight: bold; color: #800000">255</span><span style="color: #000000">),<br />
&nbsp;&nbsp;&nbsp;street&nbsp;</span><span style="font-weight: bold; color: #000000">varchar</span><span style="color: #000000">(</span><span style="font-weight: bold; color: #800000">255</span><span style="color: #000000">),<br />
&nbsp;&nbsp;&nbsp;city&nbsp;</span><span style="font-weight: bold; color: #000000">varchar</span><span style="color: #000000">(</span><span style="font-weight: bold; color: #800000">255</span><span style="color: #000000">),<br />
&nbsp;&nbsp;&nbsp;state&nbsp;</span><span style="font-weight: bold; color: #000000">varchar</span><span style="color: #000000">(</span><span style="font-weight: bold; color: #800000">255</span><span style="color: #000000">),<br />
&nbsp;&nbsp;&nbsp;zip&nbsp;</span><span style="font-weight: bold; color: #000000">varchar</span><span style="color: #000000">(</span><span style="font-weight: bold; color: #800000">255</span><span style="color: #000000">),<br />
);<br />
<br />
</span><span style="color: #0000ff">create</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">table</span><span style="color: #000000">&nbsp;Employee&nbsp;(<br />
&nbsp;&nbsp;&nbsp;id&nbsp;</span><span style="font-weight: bold; color: #000000">integer</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">primary</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">key</span><span style="color: #000000">&nbsp;</span><span style="color: #808080">not</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">,<br />
&nbsp;&nbsp;&nbsp;firstName&nbsp;</span><span style="font-weight: bold; color: #000000">varchar</span><span style="color: #000000">(</span><span style="font-weight: bold; color: #800000">255</span><span style="color: #000000">),<br />
&nbsp;&nbsp;&nbsp;lastName&nbsp;</span><span style="font-weight: bold; color: #000000">varchar</span><span style="color: #000000">(</span><span style="font-weight: bold; color: #800000">255</span><span style="color: #000000">),<br />
&nbsp;&nbsp;&nbsp;street&nbsp;</span><span style="font-weight: bold; color: #000000">varchar</span><span style="color: #000000">(</span><span style="font-weight: bold; color: #800000">255</span><span style="color: #000000">),<br />
&nbsp;&nbsp;&nbsp;city&nbsp;</span><span style="font-weight: bold; color: #000000">varchar</span><span style="color: #000000">(</span><span style="font-weight: bold; color: #800000">255</span><span style="color: #000000">),<br />
&nbsp;&nbsp;&nbsp;state&nbsp;</span><span style="font-weight: bold; color: #000000">varchar</span><span style="color: #000000">(</span><span style="font-weight: bold; color: #800000">255</span><span style="color: #000000">),<br />
&nbsp;&nbsp;&nbsp;zip&nbsp;</span><span style="font-weight: bold; color: #000000">varchar</span><span style="color: #000000">(</span><span style="font-weight: bold; color: #800000">255</span><span style="color: #000000">),<br />
&nbsp;&nbsp;&nbsp;employeeId&nbsp;</span><span style="font-weight: bold; color: #000000">integer</span><span style="color: #000000">,<br />
);<br />
</span></div>
<br />
此种方式和SINGLE_TABLE的最大的不同就是这些表里面没有了辨别器这一列了，我们不再需要为每一个特定的类设定一个标志以识别它是哪个具体的类了。在这种方式的实现里，每一张表都保存了该类的所有的属性，当然也包括它从父类中继承过来的属性。我们看看代码吧：<br />
<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #000000">@Entity<br />
@Inheritance(strategy</span><span style="color: #000000">=</span><span style="color: #000000">InheritanceType&nbsp;<br />
.TABLE_PER_CLASS)<br />
&nbsp;<br />
<br />
</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Person&nbsp;{<br />
<img alt="" src="http://www.blogjava.net/Images/dot.gif" /><br />
}<br />
<br />
@Entity<br />
</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Customer&nbsp;</span><span style="color: #0000ff">extends</span><span style="color: #000000">&nbsp;Person&nbsp;{<br />
<img alt="" src="http://www.blogjava.net/Images/dot.gif" /><br />
}<br />
<br />
@Entity<br />
</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Employee&nbsp;</span><span style="color: #0000ff">extends</span><span style="color: #000000">&nbsp;Customer&nbsp;{<br />
<img alt="" src="http://www.blogjava.net/Images/dot.gif" /><br />
}</span></div>
<br />
<p>从以上代码可以看出，唯一需要的元数据注释只有InheritanceType，并且这个注释仅仅是用在基类Person上面而已，在他的子类中，根本看不出来有什么不一样，它们就像一个很普通的实体BEAN一样。</p>
<p>优点：<br />
相比于SINGLE_TABLE的映射策略来说，此策略的优点是你可以在每一个子类上定义一些属性的约束，比方说某些属性不能为null等等，这些都是可以定义的，但是你在SINGLE_TABLE里面却是不能定义的，它还有一个优点就是，它对于处理那些遗留的数据库来说更加的容易一些，因为它更灵活一些。<br />
缺点：<br />
此策略依然是不规范的，没有做到物尽其用，因为它为每一个子类都重复定义了很多列，这势必给数据库的资源造成了浪费，当需要进行多态加载的时候，就会进行多次查询，这样也会降低数据库的查询效率，这样比较起来就没有SINGLE_TABLE 策略速度快，但是它在别的方面性能会好一些，在开发你的实体BEAN的时候，最好不要用这种策略，除非你不得不这样做，否则还是用第三种策略来得更好一些，那第三种策略是怎样实现的呢，我们下次再讲。</p>
<img src ="http://www.blogjava.net/WshmAndLily/aggbug/152267.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/WshmAndLily/" target="_blank">semovy</a> 2007-10-12 10:48 <a href="http://www.blogjava.net/WshmAndLily/articles/152267.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>EJB学习日记(16) </title><link>http://www.blogjava.net/WshmAndLily/articles/152264.html</link><dc:creator>semovy</dc:creator><author>semovy</author><pubDate>Fri, 12 Oct 2007 02:46:00 GMT</pubDate><guid>http://www.blogjava.net/WshmAndLily/articles/152264.html</guid><wfw:comment>http://www.blogjava.net/WshmAndLily/comments/152264.html</wfw:comment><comments>http://www.blogjava.net/WshmAndLily/articles/152264.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/WshmAndLily/comments/commentRss/152264.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/WshmAndLily/services/trackbacks/152264.html</trackback:ping><description><![CDATA[<p><span style="color: red"><strong>实体之间的级联关系</strong></span></p>
<p>我们在以前的七种关系映射中经常会在注释中看到如下方法：cascade()，它表示级联，也就是有关联的一些实体，当我们对其中的一些进行操作的时候，与它相关联的实体应该怎么办。这样时候，就需要我们定义cascade的属性了，cascade一共有五种属性，我们可以用其中的一种，也可以用其中的多种混合，其中可用的属性如下：<br />
</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">enum</span><span style="color: #000000">&nbsp;CascadeType<br />
{<br />
&nbsp;&nbsp;&nbsp;ALL,&nbsp;PERSIST,&nbsp;<br />
&nbsp;MERGE,&nbsp;REMOVE,&nbsp;<br />
&nbsp;REFRESH<br />
}</span></div>
<p>&nbsp;</p>
<p>属性中ALL表示所有的级联，如果选了它就表示所有的级联了，也就不必选其它的了。下面我们一个一个来讲讲它们的用处吧：</p>
<p><strong style="color: #0000ff">1，PERSIST</strong><br />
PERSIST的意思就是持久的意思，它表示当我们对其中一个实体进行持久化操作的时候，与它相关联的也同样持久化进数据库，也就是执行insert动作。这样在我们保存的时候，只需要保存一个实体就可以了，与它相关联的实体也会被同时保存。</p>
<p>&nbsp;</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #000000">Customer&nbsp;cust&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Customer(&nbsp;);<br />
Address&nbsp;address&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Address(&nbsp;);<br />
cust.setAddress(address);<br />
<br />
entityManager.persist(cust);<br />
</span></div>
<p>&nbsp;</p>
<p>在上面的代码中，我们只需要持久化cust就可以了，与cust相关联的Address会自动被保存进数据库。如果我们没有指定PERSIST关联，那么我们就需要再调用entityManager.persist(address)来保存Address，这样就比较麻烦了。</p>
<p><strong style="color: #0000ff">2，MERGE<br />
</strong>MERGE就是合并的意思，也就是把当前的实体BEAN的内容合并到数据库里面去，如果当前实体BEAN在数据库里面没有相应的记录，则它会自动插入新的记录，在这一点上，它和PERSIST比较相似。</p>
<p>&nbsp;</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #000000">cust.setName(</span><span style="color: #000000">"</span><span style="color: #000000">William</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
cust.getAddress(&nbsp;).setCity(</span><span style="color: #000000">"</span><span style="color: #000000">Boston</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<br />
entityManager.merge(cust);<br />
</span></div>
<p>&nbsp;</p>
<p>在以上代码中，当我们把cust的名字改了，并且把地址里面的城市名也改了以后，我们合并到数据库的时候，Address表中的数据也一样会跟着更新，那如果我们新加一个地址进去呢？会怎么样呢？结果还是一样的，如果EntityManager发现没有这条数据时，它为了把主体合并到数据库里面去，它就会插入一个新的实体到数据库中。在我们在一对多的时候，可以看到这一点：</p>
<p>&nbsp;</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #000000">Phone&nbsp;phone&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Phone(&nbsp;);<br />
phone.setNumber(</span><span style="color: #000000">"</span><span style="color: #000000">617-666-6666</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<br />
cust.getPhoneNumbers(&nbsp;).add(phone);<br />
Customer&nbsp;newCust</span><span style="color: #000000">=</span><span style="color: #000000">entityManager.merge(cust);<br />
</span></div>
<p>&nbsp;</p>
<p>在这里加了一个新的号码，然后我们合并cust，结果新的phone也被插入数据库了。在这里我们要注意的一点是，在这里只有返回值newCust才是在当前持久化上下文相关联的BEAN，而做为参数传进去的cust并不是，它可以只是一个简单的脱离了EntityManager管理的类。</p>
<p><strong style="color: #0000ff">3，DELETE<br />
</strong>DELETE顾名思义就是删除的意思，当我们删除一个实体的时候，我们标志了DELETE关联的实体都会被相应的删除。</p>
<p>&nbsp;</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #000000">Customer&nbsp;cust&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;entityManager.find(Customer.</span><span style="color: #0000ff">class</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">);<br />
entityManager.remove(cust);</span></div>
<p>&nbsp;</p>
<p>当我们删除一个cust的时候，它相关联的phone，address也会一并被删除。</p>
<p><strong style="color: #0000ff">4，REFRESH</strong><br />
REFRESH就是更新的意思，它有点类似于MERGE，但是它是和MERGE相反的，我们MERGE的时候，会把当前实体的值合并到数据库中，而当我们REFRESH的时候，却是把据库的最新值更新到我们的实体BEAN中。</p>
<p>&nbsp;</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #000000">Customer&nbsp;cust&nbsp;<img alt="" src="http://www.blogjava.net/Images/dot.gif" />;<br />
entityManager.refresh(cust);&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;address&nbsp;would&nbsp;be&nbsp;refreshed&nbsp;too</span></div>
<p>&nbsp;</p>
<p>在上面，如果address在数据库中被别的程序更改了，那么当这句话调用结束之后，cust里面的address也跟着更新了，在这里，cust和address的数据不会被写入数据库，相反的，数据库的最新值将被写入到它们里面。当我们不需要把数据写入数据库，而只需要从数据库里面取最新的时候，这个方法是很有用的。比如数据库某些列是数据库触发某个事件自动更新的，而不需要我们自己去更新，就可以用这个，这个时候，最好不是在这一列上加如下注释以确保此列数据不会被我们人为地更改：<br />
<span style="color: red">&nbsp;@Column (insertable=false, updatable=false...</span></p>
<p><strong style="color: #0000ff">5，ALL<br />
</strong>ALL就是全部的意思，它表示以上四种关联它都拥有。</p>
<p>其实并不是所有的场合都适合用关联，因为有些时候，一些数据的更新并不影响别的数据，这个时候就不需要关联了，比如，我们不希望多对多的时候，如果人改国籍不应该把原来的国家的实体删掉吧。所以在我们使用关联的时候，一定要想清楚，是不是实体之间有相辅相成的关系或者缺一不可的关系。其实使用关联只是让我们偷偷懒而已，因为它可以让我们少写一些相关的代码，呵呵：）<br />
</p>
<img src ="http://www.blogjava.net/WshmAndLily/aggbug/152264.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/WshmAndLily/" target="_blank">semovy</a> 2007-10-12 10:46 <a href="http://www.blogjava.net/WshmAndLily/articles/152264.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>EJB学习日记(14)</title><link>http://www.blogjava.net/WshmAndLily/articles/152262.html</link><dc:creator>semovy</dc:creator><author>semovy</author><pubDate>Fri, 12 Oct 2007 02:45:00 GMT</pubDate><guid>http://www.blogjava.net/WshmAndLily/articles/152262.html</guid><wfw:comment>http://www.blogjava.net/WshmAndLily/comments/152262.html</wfw:comment><comments>http://www.blogjava.net/WshmAndLily/articles/152262.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/WshmAndLily/comments/commentRss/152262.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/WshmAndLily/services/trackbacks/152262.html</trackback:ping><description><![CDATA[<strong style="color: red">实体BEAN的七种关系之---------多对多单向</strong><br />
Many-to-Many Unidirectional Relationship<br />
<br />
多对多的单向关系,一般来说只是为了节省数据库的空间而已,因为它只需要查询关系的一端就可以了,并且它和一对多的不同之处就在于,一对多可以用被控端维护一个对主控端的外键就可以搞定,而它不行,必须要有一张中间的表来进行关系的映射,在某种程度上,它也是挺像一对多的关系的.这种关系在现实中可以用如下关系来说明它:<br />
<p>人和项目的关系,一个人可以参加很多个项目,一个项目也可以让很多人参加,这就是多对多的关系,但是我们在这里可以限定一下,也就是可以知道一个人他参加了哪几个项目,但是我们不需要知道一个项目有多少人参加(如果我们需要知道的话,那就是多对多的双向关系了).</p>
<p>代码如下:</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #008000">/*</span><span style="color: #008000"><br />
&nbsp;*&nbsp;Person.java<br />
&nbsp;*<br />
&nbsp;*&nbsp;Created&nbsp;on&nbsp;2007-9-15,&nbsp;0:11:58<br />
&nbsp;*<br />
&nbsp;*&nbsp;To&nbsp;change&nbsp;this&nbsp;template,&nbsp;choose&nbsp;Tools&nbsp;|&nbsp;Templates<br />
&nbsp;*&nbsp;and&nbsp;open&nbsp;the&nbsp;template&nbsp;in&nbsp;the&nbsp;editor.<br />
&nbsp;</span><span style="color: #008000">*/</span><span style="color: #000000"><br />
<br />
</span><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;lbf.entitybean.test1;<br />
<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.io.Serializable;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.util.List;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.persistence.CascadeType;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.persistence.Entity;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.persistence.GeneratedValue;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.persistence.GenerationType;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.persistence.Id;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.persistence.JoinColumn;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.persistence.JoinTable;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.persistence.ManyToMany;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.persistence.ManyToOne;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.persistence.OneToMany;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.persistence.OneToOne;<br />
<br />
</span><span style="color: #008000">/**</span><span style="color: #008000"><br />
&nbsp;*<br />
&nbsp;*&nbsp;</span><span style="color: #808080">@author</span><span style="color: #008000">&nbsp;Admin<br />
&nbsp;</span><span style="color: #008000">*/</span><span style="color: #000000"><br />
@Entity<br />
</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Person&nbsp;</span><span style="color: #0000ff">implements</span><span style="color: #000000">&nbsp;Serializable&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">final</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">long</span><span style="color: #000000">&nbsp;serialVersionUID&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1L</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;Long&nbsp;id;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;String&nbsp;name;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;String&nbsp;sex;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;age;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;Address&nbsp;address;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;List</span><span style="color: #000000">&lt;</span><span style="color: #000000">Phone</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;phones;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;IDCard&nbsp;idCard;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;Country&nbsp;country;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;List</span><span style="color: #000000">&lt;</span><span style="color: #000000">Car</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;cars;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;List</span><span style="color: #000000">&lt;</span><span style="color: #000000">Flight</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;flights;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;List</span><span style="color: #000000">&lt;</span><span style="color: #000000">Project</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;projects;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;@ManyToMany<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;List</span><span style="color: #000000">&lt;</span><span style="color: #000000">Project</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;getProjects()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;projects;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&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;setProjects(List</span><span style="color: #000000">&lt;</span><span style="color: #000000">Project</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;projects)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.projects&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;projects;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;@ManyToMany(cascade&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;CascadeType.ALL)<br />
&nbsp;&nbsp;&nbsp;&nbsp;@JoinTable(name&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">PersonANDFlight</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;joinColumns&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;{@JoinColumn(name&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">personID</span><span style="color: #000000">"</span><span style="color: #000000">)},&nbsp;inverseJoinColumns&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;{@JoinColumn(name&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">flightID</span><span style="color: #000000">"</span><span style="color: #000000">)})<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;List</span><span style="color: #000000">&lt;</span><span style="color: #000000">Flight</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;getFlights()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;flights;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&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;setFlights(List</span><span style="color: #000000">&lt;</span><span style="color: #000000">Flight</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;flights)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.flights&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;flights;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;@OneToMany(cascade&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;CascadeType.ALL,&nbsp;mappedBy&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">person</span><span style="color: #000000">"</span><span style="color: #000000">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;List</span><span style="color: #000000">&lt;</span><span style="color: #000000">Car</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;getCars()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;cars;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&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;setCars(List</span><span style="color: #000000">&lt;</span><span style="color: #000000">Car</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;cars)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.cars&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;cars;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;@ManyToOne(cascade&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;CascadeType.ALL)<br />
&nbsp;&nbsp;&nbsp;&nbsp;@JoinColumn(name&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">countryID</span><span style="color: #000000">"</span><span style="color: #000000">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;Country&nbsp;getCountry()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;country;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&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;setCountry(Country&nbsp;country)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.country&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;country;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;@OneToOne(cascade&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;CascadeType.ALL)<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;IDCard&nbsp;getIdCard()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;idCard;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&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;setIdCard(IDCard&nbsp;idCard)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.idCard&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;idCard;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;@OneToMany(cascade&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;CascadeType.ALL)<br />
&nbsp;&nbsp;&nbsp;&nbsp;@JoinColumn(name&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">personID</span><span style="color: #000000">"</span><span style="color: #000000">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;List</span><span style="color: #000000">&lt;</span><span style="color: #000000">Phone</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;getPhones()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;phones;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&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;setPhones(List</span><span style="color: #000000">&lt;</span><span style="color: #000000">Phone</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;phones)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.phones&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;phones;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;@OneToOne(cascade&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;{CascadeType.ALL})<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;Address&nbsp;getAddress()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;address;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&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;setAddress(Address&nbsp;address)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.address&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;address;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;getAge()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;age;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&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;setAge(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;age)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.age&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;age;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;String&nbsp;getName()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;name;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&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;setName(String&nbsp;name)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.name&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;name;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;String&nbsp;getSex()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;sex;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&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;setSex(String&nbsp;sex)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.sex&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;sex;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&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;setId(Long&nbsp;id)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.id&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;id;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;@Id<br />
&nbsp;&nbsp;&nbsp;&nbsp;@GeneratedValue(strategy&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;GenerationType.AUTO)<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;Long&nbsp;getId()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;id;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}</span></div>
<br />
Project代码如下<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #008000">/*</span><span style="color: #008000"><br />
&nbsp;*&nbsp;Project.java<br />
&nbsp;*<br />
&nbsp;*&nbsp;Created&nbsp;on&nbsp;2007-9-27,&nbsp;9:47:01<br />
&nbsp;*<br />
&nbsp;*&nbsp;To&nbsp;change&nbsp;this&nbsp;template,&nbsp;choose&nbsp;Tools&nbsp;|&nbsp;Templates<br />
&nbsp;*&nbsp;and&nbsp;open&nbsp;the&nbsp;template&nbsp;in&nbsp;the&nbsp;editor.<br />
&nbsp;</span><span style="color: #008000">*/</span><span style="color: #000000"><br />
<br />
</span><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;lbf.entitybean.test1;<br />
<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.io.Serializable;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.util.Date;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.persistence.Entity;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.persistence.GeneratedValue;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.persistence.GenerationType;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.persistence.Id;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.persistence.Temporal;<br />
<br />
</span><span style="color: #008000">/**</span><span style="color: #008000"><br />
&nbsp;*<br />
&nbsp;*&nbsp;</span><span style="color: #808080">@author</span><span style="color: #008000">&nbsp;hadeslee<br />
&nbsp;</span><span style="color: #008000">*/</span><span style="color: #000000"><br />
@Entity<br />
</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Project&nbsp;</span><span style="color: #0000ff">implements</span><span style="color: #000000">&nbsp;Serializable&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">final</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">long</span><span style="color: #000000">&nbsp;serialVersionUID&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1L</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;Long&nbsp;id;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;String&nbsp;name;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;String&nbsp;description;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;Date&nbsp;fromDate;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;Date&nbsp;toDate;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;String&nbsp;getDescription()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;description;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&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;setDescription(String&nbsp;description)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.description&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;description;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;@Temporal(javax.persistence.TemporalType.DATE)<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;Date&nbsp;getFromDate()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;fromDate;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&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;setFromDate(Date&nbsp;from)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.fromDate&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;from;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;String&nbsp;getName()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;name;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&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;setName(String&nbsp;name)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.name&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;name;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;@Temporal(javax.persistence.TemporalType.DATE)<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;Date&nbsp;getToDate()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;toDate;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&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;setToDate(Date&nbsp;to)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.toDate&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;to;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&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;setId(Long&nbsp;id)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.id&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;id;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;@Id<br />
&nbsp;&nbsp;&nbsp;&nbsp;@GeneratedValue(strategy&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;GenerationType.AUTO)<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;Long&nbsp;getId()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;id;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}</span></div>
<br />
<p><br />
从代码中我们可以看出,我们只在关系的主控端 Person里面加上了@ManyToMany的注释,而在Project里面却没有任何其它的注释,但是由于我们是多对多的关系,不是一对多的关系,是不能由被维护端的一个外键指向我们自己的,因为它有可能要指向很多个人,所以我们只能用一张中间关系表的方式来实现这种关系.</p>
<p>七种关系,到现在已经全部讲完了.其实我们可以在脑海里面过一遍.这七种关系的特点和它适用的地方,在实际的工作中,需要的是活学活用.希望大家都能用好这七种关系.:)</p>
<img src ="http://www.blogjava.net/WshmAndLily/aggbug/152262.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/WshmAndLily/" target="_blank">semovy</a> 2007-10-12 10:45 <a href="http://www.blogjava.net/WshmAndLily/articles/152262.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>EJB学习日记(15) </title><link>http://www.blogjava.net/WshmAndLily/articles/152263.html</link><dc:creator>semovy</dc:creator><author>semovy</author><pubDate>Fri, 12 Oct 2007 02:45:00 GMT</pubDate><guid>http://www.blogjava.net/WshmAndLily/articles/152263.html</guid><wfw:comment>http://www.blogjava.net/WshmAndLily/comments/152263.html</wfw:comment><comments>http://www.blogjava.net/WshmAndLily/articles/152263.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/WshmAndLily/comments/commentRss/152263.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/WshmAndLily/services/trackbacks/152263.html</trackback:ping><description><![CDATA[<span style="color: red"><strong>EJB中的集合映射<br />
</strong></span><br />
<p>我们在前面的一对多以及多对多的情况可以看到，我们会需要对集合进行映射，对于基于List的映射我们在前面已经看过了。但是如果我们想对Map进映射呢，那该怎么办？</p>
<p>其实JPA已经帮我们设计好了。那就是利用@MapKey来进行注释。</p>
<p>我们还是先要看看MapKey的代码吧：</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;javax.persistence;<br />
<br />
@Target({METHOD,&nbsp;FIELD})&nbsp;@Retention(RUNTIME)<br />
</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;@</span><span style="color: #0000ff">interface</span><span style="color: #000000">&nbsp;MapKey<br />
{<br />
&nbsp;&nbsp;&nbsp;String&nbsp;name(&nbsp;)&nbsp;</span><span style="color: #0000ff">default</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">""</span><span style="color: #000000">;<br />
}</span></div>
<br />
应用如下：<br />
<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #000000">@Entity<br />
</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Customer&nbsp;</span><span style="color: #0000ff">implements</span><span style="color: #000000">&nbsp;java.io.Serializable&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;<img alt="" src="http://www.blogjava.net/Images/dot.gif" /><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;Map</span><span style="color: #000000">&lt;</span><span style="color: #000000">String,&nbsp;Phone</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;phoneNumbers&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;HashMap</span><span style="color: #000000">&lt;</span><span style="color: #000000">String,&nbsp;Phone</span><span style="color: #000000">&gt;</span><span style="color: #000000">(&nbsp;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;<img alt="" src="http://www.blogjava.net/Images/dot.gif" /><br />
&nbsp;&nbsp;&nbsp;&nbsp;@OneToMany(cascade</span><span style="color: #000000">=</span><span style="color: #000000">{CascadeType.ALL})<br />
&nbsp;&nbsp;&nbsp;&nbsp;@JoinColumn(name</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">CUSTOMER_ID</span><span style="color: #000000">"</span><span style="color: #000000">)<br />
&nbsp;@MapKey(name</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">number</span><span style="color: #000000">"</span><span style="color: #000000">)&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;Map</span><span style="color: #000000">&lt;</span><span style="color: #000000">String,&nbsp;Phone</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;getPhoneNumbers(&nbsp;)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;phoneNumbers;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&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;setPhoneNumbers(Map</span><span style="color: #000000">&lt;</span><span style="color: #000000">String,&nbsp;Phone</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;phones)&nbsp;<br />
&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.phoneNumbers&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;phones;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}</span></div>
<br />
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在此我们可以看出，@MapKey它只有一个方法，那就是指定名字，并且指定的名字必须是它所在的实体的成员，否则的话就识别不了了，如果我们留空的话，那默认的key就是这个实体类的主键。用它的好处就是，我们有时候对于这个实体来说，仅仅需要知道的是它的某一部份，并且我们希望利用这一部分来进行对实体的操作以及辨别。这样用Map就比用List方便一些了。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在此我们只是在以前一对多的基础上改了一点点而已，以前一对多的时候，没有@MapKey的注释，那么它返回的就是一个List，现在我们加了@MapKey的注释，这样EntityManager来进行操作的时候，就会自动把我们的实体列表根据我们所指定的Key生成一个Map了。在某些情况下用Map确实比用List要方便许多。</p>
<img src ="http://www.blogjava.net/WshmAndLily/aggbug/152263.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/WshmAndLily/" target="_blank">semovy</a> 2007-10-12 10:45 <a href="http://www.blogjava.net/WshmAndLily/articles/152263.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>EJB学习日记(13) </title><link>http://www.blogjava.net/WshmAndLily/articles/148698.html</link><dc:creator>semovy</dc:creator><author>semovy</author><pubDate>Thu, 27 Sep 2007 06:26:00 GMT</pubDate><guid>http://www.blogjava.net/WshmAndLily/articles/148698.html</guid><wfw:comment>http://www.blogjava.net/WshmAndLily/comments/148698.html</wfw:comment><comments>http://www.blogjava.net/WshmAndLily/articles/148698.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/WshmAndLily/comments/commentRss/148698.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/WshmAndLily/services/trackbacks/148698.html</trackback:ping><description><![CDATA[实体BEAN的七种关系之---------多对多双向 <br />
Many-to-Many Bidirectional Relationship<br />
<br />
一般来说,多对多的双向发生在双方都持有对方的很多引用,A可能持有很多个B,B也可能持有很多个A,并且A和B之间还要求能够互相查询.在现实中,我们可以用如下的例子来说明这种关系:<br />
<br />
人和航班,一个人可以订很多次航班,可以是订了今天的,也可以订明天的,因为他工作繁忙,同样的,一个航班不可能只为一个人而开,也可以接受很多个人的预订.并且这种查询是双向的,一个人他可以查询他订了多少个航班,一个航班也可以查询它被多少人订了,这样才好根据订的情况进行安排.<br />
<br />
先看看代码吧. <br />
<br />
还是老样子,Person类的代码<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #008000">/*</span><span style="color: #008000"><br />
&nbsp;*&nbsp;Person.java<br />
&nbsp;*<br />
&nbsp;*&nbsp;Created&nbsp;on&nbsp;2007-9-15,&nbsp;0:11:58<br />
&nbsp;*<br />
&nbsp;*&nbsp;To&nbsp;change&nbsp;this&nbsp;template,&nbsp;choose&nbsp;Tools&nbsp;|&nbsp;Templates<br />
&nbsp;*&nbsp;and&nbsp;open&nbsp;the&nbsp;template&nbsp;in&nbsp;the&nbsp;editor.<br />
&nbsp;</span><span style="color: #008000">*/</span><span style="color: #000000"><br />
<br />
</span><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;lbf.entitybean.test1;<br />
<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.io.Serializable;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.util.List;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.persistence.CascadeType;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.persistence.Entity;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.persistence.GeneratedValue;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.persistence.GenerationType;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.persistence.Id;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.persistence.JoinColumn;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.persistence.JoinTable;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.persistence.ManyToMany;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.persistence.ManyToOne;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.persistence.OneToMany;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.persistence.OneToOne;<br />
<br />
</span><span style="color: #008000">/**</span><span style="color: #008000"><br />
&nbsp;*<br />
&nbsp;*&nbsp;</span><span style="color: #808080">@author</span><span style="color: #008000">&nbsp;Admin<br />
&nbsp;</span><span style="color: #008000">*/</span><span style="color: #000000"><br />
@Entity<br />
</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Person&nbsp;</span><span style="color: #0000ff">implements</span><span style="color: #000000">&nbsp;Serializable&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">final</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">long</span><span style="color: #000000">&nbsp;serialVersionUID&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1L</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;Long&nbsp;id;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;String&nbsp;name;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;String&nbsp;sex;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;age;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;Address&nbsp;address;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;List</span><span style="color: #000000">&lt;</span><span style="color: #000000">Phone</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;phones;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;IDCard&nbsp;idCard;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;Country&nbsp;country;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;List</span><span style="color: #000000">&lt;</span><span style="color: #000000">Car</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;cars;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;List</span><span style="color: #000000">&lt;</span><span style="color: #000000">Flight</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;flights;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;@ManyToMany(cascade&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;CascadeType.ALL)<br />
&nbsp;&nbsp;&nbsp;&nbsp;@JoinTable(name&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">PersonANDFlight</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;joinColumns&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;{@JoinColumn(name&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">personID</span><span style="color: #000000">"</span><span style="color: #000000">)},&nbsp;inverseJoinColumns&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;{@JoinColumn(name&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">flightID</span><span style="color: #000000">"</span><span style="color: #000000">)})<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;List</span><span style="color: #000000">&lt;</span><span style="color: #000000">Flight</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;getFlights()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;flights;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&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;setFlights(List</span><span style="color: #000000">&lt;</span><span style="color: #000000">Flight</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;flights)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.flights&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;flights;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;@OneToMany(cascade&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;CascadeType.ALL,&nbsp;mappedBy&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">person</span><span style="color: #000000">"</span><span style="color: #000000">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;List</span><span style="color: #000000">&lt;</span><span style="color: #000000">Car</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;getCars()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;cars;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&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;setCars(List</span><span style="color: #000000">&lt;</span><span style="color: #000000">Car</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;cars)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.cars&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;cars;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;@ManyToOne(cascade&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;CascadeType.ALL)<br />
&nbsp;&nbsp;&nbsp;&nbsp;@JoinColumn(name&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">countryID</span><span style="color: #000000">"</span><span style="color: #000000">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;Country&nbsp;getCountry()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;country;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&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;setCountry(Country&nbsp;country)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.country&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;country;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;@OneToOne(cascade&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;CascadeType.ALL)<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;IDCard&nbsp;getIdCard()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;idCard;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&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;setIdCard(IDCard&nbsp;idCard)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.idCard&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;idCard;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;@OneToMany(cascade&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;CascadeType.ALL)<br />
&nbsp;&nbsp;&nbsp;&nbsp;@JoinColumn(name&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">personID</span><span style="color: #000000">"</span><span style="color: #000000">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;List</span><span style="color: #000000">&lt;</span><span style="color: #000000">Phone</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;getPhones()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;phones;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&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;setPhones(List</span><span style="color: #000000">&lt;</span><span style="color: #000000">Phone</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;phones)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.phones&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;phones;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;@OneToOne(cascade&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;{CascadeType.ALL})<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;Address&nbsp;getAddress()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;address;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&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;setAddress(Address&nbsp;address)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.address&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;address;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;getAge()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;age;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&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;setAge(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;age)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.age&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;age;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;String&nbsp;getName()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;name;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&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;setName(String&nbsp;name)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.name&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;name;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;String&nbsp;getSex()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;sex;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&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;setSex(String&nbsp;sex)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.sex&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;sex;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&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;setId(Long&nbsp;id)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.id&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;id;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;@Id<br />
&nbsp;&nbsp;&nbsp;&nbsp;@GeneratedValue(strategy&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;GenerationType.AUTO)<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;Long&nbsp;getId()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;id;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}</span></div>
<br />
&nbsp;代表航班的Flight类的代码:<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #008000">/*</span><span style="color: #008000"><br />
&nbsp;*&nbsp;Flight.java<br />
&nbsp;*&nbsp;<br />
&nbsp;*&nbsp;Created&nbsp;on&nbsp;2007-9-24,&nbsp;14:35:45<br />
&nbsp;*&nbsp;<br />
&nbsp;*&nbsp;To&nbsp;change&nbsp;this&nbsp;template,&nbsp;choose&nbsp;Tools&nbsp;|&nbsp;Templates<br />
&nbsp;*&nbsp;and&nbsp;open&nbsp;the&nbsp;template&nbsp;in&nbsp;the&nbsp;editor.<br />
&nbsp;</span><span style="color: #008000">*/</span><span style="color: #000000"><br />
<br />
</span><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;lbf.entitybean.test1;<br />
<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.io.Serializable;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.util.Date;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.util.List;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.persistence.Entity;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.persistence.GeneratedValue;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.persistence.GenerationType;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.persistence.Id;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.persistence.ManyToMany;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.persistence.Temporal;<br />
<br />
</span><span style="color: #008000">/**</span><span style="color: #008000"><br />
&nbsp;*<br />
&nbsp;*&nbsp;</span><span style="color: #808080">@author</span><span style="color: #008000">&nbsp;hadeslee<br />
&nbsp;</span><span style="color: #008000">*/</span><span style="color: #000000"><br />
@Entity<br />
</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Flight&nbsp;</span><span style="color: #0000ff">implements</span><span style="color: #000000">&nbsp;Serializable&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">final</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">long</span><span style="color: #000000">&nbsp;serialVersionUID&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1L</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;Long&nbsp;id;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;@Temporal(javax.persistence.TemporalType.TIME)<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;Date&nbsp;getArriveTime()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;arriveTime;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&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;setArriveTime(Date&nbsp;arriveTime)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.arriveTime&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;arriveTime;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;String&nbsp;getFlightNumber()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;flightNumber;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&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;setFlightNumber(String&nbsp;flightNumber)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.flightNumber&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;flightNumber;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;String&nbsp;getFromCity()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;fromCity;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&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;setFromCity(String&nbsp;fromCity)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.fromCity&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;fromCity;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;@Temporal(javax.persistence.TemporalType.TIME)<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;Date&nbsp;getLeaveTime()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;leaveTime;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&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;setLeaveTime(Date&nbsp;leaveTime)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.leaveTime&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;leaveTime;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;@ManyToMany(mappedBy</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">flights</span><span style="color: #000000">"</span><span style="color: #000000">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;List</span><span style="color: #000000">&lt;</span><span style="color: #000000">Person</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;getPersons()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;persons;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&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;setPersons(List</span><span style="color: #000000">&lt;</span><span style="color: #000000">Person</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;persons)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.persons&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;persons;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;String&nbsp;getToCity()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;toCity;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&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;setToCity(String&nbsp;toCity)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.toCity&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;toCity;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;String&nbsp;flightNumber;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;String&nbsp;fromCity,toCity;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;Date&nbsp;leaveTime,arriveTime;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;List</span><span style="color: #000000">&lt;</span><span style="color: #000000">Person</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;persons;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&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;setId(Long&nbsp;id)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.id&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;id;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;@Id<br />
&nbsp;&nbsp;&nbsp;&nbsp;@GeneratedValue(strategy&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;GenerationType.AUTO)<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;Long&nbsp;getId()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;id;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
}<br />
</span></div>
<br />
我们再来看一看ManyToMany的声明<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;@</span><span style="color: #0000ff">interface</span><span style="color: #000000">&nbsp;ManyToMany<br />
{<br />
&nbsp;&nbsp;&nbsp;Class&nbsp;targetEntity(&nbsp;)&nbsp;</span><span style="color: #0000ff">default</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">.</span><span style="color: #0000ff">class</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;CascadeType[]&nbsp;cascade(&nbsp;)&nbsp;</span><span style="color: #0000ff">default</span><span style="color: #000000">&nbsp;{};<br />
&nbsp;&nbsp;&nbsp;FetchType&nbsp;fetch(&nbsp;)&nbsp;</span><span style="color: #0000ff">default</span><span style="color: #000000">&nbsp;LAZY;<br />
&nbsp;&nbsp;&nbsp;String&nbsp;mappedBy(&nbsp;)&nbsp;</span><span style="color: #0000ff">default</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">""</span><span style="color: #000000">;<br />
}<br />
</span></div>
<br />
<p>从代码可以看出,注释都差不多,只不过多对多的时候,仅仅从两张用外键相连是不够的,必须生成一张用于连接的中间表.也就如下代码所声明的地方:<br />
<span style="color: red">@ManyToMany(cascade = CascadeType.ALL)<br />
&nbsp;&nbsp;&nbsp; @JoinTable(name = "PersonANDFlight", joinColumns = {@JoinColumn(name = "personID")}, inverseJoinColumns = {@JoinColumn(name = "flightID")})<br />
</span>&nbsp;&nbsp;&nbsp; public List&lt;Flight&gt; getFlights() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return flights;<br />
&nbsp;&nbsp;&nbsp; }</p>
<p>我们声明了一张用来连接的表,并且声明了主控端的列名和反转端的列名,其实这个声明不是必要的,当我们不用<span style="color: red">@JoinTable</span>来声明的时候,JBOSS也会为我们自动生成一个连接用的表,表名默认是主控端的表名加上下划线"_"再加上反转端的表名.</p>
<p>从上面的注释我们可以看出,此关系的主控端在Person这一方,因为我们可以在Flight那一方看到如下注释:<br />
<span style="color: red">@ManyToMany(mappedBy="flights")<br />
&nbsp;&nbsp;&nbsp; public List&lt;Person&gt; getPersons() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return persons;<br />
&nbsp;&nbsp;&nbsp; }</span></p>
<p>正是因为双向关系的存在,也由于Person是主控端, 所以Person要取消某次预定只要remove相应的Flight就可以了,而Flight由于是反转端,所以虽然它也可以得到它的所有预定的人,但是它却无法改变这种关系,即使它remove掉了某个Person,但是这种关系并不会在数据库里面表现出来,因为毕竟航班是不能随便取消一个人的登机资格的.</p>
<p>其实按我的理解来说,多对多的双向有点类似于一对多的单向,只不过双方都是一对多,我们这个例子完全可以用一对多来实现,但是一对多实现的话,就会有很多重复的数据存在,因为每个关系都可能会有重复的元素,比如我们这个例子,如果一对多的话,每个航班都会对应几百人,哪怕这几百人下次还坐你的航班,你还要重新定义一下.因为上次的几百人的外键已经指向你了.还要再指向另一个你,必须要重新生成几百个元素,所以在这种情况下,多对多就可以很好的重用数据库里面的表了,在Person和Flight表中,都不会有重复的元素存在了.并且关系也明朗了许多.<br />
</p>
<br />
<img src ="http://www.blogjava.net/WshmAndLily/aggbug/148698.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/WshmAndLily/" target="_blank">semovy</a> 2007-09-27 14:26 <a href="http://www.blogjava.net/WshmAndLily/articles/148698.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>EJB学习日记(12) </title><link>http://www.blogjava.net/WshmAndLily/articles/148696.html</link><dc:creator>semovy</dc:creator><author>semovy</author><pubDate>Thu, 27 Sep 2007 06:25:00 GMT</pubDate><guid>http://www.blogjava.net/WshmAndLily/articles/148696.html</guid><wfw:comment>http://www.blogjava.net/WshmAndLily/comments/148696.html</wfw:comment><comments>http://www.blogjava.net/WshmAndLily/articles/148696.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/WshmAndLily/comments/commentRss/148696.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/WshmAndLily/services/trackbacks/148696.html</trackback:ping><description><![CDATA[<a class="postTitle2" id="viewpost1_TitleUrl" href="http://www.blogjava.net/hadeslee/archive/2007/09/22/ejb12.html">实体BEAN的七种关系之---------一对多双向<br />
&nbsp;One-to-Many Bidirectional Relationship<br />
<br />
在实际生活中,一对多的双向关系也是有的,我们在这里举一个人和车的例子,人可以有很多车,车也必须要有一个主人(只要它是合法的),我们可以知道一个人有多少辆车,我们也可以通过任意一辆车牌号查到这辆车的主人是谁,这种关系不像人和电话,电话是很容易换的,并且很多号码是不用身份证的,但是车必须要上牌并且要用身份证的,这样才好管理嘛.下面我们来看代码吧<br />
<br />
还是一样,先定义一个Person类(我们的Person已经一天一天的变大了:)<br />
<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #008000">/*</span><span style="color: #008000"><br />
&nbsp;*&nbsp;Person.java<br />
&nbsp;*&nbsp;<br />
&nbsp;*&nbsp;Created&nbsp;on&nbsp;2007-9-15,&nbsp;0:11:58<br />
&nbsp;*&nbsp;<br />
&nbsp;*&nbsp;To&nbsp;change&nbsp;this&nbsp;template,&nbsp;choose&nbsp;Tools&nbsp;|&nbsp;Templates<br />
&nbsp;*&nbsp;and&nbsp;open&nbsp;the&nbsp;template&nbsp;in&nbsp;the&nbsp;editor.<br />
&nbsp;</span><span style="color: #008000">*/</span><span style="color: #000000"><br />
<br />
</span><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;lbf.entitybean.test1;<br />
<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.io.Serializable;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.util.List;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.persistence.CascadeType;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.persistence.Entity;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.persistence.GeneratedValue;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.persistence.GenerationType;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.persistence.Id;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.persistence.JoinColumn;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.persistence.ManyToOne;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.persistence.OneToMany;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.persistence.OneToOne;<br />
<br />
</span><span style="color: #008000">/**</span><span style="color: #008000"><br />
&nbsp;*<br />
&nbsp;*&nbsp;</span><span style="color: #808080">@author</span><span style="color: #008000">&nbsp;Admin<br />
&nbsp;</span><span style="color: #008000">*/</span><span style="color: #000000"><br />
@Entity<br />
</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Person&nbsp;</span><span style="color: #0000ff">implements</span><span style="color: #000000">&nbsp;Serializable&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">final</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">long</span><span style="color: #000000">&nbsp;serialVersionUID&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1L</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;Long&nbsp;id;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;String&nbsp;name;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;String&nbsp;sex;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;age;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;Address&nbsp;address;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;List</span><span style="color: #000000">&lt;</span><span style="color: #000000">Phone</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;phones;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;IDCard&nbsp;idCard;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;Country&nbsp;country;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;List</span><span style="color: #000000">&lt;</span><span style="color: #000000">Car</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;cars;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;@OneToMany(cascade</span><span style="color: #000000">=</span><span style="color: #000000">CascadeType.ALL,mappedBy</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">person</span><span style="color: #000000">"</span><span style="color: #000000">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;List</span><span style="color: #000000">&lt;</span><span style="color: #000000">Car</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;getCars()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;cars;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&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;setCars(List</span><span style="color: #000000">&lt;</span><span style="color: #000000">Car</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;cars)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.cars&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;cars;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;@ManyToOne(cascade</span><span style="color: #000000">=</span><span style="color: #000000">CascadeType.ALL)<br />
&nbsp;&nbsp;&nbsp;&nbsp;@JoinColumn(name</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">countryID</span><span style="color: #000000">"</span><span style="color: #000000">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;Country&nbsp;getCountry()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;country;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&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;setCountry(Country&nbsp;country)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.country&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;country;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;@OneToOne(cascade</span><span style="color: #000000">=</span><span style="color: #000000">CascadeType.ALL)<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;IDCard&nbsp;getIdCard()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;idCard;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&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;setIdCard(IDCard&nbsp;idCard)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.idCard&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;idCard;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;@OneToMany(cascade</span><span style="color: #000000">=</span><span style="color: #000000">CascadeType.ALL)<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;List</span><span style="color: #000000">&lt;</span><span style="color: #000000">Phone</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;getPhones()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;phones;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&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;setPhones(List</span><span style="color: #000000">&lt;</span><span style="color: #000000">Phone</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;phones)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.phones&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;phones;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;@OneToOne(cascade</span><span style="color: #000000">=</span><span style="color: #000000">{CascadeType.ALL})<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;Address&nbsp;getAddress()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;address;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&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;setAddress(Address&nbsp;address)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.address&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;address;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;getAge()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;age;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&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;setAge(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;age)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.age&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;age;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;String&nbsp;getName()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;name;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&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;setName(String&nbsp;name)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.name&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;name;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;String&nbsp;getSex()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;sex;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&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;setSex(String&nbsp;sex)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.sex&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;sex;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&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;setId(Long&nbsp;id)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.id&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;id;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;@Id<br />
&nbsp;&nbsp;&nbsp;&nbsp;@GeneratedValue(strategy&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;GenerationType.AUTO)<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;Long&nbsp;getId()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;id;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
}<br />
</span></div>
<br />
然后我们再定义一个Car类<br />
<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #008000">/*</span><span style="color: #008000"><br />
&nbsp;*&nbsp;Car.java<br />
&nbsp;*&nbsp;<br />
&nbsp;*&nbsp;Created&nbsp;on&nbsp;2007-9-20,&nbsp;19:40:39<br />
&nbsp;*&nbsp;<br />
&nbsp;*&nbsp;To&nbsp;change&nbsp;this&nbsp;template,&nbsp;choose&nbsp;Tools&nbsp;|&nbsp;Templates<br />
&nbsp;*&nbsp;and&nbsp;open&nbsp;the&nbsp;template&nbsp;in&nbsp;the&nbsp;editor.<br />
&nbsp;</span><span style="color: #008000">*/</span><span style="color: #000000"><br />
<br />
</span><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;lbf.entitybean.test1;<br />
<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.io.Serializable;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.util.Date;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.persistence.CascadeType;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.persistence.Entity;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.persistence.GeneratedValue;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.persistence.GenerationType;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.persistence.Id;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.persistence.JoinColumn;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.persistence.ManyToOne;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.persistence.Temporal;<br />
<br />
</span><span style="color: #008000">/**</span><span style="color: #008000"><br />
&nbsp;*<br />
&nbsp;*&nbsp;</span><span style="color: #808080">@author</span><span style="color: #008000">&nbsp;hadeslee<br />
&nbsp;</span><span style="color: #008000">*/</span><span style="color: #000000"><br />
@Entity<br />
</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Car&nbsp;</span><span style="color: #0000ff">implements</span><span style="color: #000000">&nbsp;Serializable&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">final</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">long</span><span style="color: #000000">&nbsp;serialVersionUID&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1L</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;Long&nbsp;id;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;Person&nbsp;person;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;String&nbsp;carNumber;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;String&nbsp;carName;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;Date&nbsp;date;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;String&nbsp;getCarName()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;carName;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&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;setCarName(String&nbsp;carName)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.carName&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;carName;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;String&nbsp;getCarNumber()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;carNumber;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&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;setCarNumber(String&nbsp;carNumber)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.carNumber&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;carNumber;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;@Temporal(javax.persistence.TemporalType.DATE)<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;Date&nbsp;getCarDate()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;date;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&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;setCarDate(Date&nbsp;date)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.date&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;date;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;@ManyToOne(cascade</span><span style="color: #000000">=</span><span style="color: #000000">CascadeType.ALL,optional</span><span style="color: #000000">=</span><span style="color: #0000ff">false</span><span style="color: #000000">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;@JoinColumn(name</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">personID</span><span style="color: #000000">"</span><span style="color: #000000">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;Person&nbsp;getPerson()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;person;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&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;setPerson(Person&nbsp;person)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.person&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;person;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&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;setId(Long&nbsp;id)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.id&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;id;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;@Id<br />
&nbsp;&nbsp;&nbsp;&nbsp;@GeneratedValue(strategy&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;GenerationType.AUTO)<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;Long&nbsp;getId()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;id;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
}<br />
</span></div>
<br />
从这里我们可以看到双向的一对多其实和双向的一对一差不多,一个是关系的主控端,一个是关系的被维护端.<br />
,在一对一的双向关系里面,我们可以让任意一方做关系的主控端,任意一方做关系的被维护端(mapped 来注释),但是一对多或者说多一对的双向关系中,主控端必须是多的那一方,也就是Car,在它里面起一个外键指向Person类的主键,然后我们在对它们进行处理的时候,必须两端都要设置一下,才能保证数据的更新是如我们所愿的,比如<br />
<br />
Person p=new Person();<br />
Car car=new Car();<br />
....<br />
p.setCar(car);<br />
car.setPerson(p);<br />
entityManager.persist(p);<br />
这个时候会把car和p都写入数据库,当我们要把car的主人换成p1时,需要做如下动作<br />
p.getCars().remove(car);<br />
car.setPerson(p1);<br />
p1.setCar(car);<br />
这样就可以了,其实只要我们保持一个良好的习惯,那就是更新关系的时候,双方都更新一下,这样就不容易出错了.<br />
<br />
<br />
</a>
<img src ="http://www.blogjava.net/WshmAndLily/aggbug/148696.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/WshmAndLily/" target="_blank">semovy</a> 2007-09-27 14:25 <a href="http://www.blogjava.net/WshmAndLily/articles/148696.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>EJB学习日记(10) </title><link>http://www.blogjava.net/WshmAndLily/articles/148693.html</link><dc:creator>semovy</dc:creator><author>semovy</author><pubDate>Thu, 27 Sep 2007 06:24:00 GMT</pubDate><guid>http://www.blogjava.net/WshmAndLily/articles/148693.html</guid><wfw:comment>http://www.blogjava.net/WshmAndLily/comments/148693.html</wfw:comment><comments>http://www.blogjava.net/WshmAndLily/articles/148693.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/WshmAndLily/comments/commentRss/148693.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/WshmAndLily/services/trackbacks/148693.html</trackback:ping><description><![CDATA[<a class="postTitle2" id="viewpost1_TitleUrl" href="http://www.blogjava.net/hadeslee/archive/2007/09/20/ejb10.html">实体BEAN的七种关系之---------一对多单向<br />
&nbsp;One-to-Many Unidirectional Relationship<br />
<br />
一对多单向最典型的应用莫过于人和电话的关系了,我们一个人可以有很多个电话,有时候还经常会换号码,我们可以既有小灵通也有手机,家里还有固定电话,这就是很典型的一对多关系,为什么要是单向的呢,因为电话的易变性,这个号码可能今天是你的,明天就可能是别人的了,并且现在买手机号码是不需要身份证的,所以从电话号码是不可能查到你的身份证了.并且电话号码也不应该和人绑定,一般我们都是问别人电话是多少,却比较少去问一个号码是谁的(这种情况也有,就是你收到陌生人的电话或短信的时候).那我们还是先看代码吧.<br />
<br />
首先我们还是先要定义一个人的实体类<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #008000">/*</span><span style="color: #008000"><br />
&nbsp;*&nbsp;Person.java<br />
&nbsp;*&nbsp;<br />
&nbsp;*&nbsp;Created&nbsp;on&nbsp;2007-9-15,&nbsp;0:11:58<br />
&nbsp;*&nbsp;<br />
&nbsp;*&nbsp;To&nbsp;change&nbsp;this&nbsp;template,&nbsp;choose&nbsp;Tools&nbsp;|&nbsp;Templates<br />
&nbsp;*&nbsp;and&nbsp;open&nbsp;the&nbsp;template&nbsp;in&nbsp;the&nbsp;editor.<br />
&nbsp;</span><span style="color: #008000">*/</span><span style="color: #000000"><br />
<br />
</span><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;lbf.entitybean.test1;<br />
<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.io.Serializable;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.util.List;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.persistence.CascadeType;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.persistence.Entity;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.persistence.GeneratedValue;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.persistence.GenerationType;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.persistence.Id;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.persistence.JoinColumn;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.persistence.OneToMany;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.persistence.OneToOne;<br />
<br />
</span><span style="color: #008000">/**</span><span style="color: #008000"><br />
&nbsp;*<br />
&nbsp;*&nbsp;</span><span style="color: #808080">@author</span><span style="color: #008000">&nbsp;Admin<br />
&nbsp;</span><span style="color: #008000">*/</span><span style="color: #000000"><br />
@Entity<br />
</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Person&nbsp;</span><span style="color: #0000ff">implements</span><span style="color: #000000">&nbsp;Serializable&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;IDCard&nbsp;idCard;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">final</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">long</span><span style="color: #000000">&nbsp;serialVersionUID&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1L</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;Long&nbsp;id;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;String&nbsp;name;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;String&nbsp;sex;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;age;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;Address&nbsp;address;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;@OneToOne(cascade</span><span style="color: #000000">=</span><span style="color: #000000">CascadeType.ALL,optional</span><span style="color: #000000">=</span><span style="color: #0000ff">true</span><span style="color: #000000">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;Address&nbsp;getAddress()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;address;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&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;setAddress(Address&nbsp;address)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.address&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;address;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;@OneToMany(cascade</span><span style="color: #000000">=</span><span style="color: #000000">CascadeType.ALL)<br />
&nbsp;&nbsp;&nbsp;&nbsp;@JoinColumn(name</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">personID</span><span style="color: #000000">"</span><span style="color: #000000">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;List</span><span style="color: #000000">&lt;</span><span style="color: #000000">Phone</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;getPhones()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;phones;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&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;setPhones(List</span><span style="color: #000000">&lt;</span><span style="color: #000000">Phone</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;phones)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.phones&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;phones;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;List</span><span style="color: #000000">&lt;</span><span style="color: #000000">Phone</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;phones;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;getAge()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;age;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&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;setAge(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;age)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.age&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;age;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;String&nbsp;getName()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;name;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&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;setName(String&nbsp;name)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.name&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;name;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;String&nbsp;getSex()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;sex;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&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;setSex(String&nbsp;sex)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.sex&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;sex;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&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;setId(Long&nbsp;id)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.id&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;id;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;@Id<br />
&nbsp;&nbsp;&nbsp;&nbsp;@GeneratedValue(strategy&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;GenerationType.AUTO)<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;Long&nbsp;getId()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;id;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;@OneToOne(cascade</span><span style="color: #000000">=</span><span style="color: #000000">{CascadeType.ALL})<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;IDCard&nbsp;getIdCard()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;idCard;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&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;setIdCard(IDCard&nbsp;iDCard)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.idCard&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;iDCard;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
<br />
}<br />
</span></div>
<br />
<br />
然后是电话的实体类<br />
<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #008000">/*</span><span style="color: #008000"><br />
&nbsp;*&nbsp;Phone.java<br />
&nbsp;*&nbsp;<br />
&nbsp;*&nbsp;Created&nbsp;on&nbsp;2007-9-18,&nbsp;17:23:28<br />
&nbsp;*&nbsp;<br />
&nbsp;*&nbsp;To&nbsp;change&nbsp;this&nbsp;template,&nbsp;choose&nbsp;Tools&nbsp;|&nbsp;Templates<br />
&nbsp;*&nbsp;and&nbsp;open&nbsp;the&nbsp;template&nbsp;in&nbsp;the&nbsp;editor.<br />
&nbsp;</span><span style="color: #008000">*/</span><span style="color: #000000"><br />
<br />
</span><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;lbf.entitybean.test1;<br />
<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.io.Serializable;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.persistence.CascadeType;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.persistence.Entity;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.persistence.GeneratedValue;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.persistence.GenerationType;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.persistence.Id;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.persistence.ManyToOne;<br />
<br />
</span><span style="color: #008000">/**</span><span style="color: #008000"><br />
&nbsp;*<br />
&nbsp;*&nbsp;</span><span style="color: #808080">@author</span><span style="color: #008000">&nbsp;hadeslee<br />
&nbsp;</span><span style="color: #008000">*/</span><span style="color: #000000"><br />
@Entity<br />
</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Phone&nbsp;</span><span style="color: #0000ff">implements</span><span style="color: #000000">&nbsp;Serializable&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">final</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">long</span><span style="color: #000000">&nbsp;serialVersionUID&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1L</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;Long&nbsp;id;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;String&nbsp;phoneNumber;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;String&nbsp;getPhoneNumber()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;phoneNumber;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&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;setPhoneNumber(String&nbsp;phoneNumber)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.phoneNumber&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;phoneNumber;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&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;setId(Long&nbsp;id)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.id&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;id;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;@Id<br />
&nbsp;&nbsp;&nbsp;&nbsp;@GeneratedValue(strategy&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;GenerationType.AUTO)<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;Long&nbsp;getId()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;id;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
}<br />
</span></div>
<br />
我们可以在Person类里面发现如下注释<br />
<br />
<span style="color: red">&nbsp;@OneToMany(cascade=CascadeType.ALL)<br />
&nbsp;&nbsp;&nbsp; @JoinColumn(name="personID")<br />
<span style="color: #000000">&nbsp;&nbsp;&nbsp; public List&lt;Phone&gt; getPhones() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return phones;<br />
&nbsp;&nbsp;&nbsp; }</span></span><br />
<br />
它代表是一对多,一是指类本身,多是指这个成员,也就是一个类可以对应多个成员.<br />
在一对多里面,无论是单向还是双向,映射关系的维护端都是在多的那一方,也就是Phone那里,因为要在数据库面表现的话,也只有让Phone起一个指向Person的外键,不可能在Person里面指向Phone,这一点和一对一不一样,一对一可以在任意一方起一个外键指向对方.可是一对多却不行了.在这里@JoinColumn这个注释指的却是在Phone里面的外键的列的名字,它并不像在一对一里面的注释指的是自己表里面的外键列名.这一点要特别注意一下.<br />
如果是一对多的双向关系,那么这个注释就要应用到多的那边去了,虽然注释还在Person类里面,但是它起的效果却是在Phone里面起一个叫personID的外键, 因为多的那边要有外键指向少的这边.<br />
<br />
如果你不加&nbsp;&nbsp;&nbsp; @JoinColumn(name="personID")这个注释的话,那么JBOSS就会自动帮你生成一张中间表,它负现Person和Phone表之间的联系.它将会做如下事情:<br />
<pre>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #0000ff">CREATE</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">TABLE</span><span style="color: #000000">&nbsp;PERSON_PHONE<br />
(<br />
&nbsp;&nbsp;&nbsp;&nbsp;PERSON_id&nbsp;</span><span style="font-weight: bold; color: #000000">INT</span><span style="color: #000000">,<br />
&nbsp;PHONE_id&nbsp;</span><span style="font-weight: bold; color: #000000">INT</span><span style="color: #000000"><br />
);<br />
</span><span style="color: #0000ff">ALTER</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">TABLE</span><span style="color: #000000">&nbsp;PERSON_PHONE </span><span style="color: #0000ff">ADD</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">CONSTRAINT</span><span style="color: #000000">&nbsp;person_phone_unique<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">UNIQUE</span><span style="color: #000000">&nbsp;(PHONE_id);<br />
<br />
</span><span style="color: #0000ff">ALTER</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">TABLE</span><span style="color: #000000">&nbsp;PERSON_PHONE </span><span style="color: #0000ff">ADD</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">CONSTRAINT</span><span style="color: #000000">&nbsp;personREFphone<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">FOREIGN</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">KEY</span><span style="color: #000000">&nbsp;(PERSON_id)&nbsp;</span><span style="color: #0000ff">REFERENCES</span><span style="color: #000000">&nbsp;PERSON&nbsp;(id);<br />
<br />
</span><span style="color: #0000ff">ALTER</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">TABLE</span><span style="color: #000000">&nbsp;PERSON_PHONE </span><span style="color: #0000ff">ADD</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">CONSTRAINT</span><span style="color: #000000">&nbsp;personREFphone2<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">FOREIGN</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">KEY</span><span style="color: #000000">&nbsp;(PHONE_id)&nbsp;</span><span style="color: #0000ff">REFERENCES</span><span style="color: #000000">&nbsp;PHONE&nbsp;(id);<br />
<br />
</span></div>
</pre>
所以我们最好还是指定一下,以让程序产生更加确定的行为，不过一般是推荐另外生成一个中间表好一些，因为这样的话，对原来两张表的结构不对造成任何影响。在遗留系统的时候很多用，有些时候，一些表都是以前就建好了的，要改表的结构是不太可能的，所以这个时候中间的表就显得很重要了，它可以在不侵入原来表的情况下构建出一种更清淅更易管理的关系。<br />
<br />
所以一对多的单向关联，我们还是推荐使用一张中间表来建立关系。<br />
</a>
<img src ="http://www.blogjava.net/WshmAndLily/aggbug/148693.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/WshmAndLily/" target="_blank">semovy</a> 2007-09-27 14:24 <a href="http://www.blogjava.net/WshmAndLily/articles/148693.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>EJB学习日记(11) </title><link>http://www.blogjava.net/WshmAndLily/articles/148695.html</link><dc:creator>semovy</dc:creator><author>semovy</author><pubDate>Thu, 27 Sep 2007 06:24:00 GMT</pubDate><guid>http://www.blogjava.net/WshmAndLily/articles/148695.html</guid><wfw:comment>http://www.blogjava.net/WshmAndLily/comments/148695.html</wfw:comment><comments>http://www.blogjava.net/WshmAndLily/articles/148695.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/WshmAndLily/comments/commentRss/148695.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/WshmAndLily/services/trackbacks/148695.html</trackback:ping><description><![CDATA[实体BEAN的七种关系之---------多对一单向<br />
Many-to-One Unidirectional Relationship<br />
<br />
多对一单向在某种程度上不但和一对一单向相似并且还和一对多单向挺相似的，但是又不完全相同。多一对单向一般应用在很多实体对应一个实体，被对应的那个实体并不需要知道谁对应它了，典型的例子就是人对应国家，很多人可以是同一个国家的人，但是一个国家却不可能统计那么多它的人民。我们还是用代码来说话吧。<br />
<br />
先定义Person实体类<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #008000">/*</span><span style="color: #008000"><br />
&nbsp;*&nbsp;Person.java<br />
&nbsp;*&nbsp;<br />
&nbsp;*&nbsp;Created&nbsp;on&nbsp;2007-9-15,&nbsp;0:11:58<br />
&nbsp;*&nbsp;<br />
&nbsp;*&nbsp;To&nbsp;change&nbsp;this&nbsp;template,&nbsp;choose&nbsp;Tools&nbsp;|&nbsp;Templates<br />
&nbsp;*&nbsp;and&nbsp;open&nbsp;the&nbsp;template&nbsp;in&nbsp;the&nbsp;editor.<br />
&nbsp;</span><span style="color: #008000">*/</span><span style="color: #000000"><br />
<br />
</span><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;lbf.entitybean.test1;<br />
<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.io.Serializable;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.util.List;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.persistence.CascadeType;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.persistence.Entity;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.persistence.GeneratedValue;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.persistence.GenerationType;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.persistence.Id;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.persistence.JoinColumn;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.persistence.ManyToOne;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.persistence.OneToMany;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.persistence.OneToOne;<br />
<br />
</span><span style="color: #008000">/**</span><span style="color: #008000"><br />
&nbsp;*<br />
&nbsp;*&nbsp;</span><span style="color: #808080">@author</span><span style="color: #008000">&nbsp;Admin<br />
&nbsp;</span><span style="color: #008000">*/</span><span style="color: #000000"><br />
@Entity<br />
</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Person&nbsp;</span><span style="color: #0000ff">implements</span><span style="color: #000000">&nbsp;Serializable&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">final</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">long</span><span style="color: #000000">&nbsp;serialVersionUID&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1L</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;Long&nbsp;id;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;String&nbsp;name;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;String&nbsp;sex;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;age;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;Address&nbsp;address;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;List</span><span style="color: #000000">&lt;</span><span style="color: #000000">Phone</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;phones;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;IDCard&nbsp;idCard;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;Country&nbsp;country;<br />
&nbsp;&nbsp;&nbsp;&nbsp;@ManyToOne<br />
&nbsp;&nbsp;&nbsp;&nbsp;@JoinColumn(name</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">countryID</span><span style="color: #000000">"</span><span style="color: #000000">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;Country&nbsp;getCountry()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;country;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&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;setCountry(Country&nbsp;country)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.country&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;country;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;@OneToOne(cascade</span><span style="color: #000000">=</span><span style="color: #000000">CascadeType.ALL)<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;IDCard&nbsp;getIdCard()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;idCard;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&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;setIdCard(IDCard&nbsp;idCard)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.idCard&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;idCard;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;@OneToMany(cascade</span><span style="color: #000000">=</span><span style="color: #000000">CascadeType.ALL)<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;List</span><span style="color: #000000">&lt;</span><span style="color: #000000">Phone</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;getPhones()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;phones;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&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;setPhones(List</span><span style="color: #000000">&lt;</span><span style="color: #000000">Phone</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;phones)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.phones&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;phones;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;@OneToOne(cascade</span><span style="color: #000000">=</span><span style="color: #000000">{CascadeType.ALL})<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;Address&nbsp;getAddress()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;address;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&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;setAddress(Address&nbsp;address)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.address&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;address;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;getAge()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;age;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&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;setAge(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;age)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.age&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;age;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;String&nbsp;getName()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;name;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&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;setName(String&nbsp;name)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.name&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;name;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;String&nbsp;getSex()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;sex;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&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;setSex(String&nbsp;sex)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.sex&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;sex;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&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;setId(Long&nbsp;id)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.id&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;id;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;@Id<br />
&nbsp;&nbsp;&nbsp;&nbsp;@GeneratedValue(strategy&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;GenerationType.AUTO)<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;Long&nbsp;getId()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;id;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
}<br />
</span></div>
<br />
再定义Country实体类<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #008000">/*</span><span style="color: #008000"><br />
&nbsp;*&nbsp;Country.java<br />
&nbsp;*&nbsp;<br />
&nbsp;*&nbsp;Created&nbsp;on&nbsp;2007-9-20,&nbsp;0:32:41<br />
&nbsp;*&nbsp;<br />
&nbsp;*&nbsp;To&nbsp;change&nbsp;this&nbsp;template,&nbsp;choose&nbsp;Tools&nbsp;|&nbsp;Templates<br />
&nbsp;*&nbsp;and&nbsp;open&nbsp;the&nbsp;template&nbsp;in&nbsp;the&nbsp;editor.<br />
&nbsp;</span><span style="color: #008000">*/</span><span style="color: #000000"><br />
<br />
</span><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;lbf.entitybean.test1;<br />
<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.io.Serializable;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.persistence.Entity;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.persistence.GeneratedValue;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.persistence.GenerationType;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.persistence.Id;<br />
<br />
</span><span style="color: #008000">/**</span><span style="color: #008000"><br />
&nbsp;*<br />
&nbsp;*&nbsp;</span><span style="color: #808080">@author</span><span style="color: #008000">&nbsp;Admin<br />
&nbsp;</span><span style="color: #008000">*/</span><span style="color: #000000"><br />
@Entity<br />
</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Country&nbsp;</span><span style="color: #0000ff">implements</span><span style="color: #000000">&nbsp;Serializable&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">final</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">long</span><span style="color: #000000">&nbsp;serialVersionUID&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1L</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;Long&nbsp;id;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;String&nbsp;name;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;String&nbsp;phoneHead;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">long</span><span style="color: #000000">&nbsp;population;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;String&nbsp;area;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;String&nbsp;useLanguage;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;String&nbsp;getUseLanguage()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;useLanguage;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&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;setUseLanguage(String&nbsp;language)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.useLanguage&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;language;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;String&nbsp;getArea()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;area;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&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;setArea(String&nbsp;area)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.area&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;area;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;String&nbsp;getName()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;name;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&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;setName(String&nbsp;name)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.name&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;name;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;String&nbsp;getPhoneHead()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;phoneHead;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&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;setPhoneHead(String&nbsp;phoneHead)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.phoneHead&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;phoneHead;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">long</span><span style="color: #000000">&nbsp;getPopulation()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;population;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&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;setPopulation(</span><span style="color: #0000ff">long</span><span style="color: #000000">&nbsp;population)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.population&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;population;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&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;setId(Long&nbsp;id)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.id&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;id;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;@Id<br />
&nbsp;&nbsp;&nbsp;&nbsp;@GeneratedValue(strategy&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;GenerationType.AUTO)<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;Long&nbsp;getId()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;id;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
}<br />
</span></div>
<br />
在这里我们可以看到，Country类和以前一些实体类是一样的，只有最基本的主键注释，对于有人和他关联的事情，他是一点都不知道的。我们可以在Person类看到如下的注释：<br />
<br />
<span style="color: red">@ManyToOne(cascade=CascadeType.ALL)<br />
&nbsp;&nbsp;&nbsp; @JoinColumn(name="countryID")</span><br />
&nbsp;&nbsp;&nbsp; public Country getCountry() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return country;<br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
@ManyToOne的定义如下<br />
<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;@</span><span style="color: #0000ff">interface</span><span style="color: #000000">&nbsp;ManyToOne<br />
{<br />
&nbsp;&nbsp;&nbsp;Class&nbsp;targetEntity(&nbsp;)&nbsp;</span><span style="color: #0000ff">default</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">.</span><span style="color: #0000ff">class</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;CascadeType[]&nbsp;cascade(&nbsp;)&nbsp;</span><span style="color: #0000ff">default</span><span style="color: #000000">&nbsp;{};<br />
&nbsp;&nbsp;&nbsp;FetchType&nbsp;fetch(&nbsp;)&nbsp;</span><span style="color: #0000ff">default</span><span style="color: #000000">&nbsp;EAGER;<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">boolean</span><span style="color: #000000">&nbsp;optional(&nbsp;)&nbsp;</span><span style="color: #0000ff">default</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">true</span><span style="color: #000000">;<br />
}<br />
</span></div>
<br />
<br />
在这里就没有mapped这个属性了，因为在一对多一对多一对的关系里面，关系的维护端都是在多的那一面，所以ManyToOne是没有mapped这个属性的，当然OneToMany也可以不用这个属性而使当前表占主导地位，就像昨天的那个例子一样。因为主控端是Person .外键也是建在Person上面，因为它是多的一面。当然我们在这里也可以省掉@JoinColumn，那样的话会怎么样呢，会不会像一对多单向一样生成中间的表呢？事实是不会的，在这里如果我们去掉@JoinColumn的话，那么一样会在Person表里面生成一列指向Country的外键，这一点和一对多的单向是不一样，在一对多的单向里面，如果我们不在Person&nbsp;里面加上@JoinColumn这个注释，那么JBOSS将会为我们生成一个中间的表，这个表会有一个列指向Person主键，一个列指向Phone主键。所以说为了程序有一定的行为，有些东西我们还是不要省的好。<br />
<br />
其实多对一单向是有点向一对一单向的，在主控端里面，也就是从Person的角度来看，也就是对应了一个Country而已，只不过这个Country是很多Person所共用的，而一对一却没有这一点限制。 <br />
<img src ="http://www.blogjava.net/WshmAndLily/aggbug/148695.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/WshmAndLily/" target="_blank">semovy</a> 2007-09-27 14:24 <a href="http://www.blogjava.net/WshmAndLily/articles/148695.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>EJB学习日记(9) </title><link>http://www.blogjava.net/WshmAndLily/articles/148689.html</link><dc:creator>semovy</dc:creator><author>semovy</author><pubDate>Thu, 27 Sep 2007 06:23:00 GMT</pubDate><guid>http://www.blogjava.net/WshmAndLily/articles/148689.html</guid><wfw:comment>http://www.blogjava.net/WshmAndLily/comments/148689.html</wfw:comment><comments>http://www.blogjava.net/WshmAndLily/articles/148689.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/WshmAndLily/comments/commentRss/148689.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/WshmAndLily/services/trackbacks/148689.html</trackback:ping><description><![CDATA[<p>实体BEAN的七种关系之---------一对一双向<br />
One-to-One Bidirectional Relationship<br />
<br />
一对一双向的情况其实在现实生活中也是挺常见的,最常见的就是人和身份证的关系了,我们每个人都有一个身份证(只要你年满16岁,并且申请了),并且每个身份证都对应一个人,我们可以根据一个人查到他的身份证号码,也可以根据一个身份证号码查到一个人的具体情况,(第一代身份证重码的情况还是有的:(&nbsp;&nbsp; ) .好了,闲话不多说,还是看看代码吧.<br />
<br />
先定义一个Person类<br />
<br />
</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #008000">/*</span><span style="color: #008000"><br />
&nbsp;*&nbsp;Person.java<br />
&nbsp;*&nbsp;<br />
&nbsp;*&nbsp;Created&nbsp;on&nbsp;2007-9-15,&nbsp;0:11:58<br />
&nbsp;*&nbsp;<br />
&nbsp;*&nbsp;To&nbsp;change&nbsp;this&nbsp;template,&nbsp;choose&nbsp;Tools&nbsp;|&nbsp;Templates<br />
&nbsp;*&nbsp;and&nbsp;open&nbsp;the&nbsp;template&nbsp;in&nbsp;the&nbsp;editor.<br />
&nbsp;</span><span style="color: #008000">*/</span><span style="color: #000000"><br />
<br />
</span><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;lbf.entitybean.test1;<br />
<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.io.Serializable;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.util.List;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.persistence.CascadeType;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.persistence.Entity;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.persistence.GeneratedValue;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.persistence.GenerationType;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.persistence.Id;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.persistence.OneToMany;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.persistence.OneToOne;<br />
<br />
</span><span style="color: #008000">/**</span><span style="color: #008000"><br />
&nbsp;*<br />
&nbsp;*&nbsp;</span><span style="color: #808080">@author</span><span style="color: #008000">&nbsp;Admin<br />
&nbsp;</span><span style="color: #008000">*/</span><span style="color: #000000"><br />
@Entity<br />
</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Person&nbsp;</span><span style="color: #0000ff">implements</span><span style="color: #000000">&nbsp;Serializable&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;IDCard&nbsp;idCard;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">final</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">long</span><span style="color: #000000">&nbsp;serialVersionUID&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1L</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;Long&nbsp;id;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;String&nbsp;name;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;String&nbsp;sex;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;age;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;Address&nbsp;address;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;@OneToOne(cascade</span><span style="color: #000000">=</span><span style="color: #000000">CascadeType.ALL,optional</span><span style="color: #000000">=</span><span style="color: #0000ff">true</span><span style="color: #000000">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;Address&nbsp;getAddress()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;address;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&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;setAddress(Address&nbsp;address)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.address&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;address;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;getAge()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;age;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&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;setAge(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;age)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.age&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;age;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;String&nbsp;getName()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;name;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&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;setName(String&nbsp;name)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.name&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;name;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;String&nbsp;getSex()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;sex;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&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;setSex(String&nbsp;sex)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.sex&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;sex;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&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;setId(Long&nbsp;id)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.id&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;id;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;@Id<br />
&nbsp;&nbsp;&nbsp;&nbsp;@GeneratedValue(strategy&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;GenerationType.AUTO)<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;Long&nbsp;getId()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;id;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;@OneToOne(cascade</span><span style="color: #000000">=</span><span style="color: #000000">{CascadeType.ALL},optional</span><span style="color: #000000">=</span><span style="color: #0000ff">true</span><span style="color: #000000">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;IDCard&nbsp;getIdCard()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;idCard;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&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;setIdCard(IDCard&nbsp;iDCard)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.idCard&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;iDCard;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
<br />
}<br />
</span></div>
<br />
<br />
IDCard类<br />
<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #008000">/*</span><span style="color: #008000"><br />
&nbsp;*&nbsp;IDCard.java<br />
&nbsp;*&nbsp;<br />
&nbsp;*&nbsp;Created&nbsp;on&nbsp;2007-9-18,&nbsp;17:05:51<br />
&nbsp;*&nbsp;<br />
&nbsp;*&nbsp;To&nbsp;change&nbsp;this&nbsp;template,&nbsp;choose&nbsp;Tools&nbsp;|&nbsp;Templates<br />
&nbsp;*&nbsp;and&nbsp;open&nbsp;the&nbsp;template&nbsp;in&nbsp;the&nbsp;editor.<br />
&nbsp;</span><span style="color: #008000">*/</span><span style="color: #000000"><br />
<br />
</span><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;lbf.entitybean.test1;<br />
<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.io.Serializable;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.persistence.CascadeType;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.persistence.Entity;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.persistence.GeneratedValue;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.persistence.GenerationType;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.persistence.Id;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.persistence.OneToOne;<br />
<br />
</span><span style="color: #008000">/**</span><span style="color: #008000"><br />
&nbsp;*<br />
&nbsp;*&nbsp;</span><span style="color: #808080">@author</span><span style="color: #008000">&nbsp;hadeslee<br />
&nbsp;</span><span style="color: #008000">*/</span><span style="color: #000000"><br />
@Entity<br />
</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;IDCard&nbsp;</span><span style="color: #0000ff">implements</span><span style="color: #000000">&nbsp;Serializable&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">final</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">long</span><span style="color: #000000">&nbsp;serialVersionUID&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1L</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;Long&nbsp;id;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;Person&nbsp;person;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;String&nbsp;cardNumber;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;String&nbsp;getCardNumber()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;cardNumber;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&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;setCardNumber(String&nbsp;cardNumber)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.cardNumber&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;cardNumber;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;@OneToOne(cascade</span><span style="color: #000000">=</span><span style="color: #000000">CascadeType.ALL,mappedBy</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">idCard</span><span style="color: #000000">"</span><span style="color: #000000">,optional</span><span style="color: #000000">=</span><span style="color: #0000ff">false</span><span style="color: #000000">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;Person&nbsp;getPerson()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;person;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&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;setPerson(Person&nbsp;person)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.person&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;person;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&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;setId(Long&nbsp;id)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.id&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;id;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;@Id<br />
&nbsp;&nbsp;&nbsp;&nbsp;@GeneratedValue(strategy&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;GenerationType.AUTO)<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;Long&nbsp;getId()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;id;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
<br />
}<br />
</span></div>
<br />
在这里我们可以看到一对一单向和一对一双向其实差别也不是很大,无非就是在对方的类里面也定义了一个自己,这样就互相都能找到对方了,在数据表的表现来看,和一对一单向是一模一样的,都是从Person表里面起一个外键连到IDCard的主键.但是只有这种方法吗?<br />
<br />
在Person类里面,定义的IDCard注释是和Address一样的,可是我们在IDCard里面定义的注释却和Person里面的不一样:<br />
<br />
@OneToOne(cascade=CascadeType.ALL,<span style="color: red">mappedBy="idCard",</span>optional=false)<br />
&nbsp;&nbsp;&nbsp; public Person getPerson() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return person;<br />
&nbsp;&nbsp;&nbsp; }<br />
多了一个mappedBy这个方法,它表示什么呢?它表示此表和Person的关系是定义在Person里面的idCard这个成员上面的,它表示此表是一对一关系中的从表,也就是关系是在person表里面维护的,这一点很重要.<br />
<br />
我们也可以让主导权在IDCard上面,也就是让它产生一个指向Person的外键,这也是可以的,但是最好是让&nbsp;Person来维护整个关系,这样更符合我们正常的思维. <br />
<br />
我们也可以看到在Person里面IDCard是注释是optional=true,也就是说一个人是可以没有身份证的,但是一个身份证不可以没有人,所以在IDCard里面注释person的时候,optional就为false了,这样就可以防止一个空的身份证记录进数据库.<br />
<img src ="http://www.blogjava.net/WshmAndLily/aggbug/148689.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/WshmAndLily/" target="_blank">semovy</a> 2007-09-27 14:23 <a href="http://www.blogjava.net/WshmAndLily/articles/148689.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>EJB学习日记(8) </title><link>http://www.blogjava.net/WshmAndLily/articles/146265.html</link><dc:creator>semovy</dc:creator><author>semovy</author><pubDate>Tue, 18 Sep 2007 13:36:00 GMT</pubDate><guid>http://www.blogjava.net/WshmAndLily/articles/146265.html</guid><wfw:comment>http://www.blogjava.net/WshmAndLily/comments/146265.html</wfw:comment><comments>http://www.blogjava.net/WshmAndLily/articles/146265.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/WshmAndLily/comments/commentRss/146265.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/WshmAndLily/services/trackbacks/146265.html</trackback:ping><description><![CDATA[<p>实体BEAN的七种关系之---------一对一单向<br />
<br />
一对一单向,顾名思义,就是只要求从A方到达B方,而不需要从B方到达A方,典型的例子就是,一个人对应一个地址,因为现实生活中,一个地址可能住很多人,所以一般我们只需要根据人查到它的地址,而不太会需要从一个地址去查谁住在那里,不过,真的有这种需求的话,我们就要以用另外一种关系来实现了,这个以后再讲<br />
<br />
首先我们声明一个人的实体类,Person<br />
</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #008000">/*</span><span style="color: #008000"><br />
&nbsp;*&nbsp;Person.java<br />
&nbsp;*&nbsp;<br />
&nbsp;*&nbsp;Created&nbsp;on&nbsp;2007-9-15,&nbsp;0:11:58<br />
&nbsp;*&nbsp;<br />
&nbsp;*&nbsp;To&nbsp;change&nbsp;this&nbsp;template,&nbsp;choose&nbsp;Tools&nbsp;|&nbsp;Templates<br />
&nbsp;*&nbsp;and&nbsp;open&nbsp;the&nbsp;template&nbsp;in&nbsp;the&nbsp;editor.<br />
&nbsp;</span><span style="color: #008000">*/</span><span style="color: #000000"><br />
<br />
</span><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;lbf.entitybean.test1;<br />
<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.io.Serializable;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.util.List;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.persistence.CascadeType;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.persistence.Entity;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.persistence.GeneratedValue;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.persistence.GenerationType;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.persistence.Id;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.persistence.OneToMany;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.persistence.OneToOne;<br />
<br />
</span><span style="color: #008000">/**</span><span style="color: #008000"><br />
&nbsp;*<br />
&nbsp;*&nbsp;</span><span style="color: #808080">@author</span><span style="color: #008000">&nbsp;Admin<br />
&nbsp;</span><span style="color: #008000">*/</span><span style="color: #000000"><br />
@Entity<br />
</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Person&nbsp;</span><span style="color: #0000ff">implements</span><span style="color: #000000">&nbsp;Serializable&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">final</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">long</span><span style="color: #000000">&nbsp;serialVersionUID&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1L</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;Long&nbsp;id;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;String&nbsp;name;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;String&nbsp;sex;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;age;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;Address&nbsp;address;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;@OneToOne(cascade</span><span style="color: #000000">=</span><span style="color: #000000">CascadeType.ALL,optional</span><span style="color: #000000">=</span><span style="color: #0000ff">true</span><span style="color: #000000">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;Address&nbsp;getAddress()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;address;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&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;setAddress(Address&nbsp;address)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.address&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;address;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;getAge()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;age;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&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;setAge(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;age)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.age&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;age;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;String&nbsp;getName()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;name;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&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;setName(String&nbsp;name)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.name&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;name;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;String&nbsp;getSex()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;sex;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&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;setSex(String&nbsp;sex)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.sex&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;sex;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&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;setId(Long&nbsp;id)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.id&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;id;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;@Id<br />
&nbsp;&nbsp;&nbsp;&nbsp;@GeneratedValue(strategy&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;GenerationType.AUTO)<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;Long&nbsp;getId()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;id;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
}<br />
</span></div>
<br />
再来看看Address的实体BEAN定义<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #008000">/*</span><span style="color: #008000"><br />
&nbsp;*&nbsp;Address.java<br />
&nbsp;*&nbsp;<br />
&nbsp;*&nbsp;Created&nbsp;on&nbsp;2007-9-15,&nbsp;0:13:50<br />
&nbsp;*&nbsp;<br />
&nbsp;*&nbsp;To&nbsp;change&nbsp;this&nbsp;template,&nbsp;choose&nbsp;Tools&nbsp;|&nbsp;Templates<br />
&nbsp;*&nbsp;and&nbsp;open&nbsp;the&nbsp;template&nbsp;in&nbsp;the&nbsp;editor.<br />
&nbsp;</span><span style="color: #008000">*/</span><span style="color: #000000"><br />
<br />
</span><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;lbf.entitybean.test1;<br />
<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.io.Serializable;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.persistence.Entity;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.persistence.GeneratedValue;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.persistence.GenerationType;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.persistence.Id;<br />
<br />
</span><span style="color: #008000">/**</span><span style="color: #008000"><br />
&nbsp;*<br />
&nbsp;*&nbsp;</span><span style="color: #808080">@author</span><span style="color: #008000">&nbsp;Admin<br />
&nbsp;</span><span style="color: #008000">*/</span><span style="color: #000000"><br />
@Entity<br />
</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Address&nbsp;</span><span style="color: #0000ff">implements</span><span style="color: #000000">&nbsp;Serializable&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">final</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">long</span><span style="color: #000000">&nbsp;serialVersionUID&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1L</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;Long&nbsp;id;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;String&nbsp;country,province,city,street;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;postcode;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;String&nbsp;getCity()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;city;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&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;setCity(String&nbsp;city)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.city&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;city;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;String&nbsp;getCountry()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;country;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&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;setCountry(String&nbsp;country)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.country&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;country;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;getPostcode()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;postcode;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&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;setPostcode(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;postcode)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.postcode&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;postcode;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;String&nbsp;getStreet()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;street;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&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;setStreet(String&nbsp;street)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.street&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;street;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&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;setId(Long&nbsp;id)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.id&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;id;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;@Id<br />
&nbsp;&nbsp;&nbsp;&nbsp;@GeneratedValue(strategy&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;GenerationType.AUTO)<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;Long&nbsp;getId()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;id;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
}<br />
</span></div>
<br />
以上便是两个类的定义,从Person里面我们可以看到如下的代码<br />
<br />
<span style="color: red">@OneToOne(cascade=CascadeType.ALL,optional=true)</span><br />
&nbsp;&nbsp;&nbsp; public Address getAddress() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return address;<br />
&nbsp;&nbsp;&nbsp; }<br />
在这里的@OneToOne就是注释是一对一的关系,其中cascade是表示级联的关系,是级联删除还是级联更新,还是所有,我们这里选择的是所有,这样的好处就是,我们在插入Person的时候,就顺带的把Person里面包含的Address一起插入数据库里面,当我们删除Person的时候,也是把这个Person对应的Address从数据库里面删除,否则就需要我们人工的删除两遍或者插入两遍等等,optional表示这个成员是不是可选的,我们这里是可选的,也就是说一个人可以没有地址(比如流浪汉:)).<br />
然后我们发现,在Address里面只有一些简单的EntityBean的注释,并没有表示关系的注释,这是因为本例是一对一单向的实现,Person里面有&nbsp;Address,而Address却什么都不知道,它对应到数据库里面只是一张简单的表而已,Person对应到数据库里面就有一个指向Address的外键.我们也可以增加注释指定外键的列的名字,如下:<br />
@OneToOne(cascade=CascadeType.ALL,optional=true)<br />
<span style="color: red">@JoinColumn(name="addressID")</span><br />
&nbsp;&nbsp;&nbsp; public Address getAddress() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return address;<br />
&nbsp;&nbsp;&nbsp; }<br />
如果我们不加的话,也是可以通过的,在JBOSS里面,它会自动帮你生成你指向这个类的类名加上下划线再加上id的列,也就是默认列名是:address_id.<br />
<br />
如果是主键相关联的话,那么可以运用如下注释<br />
<br />
<span class="docEmphStrong">@OneToOne(cascade={CascadeType.ALL})<br />
<span style="color: red">&nbsp;&nbsp; @PrimaryKeyJoinColumn</span><br />
</span><br />
&nbsp;&nbsp; public Address getAddress( ) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return homeAddress;<br />
&nbsp;&nbsp; }<br />
它表示两张表的关联是根据两张表的主键的<br />
<br />
以下是一些注释的定义,我们看一下可以了解一下这些注释有哪些方法,<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;@</span><span style="color: #0000ff">interface</span><span style="color: #000000">&nbsp;JoinColumn<br />
{<br />
&nbsp;&nbsp;&nbsp;String&nbsp;name(&nbsp;)&nbsp;</span><span style="color: #0000ff">default</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">""</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;String&nbsp;referencedColumnName(&nbsp;)&nbsp;</span><span style="color: #0000ff">default</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">""</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">boolean</span><span style="color: #000000">&nbsp;unique(&nbsp;)&nbsp;</span><span style="color: #0000ff">default</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">false</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">boolean</span><span style="color: #000000">&nbsp;nullable(&nbsp;)&nbsp;</span><span style="color: #0000ff">default</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">true</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">boolean</span><span style="color: #000000">&nbsp;insertable(&nbsp;)&nbsp;</span><span style="color: #0000ff">default</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">true</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">boolean</span><span style="color: #000000">&nbsp;updatable(&nbsp;)&nbsp;</span><span style="color: #0000ff">default</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">true</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;String&nbsp;columnDefinition(&nbsp;)&nbsp;</span><span style="color: #0000ff">default</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">""</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;String&nbsp;table(&nbsp;)&nbsp;</span><span style="color: #0000ff">default</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">""</span><span style="color: #000000">;<br />
}<br />
</span></div>
<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;@</span><span style="color: #0000ff">interface</span><span style="color: #000000">&nbsp;OneToOne<br />
{<br />
&nbsp;&nbsp;&nbsp;Class&nbsp;targetEntity(&nbsp;)&nbsp;</span><span style="color: #0000ff">default</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">.</span><span style="color: #0000ff">class</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;CascadeType[]&nbsp;cascade(&nbsp;)&nbsp;</span><span style="color: #0000ff">default</span><span style="color: #000000">&nbsp;{};<br />
&nbsp;&nbsp;&nbsp;FetchType&nbsp;<br />
&nbsp;fetch(&nbsp;)&nbsp;</span><span style="color: #0000ff">default</span><span style="color: #000000">&nbsp;EAGER;<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">boolean</span><span style="color: #000000">&nbsp;optional(&nbsp;)&nbsp;</span><span style="color: #0000ff">default</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">true</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;String&nbsp;mappedBy(&nbsp;)&nbsp;</span><span style="color: #0000ff">default</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">""</span><span style="color: #000000">;<br />
}<br />
</span></div>
<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;@</span><span style="color: #0000ff">interface</span><span style="color: #000000">&nbsp;PrimaryKeyJoinColumn<br />
{<br />
&nbsp;&nbsp;&nbsp;String&nbsp;name(&nbsp;)&nbsp;</span><span style="color: #0000ff">default</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">""</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;String&nbsp;referencedColumnName(&nbsp;)&nbsp;</span><span style="color: #0000ff">default</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">""</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;String&nbsp;columnDefinition(&nbsp;)&nbsp;</span><span style="color: #0000ff">default</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">""</span><span style="color: #000000">;<br />
}<br />
</span></div>
<br />
<img src ="http://www.blogjava.net/WshmAndLily/aggbug/146265.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/WshmAndLily/" target="_blank">semovy</a> 2007-09-18 21:36 <a href="http://www.blogjava.net/WshmAndLily/articles/146265.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>EJB初学日记（6）</title><link>http://www.blogjava.net/WshmAndLily/articles/146262.html</link><dc:creator>semovy</dc:creator><author>semovy</author><pubDate>Tue, 18 Sep 2007 13:31:00 GMT</pubDate><guid>http://www.blogjava.net/WshmAndLily/articles/146262.html</guid><wfw:comment>http://www.blogjava.net/WshmAndLily/comments/146262.html</wfw:comment><comments>http://www.blogjava.net/WshmAndLily/articles/146262.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/WshmAndLily/comments/commentRss/146262.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/WshmAndLily/services/trackbacks/146262.html</trackback:ping><description><![CDATA[<div class="postText"><span class="dark_c" style="font-weight: bold; font-size: 14pt">实体BEAN的关联<br />
<br />
</span>
<p>今天自己写了一个例子,有关实体BEAN的关联问题,我写的这个例子是一对多的情况,一是人,多是狗,一个人可以养多条狗,每条狗都必须有一个主人,在删除主人的时候,狗就没有存在的必要了,所以狗也要跟着删除,可是删除狗的时候,主人却可以在.一开始我实现的时候,删除狗的操作是错误的,我以为直接把Person里面的Dog删掉,然后更新Person就可以了,谁知不是这样的,你在增加了Person中的狗的时候,你更新Person就可以把狗加进来了,可是当你把Person里面的狗删除掉时,再更新Person,数据库里面的狗却不会少.而要你显示的调用em.remove()去删除你想删除的狗,并且你对这狗不能设置为级联删除,否则你删除狗的时候把人也删掉了,这当然不是我们希望看到的.</p>
<p>下面附上代码</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;com.hadeslee.session;&nbsp;&nbsp;&nbsp;<br />
&nbsp; &nbsp;<br />
&nbsp;</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;com.hadeslee.entity.Person;&nbsp;&nbsp;&nbsp;<br />
&nbsp;</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.util.List;&nbsp;&nbsp;&nbsp;<br />
&nbsp;</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.ejb.Remote;&nbsp;&nbsp;&nbsp;<br />
&nbsp; &nbsp;<br />
&nbsp; &nbsp;<br />
&nbsp;</span><span style="color: #008000">/**</span><span style="color: #008000">&nbsp;&nbsp;<br />
&nbsp; *&nbsp;This&nbsp;is&nbsp;the&nbsp;business&nbsp;interface&nbsp;for&nbsp;PersonDAO&nbsp;enterprise&nbsp;bean.&nbsp;&nbsp;<br />
&nbsp; </span><span style="color: #008000">*/</span><span style="color: #000000">&nbsp;&nbsp;<br />
&nbsp;@Remote&nbsp;&nbsp;<br />
&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">interface</span><span style="color: #000000">&nbsp;PersonDAORemote&nbsp;{&nbsp;&nbsp;&nbsp;<br />
&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;insertPerson(Person&nbsp;p);&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;List&nbsp;getAllPersons();&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;Person&nbsp;findPerson(</span><span style="color: #0000ff">long</span><span style="color: #000000">&nbsp;id);&nbsp;&nbsp;&nbsp;<br />
&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;deletePerson(</span><span style="color: #0000ff">long</span><span style="color: #000000">&nbsp;id);&nbsp;&nbsp;&nbsp;<br />
&nbsp;}&nbsp;&nbsp;&nbsp; <br />
</span></div>
<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;com.hadeslee.session;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;com.hadeslee.entity.Dog;&nbsp;&nbsp;&nbsp;<br />
&nbsp;</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;com.hadeslee.entity.Person;&nbsp;&nbsp;&nbsp;<br />
&nbsp;</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.util.List;&nbsp;&nbsp;&nbsp;<br />
&nbsp;</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.ejb.Remote;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;</span><span style="color: #008000">/**</span><span style="color: #008000">&nbsp;&nbsp;<br />
&nbsp;&nbsp;*&nbsp;This&nbsp;is&nbsp;the&nbsp;business&nbsp;interface&nbsp;for&nbsp;PersonToDogs&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;enterprise&nbsp;bean.&nbsp;&nbsp;<br />
&nbsp;&nbsp;</span><span style="color: #008000">*/</span><span style="color: #000000">&nbsp;&nbsp;<br />
&nbsp;@Remote&nbsp;&nbsp;<br />
</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">interface</span><span style="color: #000000">&nbsp;PersonToDogsRemote&nbsp;</span><span style="color: #0000ff">extends</span><span style="color: #000000">&nbsp;PersonDAORemote{&nbsp;&nbsp;&nbsp;<br />
&nbsp;&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;addDog(Person&nbsp;p,Dog&nbsp;dog);&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;Person&nbsp;removeDog(Person&nbsp;p,Dog&nbsp;dog);&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;List&nbsp;getDogs(Person&nbsp;p);&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;Person&nbsp;getOwner(Dog&nbsp;dog);&nbsp;&nbsp;&nbsp;<br />
&nbsp;}&nbsp;&nbsp;&nbsp; <br />
</span></div>
<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000">&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">/*</span><span style="color: #008000">&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;*&nbsp;PersonDAOBean.java&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;*&nbsp;Created&nbsp;on&nbsp;2006年12月13日,&nbsp;下午3:53&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;*&nbsp;To&nbsp;change&nbsp;this&nbsp;template,&nbsp;choose&nbsp;Tools&nbsp;|&nbsp;Template&nbsp;Manager&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;*&nbsp;and&nbsp;open&nbsp;the&nbsp;template&nbsp;in&nbsp;the&nbsp;editor.&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">*/</span><span style="color: #000000">&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;</span><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;com.hadeslee.session;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;com.hadeslee.entity.Person;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.util.List;&nbsp;&nbsp;&nbsp;<br />
&nbsp;</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.ejb.Stateful;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.persistence.Query;&nbsp;&nbsp;&nbsp;<br />
&nbsp;</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.persistence.EntityManager;&nbsp;&nbsp;&nbsp;<br />
&nbsp;</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.persistence.PersistenceContext;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;</span><span style="color: #008000">/**</span><span style="color: #008000">&nbsp;&nbsp;<br />
&nbsp;&nbsp;*&nbsp;&nbsp;<br />
&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080">@author</span><span style="color: #008000">&nbsp;lbf&nbsp;&nbsp;<br />
&nbsp;&nbsp;</span><span style="color: #008000">*/</span><span style="color: #000000">&nbsp;&nbsp;<br />
&nbsp;@Stateful&nbsp;&nbsp;<br />
</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;PersonDAOBean&nbsp;</span><span style="color: #0000ff">implements</span><span style="color: #000000">&nbsp;com.hadeslee.session.PersonDAORemote&nbsp;{&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;@PersistenceContext&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">protected</span><span style="color: #000000">&nbsp;EntityManager&nbsp;em;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;</span><span style="color: #008000">/**</span><span style="color: #008000">&nbsp;Creates&nbsp;a&nbsp;new&nbsp;instance&nbsp;of&nbsp;PersonDAOBean&nbsp;</span><span style="color: #008000">*/</span><span style="color: #000000">&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;PersonDAOBean()&nbsp;{&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;<br />
&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;insertPerson(Person&nbsp;p)&nbsp;{&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;em.persist(p);&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">保存成功</span><span style="color: #000000">"</span><span style="color: #000000">);&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;List&nbsp;getAllPersons()&nbsp;{&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Query&nbsp;query</span><span style="color: #000000">=</span><span style="color: #000000">em.createQuery(</span><span style="color: #000000">"</span><span style="color: #000000">select&nbsp;p&nbsp;from&nbsp;Person&nbsp;p&nbsp;order&nbsp;by&nbsp;p.id</span><span style="color: #000000">"</span><span style="color: #000000">);&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;query.getResultList();&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;Person&nbsp;findPerson(</span><span style="color: #0000ff">long</span><span style="color: #000000">&nbsp;id)&nbsp;{&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;em.find(Person.</span><span style="color: #0000ff">class</span><span style="color: #000000">,id);&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&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;deletePerson(</span><span style="color: #0000ff">long</span><span style="color: #000000">&nbsp;id){&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;em.remove(em.find(Person.</span><span style="color: #0000ff">class</span><span style="color: #000000">,id));&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
}&nbsp;&nbsp; <br />
</span></div>
<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000">&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">.&nbsp;&nbsp;</span><span style="color: #008000">/*</span><span style="color: #008000">&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;2.&nbsp;&nbsp;*&nbsp;PersonToDogsBean.java&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;3.&nbsp;&nbsp;*&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;4.&nbsp;&nbsp;*&nbsp;Created&nbsp;on&nbsp;2006年12月13日,&nbsp;下午4:50&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;5.&nbsp;&nbsp;*&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;6.&nbsp;&nbsp;*&nbsp;To&nbsp;change&nbsp;this&nbsp;template,&nbsp;choose&nbsp;Tools&nbsp;|&nbsp;Template&nbsp;Manager&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;7.&nbsp;&nbsp;*&nbsp;and&nbsp;open&nbsp;the&nbsp;template&nbsp;in&nbsp;the&nbsp;editor.&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;8.&nbsp;&nbsp;</span><span style="color: #008000">*/</span><span style="color: #000000">&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">9</span><span style="color: #000000">.&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;</span><span style="color: #000000">10</span><span style="color: #000000">.&nbsp;</span><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;com.hadeslee.session;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;</span><span style="color: #000000">11</span><span style="color: #000000">.&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;</span><span style="color: #000000">12</span><span style="color: #000000">.&nbsp;</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;com.hadeslee.entity.Dog;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;</span><span style="color: #000000">13</span><span style="color: #000000">.&nbsp;</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;com.hadeslee.entity.Person;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;</span><span style="color: #000000">14</span><span style="color: #000000">.&nbsp;</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.util.List;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;</span><span style="color: #000000">15</span><span style="color: #000000">.&nbsp;</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.ejb.Stateless;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;</span><span style="color: #000000">16</span><span style="color: #000000">.&nbsp;</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.persistence.Query;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;</span><span style="color: #000000">17</span><span style="color: #000000">.&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;</span><span style="color: #000000">18</span><span style="color: #000000">.&nbsp;</span><span style="color: #008000">/**</span><span style="color: #008000">&nbsp;&nbsp;<br />
&nbsp;&nbsp;19.&nbsp;&nbsp;*&nbsp;&nbsp;<br />
&nbsp;&nbsp;20.&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080">@author</span><span style="color: #008000">&nbsp;lbf&nbsp;&nbsp;<br />
&nbsp;&nbsp;21.&nbsp;&nbsp;</span><span style="color: #008000">*/</span><span style="color: #000000">&nbsp;&nbsp;<br />
&nbsp;&nbsp;</span><span style="color: #000000">22</span><span style="color: #000000">.&nbsp;@Stateless&nbsp;&nbsp;<br />
&nbsp;&nbsp;</span><span style="color: #000000">23</span><span style="color: #000000">.&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;PersonToDogsBean&nbsp;</span><span style="color: #0000ff">extends</span><span style="color: #000000">&nbsp;PersonDAOBean&nbsp;</span><span style="color: #0000ff">implements</span><span style="color: #000000">&nbsp;com.hadeslee.session.PersonToDogsRemote&nbsp;{&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;</span><span style="color: #000000">24</span><span style="color: #000000">.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;</span><span style="color: #000000">25</span><span style="color: #000000">.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">/**</span><span style="color: #008000">&nbsp;Creates&nbsp;a&nbsp;new&nbsp;instance&nbsp;of&nbsp;PersonToDogsBean&nbsp;</span><span style="color: #008000">*/</span><span style="color: #000000">&nbsp;&nbsp;<br />
&nbsp;&nbsp;</span><span style="color: #000000">26</span><span style="color: #000000">.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;PersonToDogsBean()&nbsp;{&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;</span><span style="color: #000000">27</span><span style="color: #000000">.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;</span><span style="color: #000000">28</span><span style="color: #000000">.&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;</span><span style="color: #000000">29</span><span style="color: #000000">.&nbsp;&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;addDog(Person&nbsp;p,&nbsp;Dog&nbsp;dog)&nbsp;{&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;</span><span style="color: #000000">30</span><span style="color: #000000">.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p.addDog(dog);&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;</span><span style="color: #000000">31</span><span style="color: #000000">.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;em.merge(p);&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;</span><span style="color: #000000">32</span><span style="color: #000000">.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;</span><span style="color: #000000">33</span><span style="color: #000000">.&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;</span><span style="color: #000000">34</span><span style="color: #000000">.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;Person&nbsp;removeDog(Person&nbsp;p,&nbsp;Dog&nbsp;dog)&nbsp;{&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;</span><span style="color: #000000">35</span><span style="color: #000000">.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">em.remove(dog);&nbsp;&nbsp;&nbsp;</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;</span><span style="color: #000000">36</span><span style="color: #000000">.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p.removeDog(dog);&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;</span><span style="color: #000000">37</span><span style="color: #000000">.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">此时P的大小是：</span><span style="color: #000000">"</span><span style="color: #000000">+</span><span style="color: #000000">p.getDogs().size());&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;</span><span style="color: #000000">38</span><span style="color: #000000">.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;em.merge(p);&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;</span><span style="color: #000000">39</span><span style="color: #000000">.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;p;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;</span><span style="color: #000000">40</span><span style="color: #000000">.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;</span><span style="color: #000000">41</span><span style="color: #000000">.&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;</span><span style="color: #000000">42</span><span style="color: #000000">.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;List&nbsp;getDogs(Person&nbsp;p)&nbsp;{&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;</span><span style="color: #000000">43</span><span style="color: #000000">.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;p.getDogs();&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;</span><span style="color: #000000">44</span><span style="color: #000000">.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;</span><span style="color: #000000">45</span><span style="color: #000000">.&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;</span><span style="color: #000000">46</span><span style="color: #000000">.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;Person&nbsp;getOwner(Dog&nbsp;dog)&nbsp;{&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;</span><span style="color: #000000">47</span><span style="color: #000000">.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Query&nbsp;query</span><span style="color: #000000">=</span><span style="color: #000000">em.createQuery(</span><span style="color: #000000">"</span><span style="color: #000000">select&nbsp;p&nbsp;from&nbsp;Person&nbsp;p&nbsp;where&nbsp;p.id=?1</span><span style="color: #000000">"</span><span style="color: #000000">);&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;</span><span style="color: #000000">48</span><span style="color: #000000">.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;query.setParameter(</span><span style="color: #000000">1</span><span style="color: #000000">,dog.getOwner().getId());&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;</span><span style="color: #000000">49</span><span style="color: #000000">.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;(Person)query.getSingleResult();&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;</span><span style="color: #000000">50</span><span style="color: #000000">.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;</span><span style="color: #000000">51</span><span style="color: #000000">.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;</span><span style="color: #000000">52</span><span style="color: #000000">.&nbsp;}&nbsp; <br />
</span></div>
目前的代码是不能正常删除的,要正常删除狗的话,必须把em.remove() 那句话还原,然把再把em.merge()那句话注释起来才行还有一个现象,那就是我在对远程对象进行了操作以后,并不会反映到我的本地对象,比如我调用了删除人里面的一条狗,在远程或者在数据库里面确实是删掉了,可是我在调用人的时候,里面还是有那么的狗,这样就会产生不同步的现象,为了消除这种现象,我把接口写了一个,改为进行了删除操作的时候,它会再次返回Person对象,这个时候就可以保证远程对象和本地对象的一致性了. 增加代码没写,所以每次增加了狗后,调用Person对象时,依然是增加前一样的,也就是说,当我持有了远程对象发过来的本地对象后,如果我不对其进行操作,无论你怎么调用远程方法,此方法会对其有影响的,JVM都不会返回一个最新的给你,而你用的永远是第一次传过来的那个以象,所以,在远程对象传输中,必须要注意同步性,要么就每次都从远程去取最新的对象,要么就先对本地对象做同样的操作,比如前面的addDog动作,先在本地执行一遍,然后远程执行远程的,这样就可以同步了,不过我觉得如果是网络允许的情况下,还是每次对对象操作后都能返回最新的对象好一些,免得手工去保持和远程对象的同步,这样不可靠.<br />
&nbsp;一对多目前只看到了这么多,接下来要看一下多对多的情况. </div>
<img src ="http://www.blogjava.net/WshmAndLily/aggbug/146262.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/WshmAndLily/" target="_blank">semovy</a> 2007-09-18 21:31 <a href="http://www.blogjava.net/WshmAndLily/articles/146262.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>EJB学习日记(7) </title><link>http://www.blogjava.net/WshmAndLily/articles/146263.html</link><dc:creator>semovy</dc:creator><author>semovy</author><pubDate>Tue, 18 Sep 2007 13:31:00 GMT</pubDate><guid>http://www.blogjava.net/WshmAndLily/articles/146263.html</guid><wfw:comment>http://www.blogjava.net/WshmAndLily/comments/146263.html</wfw:comment><comments>http://www.blogjava.net/WshmAndLily/articles/146263.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/WshmAndLily/comments/commentRss/146263.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/WshmAndLily/services/trackbacks/146263.html</trackback:ping><description><![CDATA[<div class="postText">七种映射关系<br />
<br />
在实体BEAN中,互相之间的关系有七种,分别是如下七种<br />
<br />
1,一对一单向<br />
2,一对一双向<br />
3,一对多单向<br />
4,一对多双向<br />
5,多对一单向<br />
6,多对多单向<br />
7,多对多双向<br />
<br />
大家可能发现,为什么没有多对一双向呢?其实多对一的双向,就是一对多的双向,道理是一样的.<br />
<br />
今天把典型的应用场哈举个例子,改天再用代码来说话<br />
1,一对一单向.<br />
典型场合:一个人对应一个地址,我们一般只要求给定一个人知道他的地址,却不需要给定一个地址确定一个人的<br />
2,一对一双向<br />
典型场合:一个人对应一个身份证号,我们可以根据一个人得到它的身份证号码,也可以根据身份证号码确定一个人<br />
3,一对多单向<br />
典型场合:一个人对应很多他的电话, 我们一般只要求给定一个人得到他的所有电话,却不会用一个电话去反查一个人,因为电话是很容易改变的<br />
4,一对多双向<br />
典型场合:旅行和预订,一次旅程有多个预订,我们可以根据某次旅程查到这次旅行所对应的预订,也可以根据一次预订查到它所属的那次旅程<br />
5,多对一单向<br />
典型场合:人民和国家,我们只需要知道我们人民是属于哪个国家的,而国家不可能确实地知道它有多少个人民.<br />
6,多对多单向<br />
典型场合:预定和舱位,你可以多次预定一个舱位,也可一定预定多个舱位.一般都是根据某次预定来知道预定了哪些舱位<br />
7,多对多双向<br />
典型场合:老师和学生,老师可以有很多学生,学生也可以有很多老师,可以根据学生查出他所有的老师,也可以根据老师查出他所有的学生.<br />
<br />
其实在数据库里面,表现的形式单向和双向都是一样的,只是我们在程序里面为了逻辑清楚而人分的分类了.下次我们将了解一下这七种关系的不同代码,以及他们在数据库里面的表现形式 </div>
<img src ="http://www.blogjava.net/WshmAndLily/aggbug/146263.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/WshmAndLily/" target="_blank">semovy</a> 2007-09-18 21:31 <a href="http://www.blogjava.net/WshmAndLily/articles/146263.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>EJB初学日记(5) </title><link>http://www.blogjava.net/WshmAndLily/articles/146261.html</link><dc:creator>semovy</dc:creator><author>semovy</author><pubDate>Tue, 18 Sep 2007 13:30:00 GMT</pubDate><guid>http://www.blogjava.net/WshmAndLily/articles/146261.html</guid><wfw:comment>http://www.blogjava.net/WshmAndLily/comments/146261.html</wfw:comment><comments>http://www.blogjava.net/WshmAndLily/articles/146261.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/WshmAndLily/comments/commentRss/146261.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/WshmAndLily/services/trackbacks/146261.html</trackback:ping><description><![CDATA[<div class="postText">
<p>以前看到一本书上写的,有关定义实体BEAN的一些细节,直到今天才知道其中的差别<br />
<br />
代码1:<br />
</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #008000">/*</span><span style="color: #008000">&nbsp;&nbsp;&nbsp;<br />
&nbsp;*&nbsp;Test.java&nbsp;&nbsp;&nbsp;<br />
&nbsp;*&nbsp;&nbsp;&nbsp;<br />
&nbsp;*&nbsp;Created&nbsp;on&nbsp;2006年12月15日,&nbsp;上午12:06&nbsp;&nbsp;&nbsp;<br />
&nbsp;*&nbsp;&nbsp;&nbsp;<br />
&nbsp;*&nbsp;To&nbsp;change&nbsp;this&nbsp;template,&nbsp;choose&nbsp;Tools&nbsp;|&nbsp;Template&nbsp;Manager&nbsp;&nbsp;&nbsp;<br />
&nbsp;*&nbsp;and&nbsp;open&nbsp;the&nbsp;template&nbsp;in&nbsp;the&nbsp;editor.&nbsp;&nbsp;&nbsp;<br />
&nbsp;</span><span style="color: #008000">*/</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;com.hadeslee.entity;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.io.Serializable;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.persistence.Entity;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.persistence.GeneratedValue;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.persistence.GenerationType;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.persistence.Id;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008000">/**</span><span style="color: #008000">&nbsp;&nbsp;&nbsp;<br />
&nbsp;*&nbsp;Entity&nbsp;class&nbsp;Test&nbsp;&nbsp;&nbsp;<br />
&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;*&nbsp;</span><span style="color: #808080">@author</span><span style="color: #008000">&nbsp;lbf&nbsp;&nbsp;&nbsp;<br />
&nbsp;</span><span style="color: #008000">*/</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;<br />
@Entity&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Test&nbsp;</span><span style="color: #0000ff">implements</span><span style="color: #000000">&nbsp;Serializable&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;Long&nbsp;id;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;String&nbsp;name,sex,age;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;idCard;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">/**</span><span style="color: #008000">&nbsp;Creates&nbsp;a&nbsp;new&nbsp;instance&nbsp;of&nbsp;Test&nbsp;</span><span style="color: #008000">*/</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;Test()&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">/**</span><span style="color: #008000">&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Gets&nbsp;the&nbsp;id&nbsp;of&nbsp;this&nbsp;Test.&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080">@return</span><span style="color: #008000">&nbsp;the&nbsp;id&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">*/</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;@Id&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;@GeneratedValue(strategy&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;GenerationType.AUTO)&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;Long&nbsp;getId()&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.id;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">/**</span><span style="color: #008000">&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Sets&nbsp;the&nbsp;id&nbsp;of&nbsp;this&nbsp;Test&nbsp;to&nbsp;the&nbsp;specified&nbsp;value.&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080">@param</span><span style="color: #008000">&nbsp;id&nbsp;the&nbsp;new&nbsp;id&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">*/</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;<br />
&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;setId(Long&nbsp;id)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.id&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;id;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;<br />
&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;setNameID(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;ids){&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.idCard</span><span style="color: #000000">=</span><span style="color: #000000">ids;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;getNameID(){&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;idCard;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">/**</span><span style="color: #008000">&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Returns&nbsp;a&nbsp;hash&nbsp;code&nbsp;value&nbsp;for&nbsp;the&nbsp;object.&nbsp;&nbsp;This&nbsp;implementation&nbsp;computes&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;a&nbsp;hash&nbsp;code&nbsp;value&nbsp;based&nbsp;on&nbsp;the&nbsp;id&nbsp;fields&nbsp;in&nbsp;this&nbsp;object.&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080">@return</span><span style="color: #008000">&nbsp;a&nbsp;hash&nbsp;code&nbsp;value&nbsp;for&nbsp;this&nbsp;object.&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">*/</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;@Override&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;hashCode()&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;hash&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hash&nbsp;</span><span style="color: #000000">+=</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">this</span><span style="color: #000000">.id&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">?</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.id.hashCode()&nbsp;:&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">);&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;hash;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">/**</span><span style="color: #008000">&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Determines&nbsp;whether&nbsp;another&nbsp;object&nbsp;is&nbsp;equal&nbsp;to&nbsp;this&nbsp;Test.&nbsp;&nbsp;The&nbsp;result&nbsp;is&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;true&nbsp;if&nbsp;and&nbsp;only&nbsp;if&nbsp;the&nbsp;argument&nbsp;is&nbsp;not&nbsp;null&nbsp;and&nbsp;is&nbsp;a&nbsp;Test&nbsp;object&nbsp;that&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;has&nbsp;the&nbsp;same&nbsp;id&nbsp;field&nbsp;values&nbsp;as&nbsp;this&nbsp;object.&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080">@param</span><span style="color: #008000">&nbsp;object&nbsp;the&nbsp;reference&nbsp;object&nbsp;with&nbsp;which&nbsp;to&nbsp;compare&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080">@return</span><span style="color: #008000">&nbsp;true&nbsp;if&nbsp;this&nbsp;object&nbsp;is&nbsp;the&nbsp;same&nbsp;as&nbsp;the&nbsp;argument;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;false&nbsp;otherwise.&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">*/</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;@Override&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">boolean</span><span style="color: #000000">&nbsp;equals(Object&nbsp;object)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;TODO:&nbsp;Warning&nbsp;-&nbsp;this&nbsp;method&nbsp;won't&nbsp;work&nbsp;in&nbsp;the&nbsp;case&nbsp;the&nbsp;id&nbsp;fields&nbsp;are&nbsp;not&nbsp;set&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(</span><span style="color: #000000">!</span><span style="color: #000000">(object&nbsp;</span><span style="color: #0000ff">instanceof</span><span style="color: #000000">&nbsp;Test))&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">false</span><span style="color: #000000">;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Test&nbsp;other&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(Test)object;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">this</span><span style="color: #000000">.id&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;other.id&nbsp;</span><span style="color: #000000">&amp;&amp;</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">this</span><span style="color: #000000">.id&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">||</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">!</span><span style="color: #0000ff">this</span><span style="color: #000000">.id.equals(other.id)))&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">false</span><span style="color: #000000">;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">true</span><span style="color: #000000">;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">/**</span><span style="color: #008000">&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Returns&nbsp;a&nbsp;string&nbsp;representation&nbsp;of&nbsp;the&nbsp;object.&nbsp;&nbsp;This&nbsp;implementation&nbsp;constructs&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;that&nbsp;representation&nbsp;based&nbsp;on&nbsp;the&nbsp;id&nbsp;fields.&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080">@return</span><span style="color: #008000">&nbsp;a&nbsp;string&nbsp;representation&nbsp;of&nbsp;the&nbsp;object.&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">*/</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;@Override&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;String&nbsp;toString()&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">com.hadeslee.entity.Test[id=</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;id&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">;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;String&nbsp;getName()&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;name;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;<br />
&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;setName(String&nbsp;name)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.name&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;name;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;String&nbsp;getSex()&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;sex;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;<br />
&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;setSex(String&nbsp;sex)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.sex&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;sex;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;String&nbsp;getAge()&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;age;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;<br />
&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;setAge(String&nbsp;age)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.age&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;age;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
}&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span></div>
<br />
代码2:<br />
<p>&nbsp;</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #008000">/*</span><span style="color: #008000">&nbsp;&nbsp;&nbsp;<br />
&nbsp;*&nbsp;Test.java&nbsp;&nbsp;&nbsp;<br />
&nbsp;*&nbsp;&nbsp;&nbsp;<br />
&nbsp;*&nbsp;Created&nbsp;on&nbsp;2006年12月15日,&nbsp;上午12:06&nbsp;&nbsp;&nbsp;<br />
&nbsp;*&nbsp;&nbsp;&nbsp;<br />
&nbsp;*&nbsp;To&nbsp;change&nbsp;this&nbsp;template,&nbsp;choose&nbsp;Tools&nbsp;|&nbsp;Template&nbsp;Manager&nbsp;&nbsp;&nbsp;<br />
&nbsp;*&nbsp;and&nbsp;open&nbsp;the&nbsp;template&nbsp;in&nbsp;the&nbsp;editor.&nbsp;&nbsp;&nbsp;<br />
&nbsp;</span><span style="color: #008000">*/</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;com.hadeslee.entity;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.io.Serializable;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.persistence.Entity;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.persistence.GeneratedValue;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.persistence.GenerationType;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.persistence.Id;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008000">/**</span><span style="color: #008000">&nbsp;&nbsp;&nbsp;<br />
&nbsp;*&nbsp;Entity&nbsp;class&nbsp;Test&nbsp;&nbsp;&nbsp;<br />
&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;*&nbsp;</span><span style="color: #808080">@author</span><span style="color: #008000">&nbsp;lbf&nbsp;&nbsp;&nbsp;<br />
&nbsp;</span><span style="color: #008000">*/</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;<br />
@Entity&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Test&nbsp;</span><span style="color: #0000ff">implements</span><span style="color: #000000">&nbsp;Serializable&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;@Id&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;@GeneratedValue(strategy&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;GenerationType.AUTO)&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;Long&nbsp;id;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;String&nbsp;name,sex,age;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;idCard;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">/**</span><span style="color: #008000">&nbsp;Creates&nbsp;a&nbsp;new&nbsp;instance&nbsp;of&nbsp;Test&nbsp;</span><span style="color: #008000">*/</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;Test()&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">/**</span><span style="color: #008000">&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Gets&nbsp;the&nbsp;id&nbsp;of&nbsp;this&nbsp;Test.&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080">@return</span><span style="color: #008000">&nbsp;the&nbsp;id&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">*/</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;Long&nbsp;getId()&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.id;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">/**</span><span style="color: #008000">&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Sets&nbsp;the&nbsp;id&nbsp;of&nbsp;this&nbsp;Test&nbsp;to&nbsp;the&nbsp;specified&nbsp;value.&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080">@param</span><span style="color: #008000">&nbsp;id&nbsp;the&nbsp;new&nbsp;id&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">*/</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;<br />
&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;setId(Long&nbsp;id)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.id&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;id;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;<br />
&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;setNameID(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;ids){&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.idCard</span><span style="color: #000000">=</span><span style="color: #000000">ids;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;getNameID(){&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;idCard;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">/**</span><span style="color: #008000">&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Returns&nbsp;a&nbsp;hash&nbsp;code&nbsp;value&nbsp;for&nbsp;the&nbsp;object.&nbsp;&nbsp;This&nbsp;implementation&nbsp;computes&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;a&nbsp;hash&nbsp;code&nbsp;value&nbsp;based&nbsp;on&nbsp;the&nbsp;id&nbsp;fields&nbsp;in&nbsp;this&nbsp;object.&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080">@return</span><span style="color: #008000">&nbsp;a&nbsp;hash&nbsp;code&nbsp;value&nbsp;for&nbsp;this&nbsp;object.&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">*/</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;@Override&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;hashCode()&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;hash&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hash&nbsp;</span><span style="color: #000000">+=</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">this</span><span style="color: #000000">.id&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">?</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.id.hashCode()&nbsp;:&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">);&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;hash;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">/**</span><span style="color: #008000">&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Determines&nbsp;whether&nbsp;another&nbsp;object&nbsp;is&nbsp;equal&nbsp;to&nbsp;this&nbsp;Test.&nbsp;&nbsp;The&nbsp;result&nbsp;is&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;true&nbsp;if&nbsp;and&nbsp;only&nbsp;if&nbsp;the&nbsp;argument&nbsp;is&nbsp;not&nbsp;null&nbsp;and&nbsp;is&nbsp;a&nbsp;Test&nbsp;object&nbsp;that&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;has&nbsp;the&nbsp;same&nbsp;id&nbsp;field&nbsp;values&nbsp;as&nbsp;this&nbsp;object.&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080">@param</span><span style="color: #008000">&nbsp;object&nbsp;the&nbsp;reference&nbsp;object&nbsp;with&nbsp;which&nbsp;to&nbsp;compare&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080">@return</span><span style="color: #008000">&nbsp;true&nbsp;if&nbsp;this&nbsp;object&nbsp;is&nbsp;the&nbsp;same&nbsp;as&nbsp;the&nbsp;argument;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;false&nbsp;otherwise.&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">*/</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;@Override&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">boolean</span><span style="color: #000000">&nbsp;equals(Object&nbsp;object)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;TODO:&nbsp;Warning&nbsp;-&nbsp;this&nbsp;method&nbsp;won't&nbsp;work&nbsp;in&nbsp;the&nbsp;case&nbsp;the&nbsp;id&nbsp;fields&nbsp;are&nbsp;not&nbsp;set&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(</span><span style="color: #000000">!</span><span style="color: #000000">(object&nbsp;</span><span style="color: #0000ff">instanceof</span><span style="color: #000000">&nbsp;Test))&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">false</span><span style="color: #000000">;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Test&nbsp;other&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(Test)object;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">this</span><span style="color: #000000">.id&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;other.id&nbsp;</span><span style="color: #000000">&amp;&amp;</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">this</span><span style="color: #000000">.id&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">||</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">!</span><span style="color: #0000ff">this</span><span style="color: #000000">.id.equals(other.id)))&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">false</span><span style="color: #000000">;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">true</span><span style="color: #000000">;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">/**</span><span style="color: #008000">&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Returns&nbsp;a&nbsp;string&nbsp;representation&nbsp;of&nbsp;the&nbsp;object.&nbsp;&nbsp;This&nbsp;implementation&nbsp;constructs&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;that&nbsp;representation&nbsp;based&nbsp;on&nbsp;the&nbsp;id&nbsp;fields.&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080">@return</span><span style="color: #008000">&nbsp;a&nbsp;string&nbsp;representation&nbsp;of&nbsp;the&nbsp;object.&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">*/</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;@Override&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;String&nbsp;toString()&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">com.hadeslee.entity.Test[id=</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;id&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">;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;String&nbsp;getName()&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;name;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;<br />
&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;setName(String&nbsp;name)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.name&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;name;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;String&nbsp;getSex()&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;sex;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;<br />
&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;setSex(String&nbsp;sex)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.sex&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;sex;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;String&nbsp;getAge()&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;age;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;<br />
&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;setAge(String&nbsp;age)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.age&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;age;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
}&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span></div>
<br />
<br />
<p>代码1和代码2唯一的差别就是@Id的注释地方不同了</p>
<p>同样是注释主键,当在直接用在变量上注释时,如果其它的成员变量没有指定名字,则数据库生成的表的各列名字将以定义的成员变量的变量名为准</p>
<p>当用在getter方法注释时,则数据库生成的表的各列名字将取getXXXX的XXXX名字,将不再取定义的成员变量名</p>
<p>像上面的例子中,代码1会有IdCard这一列,则代码2取而代之的将是NameID这一列.这看上去是一个小小的差别,但是了解了终究是好事.呵呵.终于懂清楚在get上注释和直接在成员变量上注释的差别了,一般来说是不会有什么差别的,一般标准 的JAVABEAN都是成员变量名和getter,setter签名一样的.</p>
</div>
<img src ="http://www.blogjava.net/WshmAndLily/aggbug/146261.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/WshmAndLily/" target="_blank">semovy</a> 2007-09-18 21:30 <a href="http://www.blogjava.net/WshmAndLily/articles/146261.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>EJB初学日记(3) </title><link>http://www.blogjava.net/WshmAndLily/articles/146259.html</link><dc:creator>semovy</dc:creator><author>semovy</author><pubDate>Tue, 18 Sep 2007 13:29:00 GMT</pubDate><guid>http://www.blogjava.net/WshmAndLily/articles/146259.html</guid><wfw:comment>http://www.blogjava.net/WshmAndLily/comments/146259.html</wfw:comment><comments>http://www.blogjava.net/WshmAndLily/articles/146259.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/WshmAndLily/comments/commentRss/146259.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/WshmAndLily/services/trackbacks/146259.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 今天主要是看了一下拦截器的实现,在EJB3.0里面,实现拦截非常简单.加一个注释就可以了,这样就可以随时监视某个方法的调用了,拦截器可以是拦截某一个方法也可以是拦截一个类的所有方法的.具体如下&nbsp;首先写一个拦截器方法,拦截器方法并不需要实现什么接口,只要符合一定的规范就可以了,规范是:&nbsp; Object xxxxx(InvocationContext context)thr...&nbsp;&nbsp;<a href='http://www.blogjava.net/WshmAndLily/articles/146259.html'>阅读全文</a><img src ="http://www.blogjava.net/WshmAndLily/aggbug/146259.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/WshmAndLily/" target="_blank">semovy</a> 2007-09-18 21:29 <a href="http://www.blogjava.net/WshmAndLily/articles/146259.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>EJB初学日记(4)</title><link>http://www.blogjava.net/WshmAndLily/articles/146260.html</link><dc:creator>semovy</dc:creator><author>semovy</author><pubDate>Tue, 18 Sep 2007 13:29:00 GMT</pubDate><guid>http://www.blogjava.net/WshmAndLily/articles/146260.html</guid><wfw:comment>http://www.blogjava.net/WshmAndLily/comments/146260.html</wfw:comment><comments>http://www.blogjava.net/WshmAndLily/articles/146260.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/WshmAndLily/comments/commentRss/146260.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/WshmAndLily/services/trackbacks/146260.html</trackback:ping><description><![CDATA[<div class="postText">关于session bean的一些问题<br />
EJB里面,session bean是占了挺重要的地位的,一些重要的事情都是交给session bean来处理的<br />
<p>session BEAN一般用于操作一些对外的方法,供客户调用.会话BEAN分两种,一种 是有状态的会话BEAN,一种 是无状态的会话BEAN,它们有什么不同呢?</p>
<p>有状态的会话BEAN,会记录每一个调用者的状态,每个人都有一个自己的实例,相比之下,它比较耗内存.一般用于做专用的事情<br />
无状态的会话BEAN,则不会记录每一个调用者的状态,所有人共有一个实例,所以它不耗内存,一般用于做一些通用的事情</p>
<p>会话BEAN中有一种叫定时服务,并不是所有的会话BEAN都可以有定时服务器,而只有无状态的会话BEAN可以有定时的服务,如果调用的是有状态的会话BEAN的话,那么运行时就会出异常,不知道是不是有状态的会话BEAN不允许有定时服务.对于会话BEAN,我们可以掌握它的生命周期</p>
<p><font face="Arial">EJB容器创建和管理session bean实例,有些时候，你可能需要定制 session bean的管理过程。例如，你可能想在创<br />
建session bean实例的时候初始化字段变量,或在bean实例被销毁的时候关掉外部资源。上述这些，你都可能通过<br />
在 bean 类中定义生命周期的回调方法来实现。这些方法将会被容器在生命周期的不同阶段调用（如：创建或销<br />
毁时）。通过使有下面所列的注释，EJB 3.0允许你将任何方法指定为回调方法。这不同于 EJB 2.1，EJB 2.1中，<br />
所有的回调方法必须实现，即使是空的。EJB 3.0中，bean可以有任意数量，任意名字的回调方法。 <br />
&#183;@PostConstruct：当bean对象完成实例化后，使用了这个注释的方法会被立即调用。这个注释同时适用于<br />
有状态和无状态的会话bean。 <br />
&#183;@PreDestroy：使用这个注释的方法会在容器从它的对象池中销毁一个无用的或者过期的 bean 实例之前调<br />
用。这个注释同时适用于有状态和无状态的会话 bean。 <br />
&#183;@PrePassivate：当一个有状态的session bean实例空闲过长的时间，容器将会钝化(passivate)它，并把它的<br />
状态保存在缓存当中。使用这个注释的方法会在容器钝化bean实例之前调用。这个注释适用于有状态的会话bean。<br />
当钝化后，又经过一段时间该 bean 仍然没有被操作，容器将会把它从存储介质中删除。以后，任何针对该 bean<br />
方法的调用容器都会抛出例外。 <br />
<font face="Arial">&#183;@PostActivate：当客户端再次使用已经被钝化的有状态 session bean 时，新的实例被创建，状态被恢复。<br />
使用此注释的session bean会在bean的激活完成时调用。这个注释只适用于有状态的会话 bean。 <br />
&#183;@Init：这个注释指定了有状态session bean初始化的方法。它区别于@PostConstruct注释在于：多个@Init<br />
注释方法可以同时存在于有状态session bean 中，但每个 bean实例只会有一个@Init注释的方法会被调用。这取<br />
决于bean是如何创建的（细节请看EJB 3.0规范）。@PostConstruct在@Init之后被调用。 <br />
&nbsp;<br />
另一个有用的生命周期方法注释是@Remove，特别是对于有状态 session bean。当应用通过存根对象调用使用了<br />
@Remove注释的方法时，容器就知道在该方法执行完毕后，要把 bean实例从对象池中移走。 </font></font></p>
<p>这里要注意的一点是,对于无状态的会话BEAN,即使你调用了标记为@Remove的方法,这个会话BEAN依然有效,所以,这个注释应该用在有状态的会话BEAN中,这样当你调用了它所标记的方法 后,再调用这个会话BEAN的其它方法就会抛出一个异常<br />
<font face="Arial">javax.ejb.EJBNoSuchObjectException: Could not find Stateful bean:它会说找不到这个有状态的会话BEAN了,因为这个时候经过你调用了标记为@Remove的方法后,EJB容器已经将它销毁了,以后的任何调用都是无效的了,这样有利于我们更好的掌握会话BEAN的生命周期,免得产生很有有状态的会话BEAN的时候,过多的消耗服务器的内存.</font></p>
</div>
<img src ="http://www.blogjava.net/WshmAndLily/aggbug/146260.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/WshmAndLily/" target="_blank">semovy</a> 2007-09-18 21:29 <a href="http://www.blogjava.net/WshmAndLily/articles/146260.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>EJB初学日记(2) </title><link>http://www.blogjava.net/WshmAndLily/articles/146258.html</link><dc:creator>semovy</dc:creator><author>semovy</author><pubDate>Tue, 18 Sep 2007 13:28:00 GMT</pubDate><guid>http://www.blogjava.net/WshmAndLily/articles/146258.html</guid><wfw:comment>http://www.blogjava.net/WshmAndLily/comments/146258.html</wfw:comment><comments>http://www.blogjava.net/WshmAndLily/articles/146258.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/WshmAndLily/comments/commentRss/146258.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/WshmAndLily/services/trackbacks/146258.html</trackback:ping><description><![CDATA[<div class="postText">其实在学习EJB之前,就听说过EJB,有人说他很复杂,也有人说一般般而已,但是几乎所有的人都说EJB3.0确实是简单了许多.<br />
一般讲起JAVA EE,一般人都认为是应用在网页里面的,甚至有人把JAVA EE和JSP等同起来,要知道,JAVA EE是一个很庞大的结构,而JSP只是里面一部份中的一部份而已.<br />
<br />
今天我就把JAVA EE的EJB应用到JAVA SE中看一看,在JBOSS里面布署好EJB,然后在swing里面调用EJB,并且观察一些特性.<br />
<br />
首先我们先定义一个EJB的接口,接口里面放上我们需要远程调用的方法<br />
在定义接口的时候,可以给它加上@Remote或者@Local注释,表示是远程还是本地,也可以什么都不加,就是一个很普通的接口,然后在实现的时候加上相应的注释,我们就采取第二种,也就是接口的定义里面什么注释都没有<br />
<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #000000"><br />
</span><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;test1;<br />
</span><span style="color: #008000">/**</span><span style="color: #008000"><br />
&nbsp;*&nbsp;This&nbsp;is&nbsp;the&nbsp;business&nbsp;interface&nbsp;for&nbsp;Hello&nbsp;enterprise&nbsp;bean.<br />
&nbsp;</span><span style="color: #008000">*/</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">interface</span><span style="color: #000000">&nbsp;HelloLocal&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;String&nbsp;helloFromLocal(String&nbsp;s);<br />
}<br />
</span></div>
<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #000000"><br />
</span><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;test1;<br />
<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.ejb.Remote;<br />
<br />
<br />
</span><span style="color: #008000">/**</span><span style="color: #008000"><br />
&nbsp;*&nbsp;This&nbsp;is&nbsp;the&nbsp;business&nbsp;interface&nbsp;for&nbsp;Hello&nbsp;enterprise&nbsp;bean.<br />
&nbsp;</span><span style="color: #008000">*/</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">interface</span><span style="color: #000000">&nbsp;HelloRemote&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;String&nbsp;helloFromRemote(String&nbsp;s);<br />
}<br />
</span></div>
<br />
以上是两个接口, 一开始是拟做本地调用和远程调用的两个接口,后来我想,能不能让一个接口既是本地接口也是远程接口呢,在JBOSS是可以的.实现如下<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #008000">/*</span><span style="color: #008000"><br />
&nbsp;*&nbsp;HelloBean.java<br />
&nbsp;*<br />
&nbsp;*&nbsp;Created&nbsp;on&nbsp;2007年9月6日,&nbsp;下午6:02<br />
&nbsp;*<br />
&nbsp;*&nbsp;To&nbsp;change&nbsp;this&nbsp;template,&nbsp;choose&nbsp;Tools&nbsp;|&nbsp;Template&nbsp;Manager<br />
&nbsp;*&nbsp;and&nbsp;open&nbsp;the&nbsp;template&nbsp;in&nbsp;the&nbsp;editor.<br />
&nbsp;</span><span style="color: #008000">*/</span><span style="color: #000000"><br />
<br />
</span><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;test1;<br />
<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.ejb.Local;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.ejb.Remote;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.ejb.Stateless;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.swing.JOptionPane;<br />
<br />
</span><span style="color: #008000">/**</span><span style="color: #008000"><br />
&nbsp;*<br />
&nbsp;*&nbsp;</span><span style="color: #808080">@author</span><span style="color: #008000">&nbsp;hadeslee<br />
&nbsp;</span><span style="color: #008000">*/</span><span style="color: #000000"><br />
@Stateless<br />
@Remote({HelloLocal.</span><span style="color: #0000ff">class</span><span style="color: #000000">,HelloRemote.</span><span style="color: #0000ff">class</span><span style="color: #000000">})<br />
@Local({HelloLocal.</span><span style="color: #0000ff">class</span><span style="color: #000000">,HelloRemote.</span><span style="color: #0000ff">class</span><span style="color: #000000">})<br />
</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;HelloBean&nbsp;</span><span style="color: #0000ff">implements</span><span style="color: #000000">&nbsp;test1.HelloRemote,&nbsp;test1.HelloLocal&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i</span><span style="color: #000000">=</span><span style="color: #000000">0</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">/**</span><span style="color: #008000">&nbsp;Creates&nbsp;a&nbsp;new&nbsp;instance&nbsp;of&nbsp;HelloBean&nbsp;</span><span style="color: #008000">*/</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;HelloBean()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;String&nbsp;helloFromRemote(String&nbsp;s)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i</span><span style="color: #000000">++</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">第</span><span style="color: #000000">"</span><span style="color: #000000">+</span><span style="color: #000000">i</span><span style="color: #000000">+</span><span style="color: #000000">"</span><span style="color: #000000">次调用</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">来自远程的问侯:</span><span style="color: #000000">"</span><span style="color: #000000">+</span><span style="color: #000000">s);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</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">+</span><span style="color: #000000">s</span><span style="color: #000000">+</span><span style="color: #000000">"</span><span style="color: #000000">:</span><span style="color: #000000">"</span><span style="color: #000000">+</span><span style="color: #000000">i;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;String&nbsp;helloFromLocal(String&nbsp;s)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i</span><span style="color: #000000">++</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">第</span><span style="color: #000000">"</span><span style="color: #000000">+</span><span style="color: #000000">i</span><span style="color: #000000">+</span><span style="color: #000000">"</span><span style="color: #000000">次调用</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;JOptionPane.showMessageDialog(</span><span style="color: #0000ff">null</span><span style="color: #000000">,</span><span style="color: #000000">"</span><span style="color: #000000">来自本地的问侯:</span><span style="color: #000000">"</span><span style="color: #000000">+</span><span style="color: #000000">s);&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">来自本地的问侯:</span><span style="color: #000000">"</span><span style="color: #000000">+</span><span style="color: #000000">s);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</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">+</span><span style="color: #000000">s</span><span style="color: #000000">+</span><span style="color: #000000">"</span><span style="color: #000000">:</span><span style="color: #000000">"</span><span style="color: #000000">+</span><span style="color: #000000">i;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
}<br />
</span></div>
<br />
在实现的类里面@Remote@Local表示它们要实现的接口,我把两个都放进去了,在NetBeans里面,会有错误的提示,提示内容如下:<br />
<span style="color: red">Bean使用以下类做为本地和远程业务接口:test1.HelloLocal<br />
<span style="color: #000000">但是我编译以后一样是可以布署的,不知道别的EJB容器是否可以这样做.jboss确实是可以的<br />
<br />
好了,现在我们都定义好了,马上把它们布署到JBOSS里面去吧.<br />
<br />
布署完了之后,就开始开发我们的应用程序了,因为这个调用只涉及到一个方法,我们就不用去定义一个界面了.<br />
我们简单的程序如下.<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #008000">/*</span><span style="color: #008000"><br />
&nbsp;*&nbsp;TestHello.java<br />
&nbsp;*<br />
&nbsp;*&nbsp;Created&nbsp;on&nbsp;2007年9月6日,&nbsp;下午6:06<br />
&nbsp;*<br />
&nbsp;*&nbsp;To&nbsp;change&nbsp;this&nbsp;template,&nbsp;choose&nbsp;Tools&nbsp;|&nbsp;Template&nbsp;Manager<br />
&nbsp;*&nbsp;and&nbsp;open&nbsp;the&nbsp;template&nbsp;in&nbsp;the&nbsp;editor.<br />
&nbsp;</span><span style="color: #008000">*/</span><span style="color: #000000"><br />
<br />
</span><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;testejb;<br />
<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.util.Properties;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.naming.InitialContext;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;test1.HelloLocal;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;test1.HelloRemote;<br />
<br />
</span><span style="color: #008000">/**</span><span style="color: #008000"><br />
&nbsp;*<br />
&nbsp;*&nbsp;</span><span style="color: #808080">@author</span><span style="color: #008000">&nbsp;hadeslee<br />
&nbsp;</span><span style="color: #008000">*/</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;TestHello&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">/**</span><span style="color: #008000">&nbsp;Creates&nbsp;a&nbsp;new&nbsp;instance&nbsp;of&nbsp;TestHello&nbsp;</span><span style="color: #008000">*/</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;TestHello()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;main(String[]&nbsp;args)&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;Exception{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Properties&nbsp;props&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 />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">这些是JBOSS的初始化一些参数</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;props.setProperty(</span><span style="color: #000000">"</span><span style="color: #000000">java.naming.factory.initial</span><span style="color: #000000">"</span><span style="color: #000000">,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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 />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;props.setProperty(</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 />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;props.setProperty(</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</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InitialContext&nbsp;ctx;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ctx&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(props);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">找到远程接口,这时其实也可以转成HelloLocal</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HelloRemote&nbsp;hello&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(HelloRemote)&nbsp;ctx.lookup(</span><span style="color: #000000">"</span><span style="color: #000000">HelloBean/remote</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(hello.helloFromRemote(</span><span style="color: #000000">"</span><span style="color: #000000">千里冰封</span><span style="color: #000000">"</span><span style="color: #000000">));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">可以直接转型过来</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HelloLocal&nbsp;local</span><span style="color: #000000">=</span><span style="color: #000000">(HelloLocal)hello;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(local.helloFromLocal(</span><span style="color: #000000">"</span><span style="color: #000000">hadeslee</span><span style="color: #000000">"</span><span style="color: #000000">));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
</span></div>
<br />
这个时候,我们就可以看到,会有一个 JOptionPane弹出来,点了确定之后,客户端这边才会有输出,JOpitonPane出来之后不一定在最前端显示,所以可能需要找一下,就是因为这个问题搞得我糊涂了一下,我找了半天找不到,后来一个一个窗口的最小化,终于发现了JOptionPane在那里.<br />
<br />
为了能运行客户端,你需要把如下的JAR包放到运行客户端的classpath里面,如果是用NetBeans开发的话,加入一个库可以了,库里面包含的JAR文件如下:<br />
[jboss安装目录]\client\commons-logging.jar <br />
[jboss安装目录]\client\ concurrent.jar <br />
[jboss安装目录]\client\ ejb3-persistence.jar <br />
[jboss安装目录]\client\ hibernate-annotations.jar <br />
[jboss安装目录]\client\ hibernate-client.jar <br />
[jboss安装目录]\client\ javassist.jar <br />
[jboss安装目录]\client\ jboss-annotations-ejb3.jar <br />
[jboss安装目录]\client\ jboss-aop-jdk50-client.jar <br />
[jboss安装目录]\client\ jboss-aspect-jdk50-client.jar <br />
[jboss安装目录]\client\jboss-common-client.jar <br />
[jboss安装目录]\client\ jboss-ejb3-client.jar <br />
[jboss安装目录]\client\ jboss-ejb3x.jar <br />
[jboss安装目录]\client\jboss-j2ee.jar <br />
[jboss安装目录]\client\jboss-remoting.jar <br />
[jboss安装目录]\client\jbosssx-client.jar <br />
[jboss安装目录]\client\jboss-transaction-clie<br />
[jboss安装目录]\client\jnp-client.jar <br />
[jboss安装目录]\client\trove.jar <br />
[jboss安装目录]\client\jbossws-client.jar <br />
[jboss安装目录]\client\jboss-jaxws.jar <br />
[jboss安装目录]\client\xmlsec.jar <br />
<br />
这样的话,就可以把EJB布署在EJB容器里面,而我们可以在任何地方调用它了.只要你在想调用的地方,带上上面的JAR包就可以了.<br />
</span></span></div>
<img src ="http://www.blogjava.net/WshmAndLily/aggbug/146258.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/WshmAndLily/" target="_blank">semovy</a> 2007-09-18 21:28 <a href="http://www.blogjava.net/WshmAndLily/articles/146258.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>EJB初学日记(1) </title><link>http://www.blogjava.net/WshmAndLily/articles/146257.html</link><dc:creator>semovy</dc:creator><author>semovy</author><pubDate>Tue, 18 Sep 2007 13:27:00 GMT</pubDate><guid>http://www.blogjava.net/WshmAndLily/articles/146257.html</guid><wfw:comment>http://www.blogjava.net/WshmAndLily/comments/146257.html</wfw:comment><comments>http://www.blogjava.net/WshmAndLily/articles/146257.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/WshmAndLily/comments/commentRss/146257.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/WshmAndLily/services/trackbacks/146257.html</trackback:ping><description><![CDATA[<p>今天终于还是下定决心看看EJB,看着SPRING看了两天,觉得一点头绪都没有,我不是一个讲究速成的人,但是总是感觉和它们的理念不太一样,唉,真可怜,都怪自己,初学JAVA的时候就把J2SE看得太重了.</p>
<p>在学习了J2SE一整年之后,发现JAVA的应用还远远没有掌握,我学习一年的结果就是刚刚对JAVA有所了解而已,回首这一年的路,挺艰难的,但是现在以一个过来人的姿态去看的时候,我又学得很庆幸.因为我没有放弃,在我学习条件最艰苦的时候,在我最无助的时候我都没有放弃.曾经记得为了想一个小小的程序,为了实现一个小小的功能,在那里苦思冥想,想得都想吐了,还记得半夜从梦中醒来的时候,脑子里满是程序代码,甚至做梦的时候也在编程序,想算法.就这样,一年,我磕磕碰碰的走过来了.</p>
<p>一年后的今天,我将重新站在一个全新的起点上:J2EE,面全企业的应用,希望以后心态能像一年前一样.踏踏实实地走过.一步一个脚印.记得一年前,我刚学JAVA时,喜欢写学习日记,喜欢把自己不懂的,以及当天收获的,还有对一些程序的理解和看法记下来,并且过一段时间就去看以前写的学习日记,那时候经常会发现自己有所进步.那种感觉,真的很好.</p>
<p>今天算我第一天,我下面把我今天所看到的,写下来,以及自己不太了解的地方写下来,做为一个初学者最真实的心理反应和想法,也为自己J2EE之路留下些纪念.</p>
<p>今天下载了黎活明的EJB3.0实例教程,学了如何装JBoss4.0,第一次我下载的是免安装版,直接解压缩就可以用了,但是一直都配置不好那个EJB的应用,后来,删掉重新按照书上的地址下载了一个安装版的,并按照介始的顺序和方法安装了一遍,一布署,呵,真的可以了.看到网页打开的一霎那,真的感觉很有成就感,虽然应用都是别人写的.</p>
<p>由于此书用的IDE是Eclipse,可是我用的IDE是NetBeans,所以有些地方就实践不了了,但是能实践的,我都尽量会去实践一下,哪怕是抄代码,我也会亲手抄一遍.我觉得这对我们初学者来说有很大的帮助.</p>
<p>今天学的是会话BEAN,有状态会话BEAN和无状态会话BEAN<br />
声明接口的代码<br />
</p>
<p class="alt"><span>&nbsp;</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #008000">/*</span><span style="color: #008000">&nbsp;&nbsp;&nbsp;<br />
&nbsp;*&nbsp;HelloWorld.java&nbsp;&nbsp;&nbsp;<br />
&nbsp;*&nbsp;&nbsp;&nbsp;<br />
&nbsp;*&nbsp;Created&nbsp;on&nbsp;2006年12月7日,&nbsp;下午9:26&nbsp;&nbsp;&nbsp;<br />
&nbsp;*&nbsp;&nbsp;&nbsp;<br />
&nbsp;*&nbsp;To&nbsp;change&nbsp;this&nbsp;template,&nbsp;choose&nbsp;Tools&nbsp;|&nbsp;Template&nbsp;Manager&nbsp;&nbsp;&nbsp;<br />
&nbsp;*&nbsp;and&nbsp;open&nbsp;the&nbsp;template&nbsp;in&nbsp;the&nbsp;editor.&nbsp;&nbsp;&nbsp;<br />
&nbsp;</span><span style="color: #008000">*/</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;lbf.demo;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008000">/**</span><span style="color: #008000">&nbsp;&nbsp;&nbsp;<br />
&nbsp;*&nbsp;&nbsp;&nbsp;<br />
&nbsp;*&nbsp;</span><span style="color: #808080">@author</span><span style="color: #008000">&nbsp;lbf&nbsp;&nbsp;&nbsp;<br />
&nbsp;</span><span style="color: #008000">*/</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">interface</span><span style="color: #000000">&nbsp;HelloWorld&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">/**</span><span style="color: #008000">&nbsp;Creates&nbsp;a&nbsp;new&nbsp;instance&nbsp;of&nbsp;HelloWorld&nbsp;</span><span style="color: #008000">*/</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;String&nbsp;sayHello(String&nbsp;who);&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
}&nbsp;&nbsp;&nbsp;</span></div>
<br />
实现接口的代码<br />
<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #008000">/*</span><span style="color: #008000">&nbsp;&nbsp;&nbsp;<br />
&nbsp;*&nbsp;HelloWorldBean.java&nbsp;&nbsp;&nbsp;<br />
&nbsp;*&nbsp;&nbsp;&nbsp;<br />
&nbsp;*&nbsp;Created&nbsp;on&nbsp;2006年12月7日,&nbsp;下午9:27&nbsp;&nbsp;&nbsp;<br />
&nbsp;*&nbsp;&nbsp;&nbsp;<br />
&nbsp;*&nbsp;To&nbsp;change&nbsp;this&nbsp;template,&nbsp;choose&nbsp;Tools&nbsp;|&nbsp;Template&nbsp;Manager&nbsp;&nbsp;&nbsp;<br />
&nbsp;*&nbsp;and&nbsp;open&nbsp;the&nbsp;template&nbsp;in&nbsp;the&nbsp;editor.&nbsp;&nbsp;&nbsp;<br />
&nbsp;</span><span style="color: #008000">*/</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;lbf.demo.impl;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008000">/**</span><span style="color: #008000">&nbsp;&nbsp;&nbsp;<br />
&nbsp;*&nbsp;&nbsp;&nbsp;<br />
&nbsp;*&nbsp;</span><span style="color: #808080">@author</span><span style="color: #008000">&nbsp;lbf&nbsp;&nbsp;&nbsp;<br />
&nbsp;</span><span style="color: #008000">*/</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;lbf.demo.</span><span style="color: #000000">*</span><span style="color: #000000">;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.ejb.</span><span style="color: #000000">*</span><span style="color: #000000">;&nbsp;&nbsp;&nbsp;&nbsp;<br />
@Stateless&nbsp;&nbsp;&nbsp;<br />
@Remote({HelloWorld.</span><span style="color: #0000ff">class</span><span style="color: #000000">})&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">表示是远程调用&nbsp;</span><span style="color: #008000"><br />
</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;HelloWorldBean&nbsp;</span><span style="color: #0000ff">implements</span><span style="color: #000000">&nbsp;HelloWorld&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">/**</span><span style="color: #008000">&nbsp;Creates&nbsp;a&nbsp;new&nbsp;instance&nbsp;of&nbsp;HelloWorldBean&nbsp;</span><span style="color: #008000">*/</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;HelloWorldBean()&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;String&nbsp;sayHello(String&nbsp;who){&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;who</span><span style="color: #000000">+</span><span style="color: #000000">"</span><span style="color: #000000">说：这是我的第一个EJB东东！！</span><span style="color: #000000">"</span><span style="color: #000000">;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;<br />
}&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span></div>
<br />
<p>打包成JAR文件以后,放到JBOSS_HOME/server/all/deploy下面就可以了,JBOSS支持热布置,这一点和TOMCAT一样</p>
<p>只是两者的目录结构有一点不一样而已,并且它也支持WAR布署.同样也是复制到JBOSS_HOME/server/all/deploy下面</p>
<p><font face="Arial">用ctx.lookup("HelloWorldBean/remote"); 来查找绑定的BEAN,一般命名规则是</font></p>
<p><font face="Arial">在这里我要重点说明一下EJB JNDI名称默认的命名规则，命名规则如下： <br />
1&gt; 如果EJB应用打包成后缀为*.ear 的发布文件，默认的 JNDI 名称是 <br />
访问本地接口：EAR-FILE-BASE-NAME/EJB-CLASS-NAME/local <br />
访问远程接口：EAR-FILE-BASE-NAME/EJB-CLASS-NAME/remote <br />
例：如果HelloWorld应用打包成HelloWorld.ear 文件，访问她远程接口的 JNDI 名是： <br />
HelloWorld/HelloWorldBean/remote&nbsp; <br />
&nbsp;<br />
2&gt; 如果EJB应用打包成后缀为*.jar 的发布文件,&nbsp; 默认的 JNDI 名称是 <br />
访问本地接口：EJB-CLASS-NAME/local&nbsp; <br />
访问远程接口：EJB-CLASS-NAME/remote <br />
例： HelloWorld应用打包成HelloWorld.jar 文件，访问她远程接口的 JNDI名称是：HelloWorldBean/remote <br />
另外有一点要注意：EJB-CLASS-NAME 是不带包名的，如 com.foshanshop.ejb3.impl.HelloWorldBean只需取<br />
HelloWorldBean。 <br />
目前网上很多教材获取JNDI名的方式都过时了，如： <br />
HelloWorld helloworld = (HelloWorld) ctx.lookup(HelloWorld.class.getName()); </font></p>
<p>stateless每次查找都会返回同一个BEAN,而stateful每次查找都会产生一个新的BEAN,用来保存特定的客户会话</p>
<p>那按照上面的命名规则,岂不是很容易生成相同的名字的BEAN?因为它的名字那么短,如何避免这种情况呢.EJB应该有解决的办法吧.看以后吧<br />
<br />
希望以后的日记中能搞清楚这个问题</p>
</span>
<img src ="http://www.blogjava.net/WshmAndLily/aggbug/146257.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/WshmAndLily/" target="_blank">semovy</a> 2007-09-18 21:27 <a href="http://www.blogjava.net/WshmAndLily/articles/146257.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>EJB 3.0 的新规范概览及其未来发展</title><link>http://www.blogjava.net/WshmAndLily/articles/143448.html</link><dc:creator>semovy</dc:creator><author>semovy</author><pubDate>Fri, 07 Sep 2007 08:00:00 GMT</pubDate><guid>http://www.blogjava.net/WshmAndLily/articles/143448.html</guid><wfw:comment>http://www.blogjava.net/WshmAndLily/comments/143448.html</wfw:comment><comments>http://www.blogjava.net/WshmAndLily/articles/143448.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/WshmAndLily/comments/commentRss/143448.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/WshmAndLily/services/trackbacks/143448.html</trackback:ping><description><![CDATA[开始<br />
<br />
　　无论如何由于EJB的复杂性使之在J2EE架构中的表现一直不是很好。EJB大概是J2EE架构中唯一一个没有兑现其能够简单开发并提高生产力的组建。 EJB3.0规范正尝试在这方面作出努力以减轻其开发的复杂性。EJB3.0减轻了开发人员进行底层开发的工作量，它取消或最小化了很多（以前这些是必须实现）回调方法的实现，并且降低了实体Bean及O/R映射模型的复杂性。<br />
<br />
　　在本文中，我首先会介绍EJB3.0中几个主要的改变。它对进一步深入了解EJB3.0是非常重要的。随后，我会从更高的层面来描述已经被提交到EJB3.0规范中的细节，并一个个的讲解新的规范中的改变：实体 Bean,O/R映射模型，实体关系模型和EJB QL(EJB查询语言)等等。<br />
<br />
　　背景<br />
<br />
　　EJB3.0中两个重要的变更分别是：使用了Java5中的程序注释工具和基于Hibernate的O/R映射模型。<br />
<br />
　　Java5中的元数据工具。<br />
<br />
　　Java5 （以前叫J2SE1.5或Tiger）中加入了一种新的程序注释工具。通过这个工具你可以自定义注释标记，通过这些自定义标记来注释字段、方法、类等等。这些注释并不会影响程序的语义，但是可以通过工具（编译时或运行时）来解释这些标记并产生附加的内容（比如部署描述文件），或者强制某些必须的运行时行为（比如EJB组件的状态特性）。注释的解析可以通过源文件的解析（比如编译器或这IDE工具）或者使用Java5中的APIs反射机制。注释只能被定义在源代码层。由于所有被提交到EJB3.0草案中的注释标记都有一个运行时的RetentionPolicy，因此会增加类文件占用的存储空间，但这却给容器制造商和工具制造商带来了方便。<br />
<br />
　　Hibernate<br />
<br />
　　目前Hibernate非常受欢迎，它是开发源代码的Java O/R映射框架，目的是把开发人员从繁琐的数据持久化编程中解脱出来。它也有一个标准的HQL（Hibernate 查询语言）语言，你可以在新的EJB QL中看到它的影子。Hibernate在处理如数据查询、更新、连接池、事务处理、实体关系处理等方面非常简单。<br />
<br />
　　概览<br />
<br />
　　在已经提交的EJB3.0规范中主要涉及两个方面的改变：<br />
<br />
　　1. 一套以注释为基础的EJB编程模型，再加上EJB2.1中定义的通过部署描述符和几个接口定义的应用程序行为。<br />
<br />
　　2. 新的实体Bean持久化模型，EJBQL也有许多重要的改变。<br />
<br />
　　还有一些有关上述的提议，比如：一个新的客户端编程模型，业务接口的使用以及实体Bean的生命周期。请注意EJB2.1编程模型（包括部署描述符和home/remote接口）仍然是有效的。新的简化模型并没有完全取代EJB2.1模型。<br />
<br />
　　EJB注释<br />
<br />
　　EJB 规范组织一个重要的目标是减轻原始代码的数量，并且他们为此给出了一个完美而简介的办法。在EJB3.0的里，任何类型的企业级Bean只是一个加了适当注释的简单Java对象(POJO)。注释可以用于定义bean的业务接口、O/R映射信息、资源引用信息，效果与在EJB2.1中定义部署描述符和接口是一样的。在EJB3.0中部署描述符不再是必须的了；home接口也没有了，你也不必实现业务接口（容器可以为你完成这些事情）。<br />
<br />
　　比如，你可以使用@Stateless注释标记类把Java类声明为一个无状态回话bean。对于有状态回话bean来说，@Remove注释可以用来标记一个特定的方法，通过这个注释来说明在调用这个方法之后bean的实例将被清除掉。<br />
<br />
　　为了减少描述组件的说明信息，规范组织还采纳了由异常进行配置（configuration-by-exception）的手段，意思是你可以为所有的注释提供一个明确的缺省值，这样多数常规信息就可以据此推断得出。<br />
<br />
　　新的持久化模型<br />
<br />
　　新的实体bean也是一个加了注释的简单Java对象(POJO)。一旦它被EntityManager访问它就成为了一个持久化对象，并且成为了持久化上下文（context）的一部分。一个持久化上下文与一个事务上下文是松耦合的；严格的讲，它隐含的与一个事务会话共存。<br />
<br />
　　实体关系也是通过注释来定义的，O/R映射也是，并提供几种不同的数据库规范操作，在EJB2.1中这些要通过开发人员自己的设计模式或者其它技术来完成的（比如，自增长主键策略）。<br />
<br />
　　深入研究<br />
<br />
　　现在是时候详细了解EJB3.0草案了。让我们开始探讨所有EJB中四种企业级bean，并看看他们在新的规范中是什么样子。<br />
<br />
　　无状态回话bean<br />
<br />
　　在EJB3.0规范中，写一个无状态回话bean(SLSB)只需要一个简单的Java文件并在类层加上@Stateless注释就可以了。这个bean可以扩展javax.ejb.SessionBean接口，但这些不是必须的。<br />
<br />
　　一个SLSB不再需要home接口，没有哪类EJB再需要它了。Bean类可以实现业务接口也可以不实现它。如果没有实现任何业务接口，业务接口会由任意 public的方法产生。如果只有几个业务方法会被暴露在业务接口中，这些方法可以使用@BusinessMethod注释。缺省情况下所有产生的接口都是local（本地）接口，你也可以使用@Remote注释来声明这个接口为remote（远程）接口。<br />
<br />
　　下面的几行代码就可以定义一个HelloWorldbean了。而在EJB2.1中同样的bean至少需要两个接口，一个实现类和几个空的实现方法，再加上部署描述符。<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
import javax.ejb.*;<br />
<br />
/**<br />
* A stateless session bean requesting that a remote business<br />
* interface be generated for it.<br />
*/<br />
@Stateless<br />
@Remote<br />
public class HelloWorldBean {<br />
public String sayHello() {<br />
return "Hello World!!!";<br />
}<br />
} <br />
<br />
<br />
　　有状态回话bean<br />
<br />
　　除了几个SFSB的特别说明之外，有状态回话bean(SFSB)和SLSB一样精简：<br />
<br />
　　&#183;一个SFSB应该有一个方法来初始化自己（在EJB2.1中是通过ejbCreate()来实现的）。在EJB3.0的规范中建议这些初始化操作可以通过自定义方法完成，并把他们暴露在业务接口中。在使用这个bean之前由客户端来调用相应的初始化方法。目前规范组织就是否提供一个注释来标记某个方法用于初始化还存在争议。<br />
<br />
　　&#183;Bean的提供者可以用@Remove注释来标记任何SFSB的方法，以说明这个方法被调用之后bean的实例将被移除。同样，规范组织仍然在讨论是否要有一种机制来处理这种特殊的情况，即当这个方法出现异常的情况下bean的实例是否被移除。<br />
<br />
　　下面是对以上问题我个人的观点：<br />
<br />
　　&#183;是否应该有一个注释来标明一个方法进行初始化呢？我的观点是——应该有，这样容器就可以在调用其他方法之前至少调用一个方法来进行初始化。这不仅可以避免不必要的错误(由于没有调用初始化方法)而且可以使容器更明确的判断是否可以重用SFSB实例。我暂且把这个问题放一放，规范组织只考虑为一个方法提供一个注释来声明它是一个初始化方法。<br />
<br />
　　&#183;对于第二个问题我的观点也是肯定的。这有利于Bean的提供者合客户端程序对其进行控制。只有一个遗留的问题：那就是一旦调用这个方法失败，是否能移除这个bean 的实例？答案是不能，但是它将会在回话结束的时候被移除。<br />
<br />
&lt;ccid_page/&gt;<br />
<br />
消息驱动Bean<br />
<br />
　　消息驱动Bean是唯一一种必须实现一个业务接口的Bean。这个接口指出bean支持的是哪一种消息系统。对于以JMS为基础的MDB来说，这个接口是 Javax.jms.MessageListener。注意MDB业务接口不是一个真正意义上的业务接口，它只是一个消息接口。<br />
<br />
　　实体Bean<br />
<br />
　　&#183;实体Bean使用@Entity注释来标记，所有实体bean中的属性/字段不必使用@Transient注释来标记。实体bean的持久化字段可以通过JavaBean-style机制或者声明为public/protected字段来实现。<br />
<br />
　　&#183;实体bean可以使用助手类来描述其状态，但是这些类的实例并没有持久化唯一性（persistent identity）的特性(即，唯一标识这个bean的字段等)，实际上这些助手类与他们的实体bean实例是紧密结合的；并且这些对象还是以非共享方式来访问实体对象的。<br />
<br />
　　实体关联<br />
<br />
　　EJB3.0同时支持Bean之间双向的合单向的关联，它们可以是一对一、一对多、多对一或者是多对多的关联。然而双向关联的两端还要分为自身端（owning side）和对方端（inverse side）不同的端。自身端负责向数据库通告关联的变更。对于多对多的关联自身端必须明确的声明。实际上对方端通过isInverse=true进行注释（由此自身端就不必说明了而是由另一段推断出）。看来上面的描述，规范组织还能说让EJB变的简单了吗？<br />
<br />
　　O/R映射<br />
<br />
　　EJB3.0 中的O/R映射模型也有了重要的改变，它从原来的abstract-persistence-schema-based变成了现在的Hibernate- inspired模式。尽管目前规范组织还在就此进行讨论但是一个明确的模型将会出现在下一个版本的草案中。<br />
<br />
　　举例来说，O/R映射模型将通过bean类中的注释来声明。而且此方法还会指出对应的具体表和字段。O/R映射模型提供了一套自有的SQL；而且除了提供一些基本的SQL外还支持某些高层开发的功能。比如，有一个通过@Column注释声明的字段columnDefinition，那么可以写这样的SQL： columnDefinition="BLOB NOT NULL"<br />
<br />
　　客户端程序模型<br />
<br />
　　一个EJB客户端可以通过 @Inject注释以一种&#8220;注入&#8221;的方式获得一个bean的业务接口引用。你也可以使用另一个注释 @javax.ejb.EJBContext.lookup()来完成上面的操作，但是规范中没有告诉我们一个普通的Java客户端怎样获得一个Bean 的实例，因为这个普通的Java客户端是运行在一个客户端容器中，它无法访问@javax.ejb.EJBContex对象。现在还有另外一种机制来完成上面的工作那就是使用一个超级上下文环境对象：@javax.ejb.Context()。但是规范中没有指出该如何在客户端中使用这个对象。<br />
<br />
　　EJB QL<br />
<br />
　　EJB QL可以通过@NamedQuery来注释。这个注释有两个成员属性分别是name和queryString.一旦定义了这些属性，就可以通过 EntityManager.createNamedQuery(name)来指向这个查询。你也可以创建一个标准的JDBC风格的查询并使用 EntityManager.createQuery(ejbqlString)或EntityManager.createNativeQuery (nativeSqlString)(这个方法用于执行一个本地查询)来执行查询。<br />
<br />
　　EJB QL有两个地方可以定义其参数。javax.ejb.Query接口提供了定义参数、指向查询、更新数据等等方法。下面是一个EJBQL指向查询的例子：<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
.. ..<br />
@NamedQuery(<br />
name="findAllCustomersWithName",<br />
queryString="SELECT c FROM Customer c WHERE c.name LIKE :custName"<br />
)<br />
.. ..<br />
@Inject public EntityManager em;<br />
customers = em.createNamedQuery("findAllCustomersWithName")<br />
.setParameter("custName", "Smith")<br />
.listResults(); <br />
<br />
　　下面列出了一些EJB QL的增强特性：<br />
<br />
　　&#183;支持批量更新和删除。<br />
<br />
　　&#183;直接支持内连接和外连接。FETCH JOIN运行你指出关联的实体，Order可以指定只查询某个字段。<br />
<br />
　　&#183;查询语句可以返回一个以上的结果值。实际上，你可以返回一个依赖的类比如下面这样：<br />
<br />
<br />
<br />
<br />
<br />
SELECT new CustomerDetails(c.id, c.status, o.count)<br />
FROM Customer c JOIN c.orders o<br />
WHERE o.count &gt; 100<br />
　　&#183;支持group by 和having。<br />
<br />
　　&#183;支持where子句的嵌套子查询。<br />
<br />
　　在提交的EJB3.0草案中，EJB QL与标准SQL非常的接近。实际上规范中甚至直接支持本地的SQL(就像我们上面提到的那样)。这一点对某些程序员来说也许有些不是很清楚，我们将在下面进行更详细的讲解。<br />
<br />
　　多样性<br />
<br />
　　方法许可(Method permissions)可以通过@MethodPermissions或@Unchecked注释来声明；同样的，事务属性也可以通过 @TransactionAttribute注释来声明。规范中仍然保留资源引用和资源环境引用。这些一样可以通过注释来声明，但是有一些细微的差别。比如，上下文(context)环境要通过注入工具控制。容器根据bean对外部环境引用自动初始化一个适当的已经声明的实例变量。比如，你可以象下面这样获得一个数据源（DataSource）：<br />
<br />
<br />
<br />
<br />
<br />
@Resource(name="myDataSource") //Type is inferred from variable<br />
public DataSource customerDB;<br />
　　在上面的例子中如果你不指定引用资源的名称(name)那么其中的customerDB会被认为是默认值。当所有的引用属性都可得到时，@Injec注释就可以这样写：<br />
<br />
<br />
<br />
<br />
<br />
@Inject public DataSource customerDB;<br />
　　容器负责在运行时初始化customerDB数据源实例。部署人员必须在此之前在容器中定义好这些资源属性。<br />
<br />
　　更好的消息是：那些以前必须检测的异常将一去不复返。你可以声明任意的应用程序异常，而不必在再抛出或捕获其他类似CreateException和 FinderException这样的异常。容器会抛出封装在javax.ejb.EJBException中的系统级异常或者只在必要时候抛出 IllegalArgumentException或IllegalStateException异常。<br />
&lt;ccid_page/&gt;<br />
<br />
&lt;!--BlogUser:itzealot--&gt;&lt;!--BlogType:10--&gt;<br />
<br />
EJB文件处理模式<br />
<br />
　　在我们结束本节之前，让我的快速的浏览一下容器提供商在EJB处理模式方面可能的变更。规范中对此并没有明确的表态，但我可以想到至少两种模式。<br />
<br />
　　&#183;一种办法是首先利用EJB文件生成类似于EJB2.1部署模式的文件（包括必要的接口和部署描述符）然后再用类似于EJB2.1的方式来部署这个EJB组件。当然，这样产生的部署描述符可能并不标准但是它可以解决同一个容器对EJB2.1和EJB3.0兼容的问题。<br />
<br />
　　&#183;另一种方法是一种类似于JSP托放的部署模式。你可以把一个EJB文件放到一个预先定义的目录下，然后容器会识别这个EJB并处理它，然后部署并使之可以使用。这种方法可以建立于上面那种方法之上，在支持反复部署时有很大的帮助。考虑到部署的简单性也是EJB3.0规范的目的之一，我真诚的希望在下一个草案出来时能够确定一个模式(至少能有一个非正式的)。<br />
<br />
　　你有什么想法？<br />
<br />
　　EJB3.0规范的制定正在有序的进行，为了使 EJB的开发变得更加容易，EJB规范组织作出的努力是有目共睹的。就像他们说的那样，一切对会变得简单，但做到这一点并不容易。目前已经定义了50个注释标记(还有几个将在下一个草案中发布)，每一个都有自己的缺省规则和其他的操作。当然，我真的不希望EJB3.0变成EJB2.1的一个翻版"EJB 3.0 = EJB 2.1 for dummies"（希望这个等式不要成立）。最后，我还是忍不住要提一些我自己的观点：<br />
<br />
　　&#183;首先，规范确实使反复部署变得容易了，并且有一个简单的模式来访问运行时环境。我还是觉得home接口应该放弃。<br />
<br />
　　&#183;在早期的EJB规范中，实体bean用于映射一个持久化存储。理论上(也许只是理论上)可能需要把实体bean映射到一个遗留的EIS (entERPrise information system)系统中。出于将来扩展的考虑这样作是有好处的，并且可以使更多的业务数据模型采用实体bean。也因此其伴随的复杂性使得实体bean不被看好。在本次提交的草案中，一个实体bean只是一个数据库的映射。并且是基于非抽象持久化模式和简单的数据访问模式的更加简单开发。<br />
<br />
　　&#183;我对模型变更持保留态度，我认为在EJB中包含SQL脚本片断并不是个好注意。一些开发人员完全反对包含某些&#8220;SQL片段（SQLness）&#8221;（比如 @Table 和 @Column注释）。我的观点是这些SQLness是好的，据此我们可以清楚的知道我们到底要数据库作些什么。但是某些SQL段我看来并不是很好，比如 columnDefinition="BLOB NOT NULL"，这使得EJB代码和SQL之间的耦合太过紧密了。<br />
<br />
　　&#183;尽管对于本地SQL的支持看似很诱人，其实在EJB代码中嵌入SQL是一个非常糟糕的主意。当然，有些办法可以避免在EJB中硬编码SQL，但是这应该在规范中说明，而不能是某些开发人员自己定义的模式。<br />
<br />
　　&#183;假设@Table注释只用于类。在运行时通过@Table注释的name属性定义的表名称将必须对应一个实际的数据库表。规范对此应该给予清楚的说明和一致的模式。<br />
<br />
　　&#183;规范还需要更清楚的说明客户端编程模型，尤其是普通Java客户端。规范中所有的参考都假设或者隐含的使用EJB客户端。而且规范中对客户端的向后兼容方面也没有给出明确的说法。<br />
<br />
　　&#183;Transient注释应该重新命名以避免和已有的transient关键字发生冲突。事实上，在这一点上我们更乐于稍微的背离一下 configuration-by-exception原则并且定义一个@Persistent注释来明确的定义持久化字段。@Persistent注释可以仅仅是一个标记注释或者它可以有几个属性来关联O/R映射注释。<br />
<br />
　　与其他规范的关联<br />
<br />
　　目前可能影响到EJB3.0的JSR有JSR175（java语言元数据工具）和JSR181（Java Web服务元数据）<br />
<br />
　　JSR175已经初步完成并且不会和EJB3.0有太大的冲突；但是JSR181与EJB3.0有两个关联的地方：<br />
<br />
　　&#183;Web Service接口：EJB规范将采用一种机制适应JSR181以便可以把一个bean实现为一个Web service并告诉Web service如何被客户端调用。<br />
<br />
　　&#183;JSR 181计划采用不同的机制来处理安全问题。在早期的规范中EJB建议使用一个一致的机制（MethodPermissions），但是JSR 181计划使用一个稍微不同的方式（SecurityRoles和SecurityIdentity注释）。同样的RunAs注释的定义也存在这些许差别。这一问题还在解决中最终会在J2EE层的规范中维持其一致性。<br />
<br />
　　在J2EE 1.5中的一些开发规范可能与EJB3.0有关联。除了上面说到的几个关联之外现在没有其他的开发规范与EJB3.0有冲突。<br />
<br />
　　结束语<br />
<br />
　　在使EJB的开发变得简单高效之前，我们还有很长一段路要走。规范组织在降低EJB的开发难度方面起了个好头。O/R映射模型的提议还处在早期阶段，规范组织正在完善它。我希望它不要太复杂也不要与SQL过分的耦合。让我们不要只是停留在期望、希望、思考和请求中：提出你的想法并把你的建议发送给规范组织 ejb3-feedback@sun.com。JCP并不是很民主的组织，但是你的建议一定是有价值的。
<img src ="http://www.blogjava.net/WshmAndLily/aggbug/143448.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/WshmAndLily/" target="_blank">semovy</a> 2007-09-07 16:00 <a href="http://www.blogjava.net/WshmAndLily/articles/143448.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>EJB3.0入门</title><link>http://www.blogjava.net/WshmAndLily/articles/142139.html</link><dc:creator>semovy</dc:creator><author>semovy</author><pubDate>Sun, 02 Sep 2007 14:04:00 GMT</pubDate><guid>http://www.blogjava.net/WshmAndLily/articles/142139.html</guid><wfw:comment>http://www.blogjava.net/WshmAndLily/comments/142139.html</wfw:comment><comments>http://www.blogjava.net/WshmAndLily/articles/142139.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/WshmAndLily/comments/commentRss/142139.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/WshmAndLily/services/trackbacks/142139.html</trackback:ping><description><![CDATA[EJB3.0规范使开发EJB比过去更容易，可能诱惑你考虑开发第一个EJB。如果真是这种情况，那么祝贺你，<br />
你经成功避免了在你以前EJB开发者的很多挫折，并且享受到EJB3.0开发的便利性。但是你开始开发以前，<br />
你可能想知道EJB是什么和它们用于什么目的。本篇文章解释了EJB的基础和你如何在一个J2EE程序中使用<br />
它们。<br />
<br />
<span class="boldbodycopy">什么是EJB？</span>
<p>一个企业JavaBean (EJB)是一个可重用的，可移植的J2EE组件。 EJB由封装了业务逻辑的多个方法组成。<br />
例如，一个EJB可以有包括一个更新客户数据库中数据的方法的业务逻辑。多个远程和本地客户端可以调用这<br />
个方法。另外，EJB运行在一个容器里，允许开发者只关注与bean中的业务逻辑而不用考虑象事务支持，安全<br />
性和远程对象访问等复杂和容易出错的事情。EJB以POJO或者普通旧的Java对象形式开发，开发者可以用元数<br />
据注释来定义容器如何管理这些Bean。</p>
<p><span class="boldbodycopy">EJB类型</span></p>
<p>EJB主要有三种类型：会话Bean，实体Bean和消息驱动Bean。会话Bean完成一个清晰的解耦的任务，例如<br />
检查客户账户历史记录。实体Bean是一个代表存在于数据库中业务对象的复杂业务实体。消息驱动Bean用于<br />
接收异步JMS消息。让我们更详细的认识这些类型。</p>
<p>会话<span class="italicbodycopy">Bean</span></p>
<p>会话Bean一般代表着业务流程中象"处理订单"这样的动作。会话Bean基于是否维护过度状态分为有状<br />
态或者无状态。<br />
无状态会话Bean 没有中间状态。它们不保持追踪一个方法调用另一个方法传递的信息。因此一个无状<br />
态业务方法的每一次调用都独立于它的前一个调用；例如，税费计算或者转移账款。 当计算税费额的方法被<br />
调用时，税费值被计算并返回给调用的方法，没有必要存储调用者为将来调用备用的内部状态。因为它们不<br />
维护状态，所以这些Bean是仅仅由容器管理。当客户端请求一个无状态的Bean实例时，它可以接收来自由容器管理的无状态会话Bean实例集中的一个实例。也因为无状态会话Bean能够被共享，所以容器可以维护更少<br />
数量的实例来为大量的客户端服务。简单地象该Bean增加元注释<span style="font-family: Courier New">@Stateless</span> 来指定一个 Java Bean作为一个<br />
无状态会话Bean被部署和管理。<br />
一个有状态的会话Bean维护一个跨越多个方法调用的会话状态；例如在线购物篮应用。当客户开始在线<br />
购物时，客户的详细信息从数据库获得。相同的信息对于当客户从购物篮中增加或者移除商品等等操作时被调用的其他方法也是可访问的 。但是因为该状态不是在会话结束，系统崩溃或者网络失败时保留，所以有状<br />
态会话Bean是暂时的。当一个客户端请求一个有状态会话Bean实例时，客户端将会得到一个会话实例，该Bean的状态只为给客户端维持。通过向方法增加元注释<span style="font-family: Courier New">@Remove来告诉容器当某个方法调用结束一个有状态<br />
会话Bean实例应该被移除。</span></p>
<h4>会话Bean实例</h4>
<blockquote>
<table width="100%" border="1">
    <tbody>
        <tr>
            <td>
            <p><code>import javax.ejb.Stateless.*;</code></p>
            <p><code>/**<br />
            * 一个简单无状态会话Bean实现了CalculateEJB接口的incrementValue()方法<br />
            </code><code>**/<br />
            <br />
            @Stateless(name="CalculateEJB")<br />
            public class CalculateEJBBean<br />
            implements CalculateEJB<br />
            {<br />
            int value = 0;<br />
            public String incrementValue()<br />
            {<br />
            value++;<br />
            return "value incremented by 1";<br />
            }<br />
            }</code></p>
            </td>
        </tr>
    </tbody>
</table>
</blockquote>
<p><span class="italicbodycopy">实体Bean</span></p>
<p>实体Bean是管理持久化数据的一个对象，潜在使用一些相关的Java对象并且可以依靠主键被唯一识别。通<br />
过包括<span style="font-family: Courier New">@Entity</span> 元注释来指定一个类是一个实体Bean。实体Bean表示来自数据库的持久化数据，例如客户表<br />
中的一个记录，或者一个员工表中的一个员工记录。实体Bean也可以被多个客户端共享。例如一个员工实体<br />
能够被多个计算一个员工每年工资总额或者更新员工地址的客户端使用。实体Bean对象特定变量能够保持持<br />
久化。实体Bean中所有没有<span style="font-family: Courier New">@Transient</span> 元注释的变量需要考虑持久化。EJB3.0的一个主要特色是创建包含使用元数据注释的对象/关系映射实体Bean的能力。例如，指定实体Bean的empId变量映射到employee表中的<br />
EMPNO属性，象下面实例中一样用<span style="font-family: Courier New">@Table(name="Employees")</span> 注释这个表的名字和用<span style="font-family: Courier New">@Column<br />
(name="EMPNO")注释empId变量。另外，EJB3.0中的一个特色是你可以很容易的在开发时测试实体<br />
Bean，可以用<span style="font-family: Times New Roman">Oracle Application Server Entity Test Harness</span>在容器外部运行一个实体Bean。</span></p>
<h4>实体Bean实例</h4>
<blockquote>
<table width="100%" border="1">
    <tbody>
        <tr>
            <td>
            <p><code>import javax.persistence.*;<br />
            import java.util.ArrayList;<br />
            import java.util.Collection;</code></p>
            <p><code>@Entity<br />
            @Table(name = "EMPLOYEES")<br />
            public class Employee implements java.io.Serializable<br />
            {<br />
            private int empId;<br />
            private String eName;<br />
            private double sal;<br />
            <br />
            @Id<br />
            @Column(name="EMPNO", primaryKey=true)<br />
            public int getEmpId()<br />
            </code><code>{<br />
            return empId;<br />
            </code><code>}</code></p>
            <p><code>public void setEmpId(int empId)<br />
            {<br />
            this.empId = empId;<br />
            }</code></p>
            <p><code>public String getEname()<br />
            {<br />
            return eName;<br />
            }</code></p>
            <p><code>public void setEname(String eName)<br />
            {<br />
            this.eName = eName;<br />
            }<br />
            <br />
            public double getSal()<br />
            {<br />
            return sal;<br />
            }</code><br />
            <br />
            <code>public void setSal(double sal)<br />
            {<br />
            this.sal = sal;<br />
            }<br />
            <br />
            public String toString()<br />
            {<br />
            StringBuffer buf = new StringBuffer();<br />
            buf.append("Class:")<br />
            .append(this.getClass().getName()).append(" :: ").append(" empId:").append(getEmpId()).append(" ename:").append(getEname()).append("sal:").append(getSal());<br />
            return buf.toString();<br />
            }<br />
            }</code></p>
            </td>
        </tr>
    </tbody>
</table>
</blockquote>
<p><span class="italicbodycopy">消息驱动Bean</span></p>
<p>驱动Bean (MDB) 提供了一个实现异步通信比直接使用Java消息服务（JMS）更容易地方法。创建MDB接<br />
收异步JMS消息。容器处理为JMS队列和主题所要求加载处理的大部分工作。它向相关的MDB发送所有的消<br />
息。一个MDB允许J2EE应用发送异步消息，该应用能处理这些消息。实现<span style="font-family: Courier New"><span style="font-family: Courier New">javax.jms.<br />
</span></span><span style="font-family: Courier New">MessageListener接口和使用<code>@MessageDriven注释该Bean来</code></span>指定一个Bean是消息驱动Bean。</p>
<h4>消息驱动Bean实例</h4>
<blockquote>
<table width="100%" border="1">
    <tbody>
        <tr>
            <td>
            <p><code>import javax.ejb.MessageDriven;<br />
            import javax.ejb.ActivationConfigProperty;<br />
            import javax.ejb.Inject;<br />
            import javax.jms.*;<br />
            import java.util.*;<br />
            import javax.ejb.TimedObject;<br />
            import javax.ejb.Timer;<br />
            import javax.ejb.TimerService;<br />
            @MessageDriven(<br />
            activationConfig = {<br />
            @ActivationConfigProperty(propertyName="connectionFactoryJndiName", propertyValue="jms/TopicConnectionFactory"),<br />
            @ActivationConfigProperty(propertyName="destinationName", propertyValue="jms/myTopic"),<br />
            @ActivationConfigProperty(propertyName="destinationType", propertyValue="javax.jms.Topic"),<br />
            @ActivationConfigProperty(propertyName="messageSelector", propertyValue="RECIPIENT = 'MDB'")</code><br />
            <code>}<br />
            )</code></p>
            <p><code>/**<br />
            *监听可配置JMS队列或者主题和通过当一个消息发送到队列或者主题<br />
            *</code><code>调用它的onMessage()方法得到提醒的一个简单的消息驱动<br />
            *该Bean打印消息的内容<br />
            </code><code>*/</code></p>
            <p><code>public class MessageLogger implements MessageListener, TimedObject<br />
            {</code></p>
            <p><code>@Inject javax.ejb.MessageDrivenContext mc;<br />
            <br />
            public void onMessage(Message message)<br />
            {<br />
            System.out.println("onMessage() - " + message);<br />
            try<br />
            </code><code>{<br />
            </code><code>String subject = message.getStringProperty("subject");<br />
            String inmessage = message.getStringProperty("message");<br />
            System.out.println("Message received\n\tDate: " + new java.util.Date() + "\n\tSubject: " + subject + "\n\tMessage: " + inmessage + "\n");<br />
            System.out.println("Creating Timer a single event timer");<br />
            TimerService ts = mc.getTimerService();<br />
            Timer timer = ts.createTimer(30000, subject);<br />
            System.out.println("Timer created by MDB at: " + new Date(System.currentTimeMillis()) +" with info: "+subject);<br />
            }<br />
            catch (Throwable ex)<br />
            {<br />
            ex.printStackTrace();<br />
            }<br />
            }<br />
            </code><code><br />
            public void ejbTimeout(Timer timer)<br />
            {<br />
            System.out.println("EJB 3.0: Timer with MDB");<br />
            </code><code>System.out.println("ejbTimeout() called at: " + new Date(System.currentTimeMillis()));<br />
            </code><code>return;<br />
            }</code><code><br />
            }</code></p>
            </td>
        </tr>
    </tbody>
</table>
<br />
</blockquote>
<p><span class="boldbodycopy">使用EJB</span></p>
<p>客户端是访问Bean的应用程序。虽然没有必要保存在客户层，但是能够作为一个独立的应用，JSP，<br />
Servlet，或者另一个EJB。客户端通过Bean的远程或者本地接口访问EJB中的方法，主要取决于客户端和Bean<br />
运行在同一个还是不同的JVM中。这些接口定义了Bean中的方法，而由Bean类实际实现这些方法。当一个<br />
客户端访问该Bean类中的一个方法时，容器生成Bean的一个代理，被叫做远程对象或者本地对象。远程或者<br />
本地对象接收请求，委派它到相应的Bean实例，返回结果给客户端。调用一个Bean中的方法，客户端使用定<br />
义在EJB不是描述文件的名字查找到Bean。在以下实例中，客户端使用上下文对象找到命名为"StateLessejb"<br />
Bean。</p>
<p>EJB 客户端实例</p>
<blockquote>
<table width="100%" border="1">
    <tbody>
        <tr>
            <td>
            <p><code>import javax.naming.Context;<br />
            import javax.naming.InitialContext;</code></p>
            <p><code>/**<br />
            * 一个调用无状态会话Bean中方法的简单的Bean客户端<br />
            */</code></p>
            <p><code>public class CalculateejbClient<br />
            {<br />
            public static void main(String [] args)<br />
            {<br />
            Context context = new InitialContext();</code><br />
            <code>CalculateEJB myejb =<br />
            (CalculateEJB)context.lookup("java:comp/env/ejb/CalculateEJB");<br />
            myejb.incrementValue();<br />
            }<br />
            }</code></p>
            </td>
        </tr>
    </tbody>
</table>
<br />
</blockquote>
<p><span class="boldbodycopy">总结</span></p>
<p>EJB3.0开发企业JavaBean是相当容易的。此规范使用元数据注释定义Bean的类型和暴露给客户端的方法。<br />
因此，无论你将创建一个执行特定任务的会话Bean还是映射一个表到实体Bean来更新数据，你都能象使用普<br />
通Java对象和接口一样进行处理，在业务方法中使用元注释向客户端暴露方法。既然你已经理解了EJB的基础,<br />
可以到OTN中<a href="http://www.oracle.com/technology/tech/java/ejb30.html">EJB 3.0 Resources Page</a>发现更多信息。</p>
<img src ="http://www.blogjava.net/WshmAndLily/aggbug/142139.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/WshmAndLily/" target="_blank">semovy</a> 2007-09-02 22:04 <a href="http://www.blogjava.net/WshmAndLily/articles/142139.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>