﻿<?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-大鱼-随笔分类-EJB</title><link>http://www.blogjava.net/luluyanglu/category/38321.html</link><description /><language>zh-cn</language><lastBuildDate>Mon, 26 Oct 2009 14:22:44 GMT</lastBuildDate><pubDate>Mon, 26 Oct 2009 14:22:44 GMT</pubDate><ttl>60</ttl><item><title>ejb3笔记 </title><link>http://www.blogjava.net/luluyanglu/archive/2009/10/20/299008.html</link><dc:creator>大鱼</dc:creator><author>大鱼</author><pubDate>Tue, 20 Oct 2009 04:34:00 GMT</pubDate><guid>http://www.blogjava.net/luluyanglu/archive/2009/10/20/299008.html</guid><wfw:comment>http://www.blogjava.net/luluyanglu/comments/299008.html</wfw:comment><comments>http://www.blogjava.net/luluyanglu/archive/2009/10/20/299008.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/luluyanglu/comments/commentRss/299008.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/luluyanglu/services/trackbacks/299008.html</trackback:ping><description><![CDATA[<div class="postTitle"><a class="postTitle2" id="viewpost1_TitleUrl" href="http://www.blogjava.net/woxingwosu/archive/2007/06/01/121405.html">hibernate_ejb3笔记</a> </div>
&nbsp;&nbsp; 1、用MyEclipse通过连接到数据库，可以生成Hibernate需要的POJO和对应的映射文件。但是我生成的hbm.xml有问题，会报错"could not load an entity"。后来找到了元凶
<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">&lt;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;name</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">hbm.pojo.Misuser</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;table</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">misuser</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;schema</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">informix</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;catalog</span><span style="color: #000000">="</span><span style="color: #000000">zzymis"</span><span style="color: #000000">&gt;</span></div>
把catalog="zzymis"去掉就OK了。<br />
<br />
&nbsp;&nbsp; 2、Hibrenate保存数据失败
<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;&nbsp;&nbsp;如果忘记提交事务会导致数据保存或者更新失败，正确代码如下：<br />
&nbsp;&nbsp;&nbsp;HibernateSessionFactory.&nbsp;getSession().beginTransaction();<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;hbm.pojo.StudySubjectDAO().merge(subject);<br />
&nbsp;&nbsp;&nbsp;HibernateSessionFactory.&nbsp;getSession().flush();<br />
&nbsp;&nbsp;&nbsp;HibernateSessionFactory.&nbsp;getSession().getTransaction().commit();</span></div>
<br />
&nbsp;&nbsp; 3、Hibernate一对多的配置
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">最好使用双向关联（假设Main</span><span style="color: #000000">-&gt;</span><span style="color: #000000">Detail）<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #000000">1</span><span style="color: #000000">）Main.java中加入：<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;Set</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;Detail&nbsp;</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;detail</span><span style="color: #000000">=</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;HashSet();<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;然后加入get()和set()方法；<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #000000">2</span><span style="color: #000000">）Detail.java中加入：<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;Main&nbsp;main；<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;然后加入get()和set()方法；另外别忘了重写equals()方法<br />
<img id="Codehighlighter1_230_573_Open_Image" onclick="this.style.display='none'; Codehighlighter1_230_573_Open_Text.style.display='none'; Codehighlighter1_230_573_Closed_Image.style.display='inline'; Codehighlighter1_230_573_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_230_573_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_230_573_Closed_Text.style.display='none'; Codehighlighter1_230_573_Open_Image.style.display='inline'; Codehighlighter1_230_573_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" />&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;</span><span id="Codehighlighter1_230_573_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_230_573_Open_Text"><span style="color: #000000">{<br />
<img id="Codehighlighter1_306_342_Open_Image" onclick="this.style.display='none'; Codehighlighter1_306_342_Open_Text.style.display='none'; Codehighlighter1_306_342_Closed_Image.style.display='inline'; Codehighlighter1_306_342_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_306_342_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_306_342_Closed_Text.style.display='none'; Codehighlighter1_306_342_Open_Image.style.display='inline'; Codehighlighter1_306_342_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(object&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">.getClass().equals(object.getClass()))&nbsp;</span><span id="Codehighlighter1_306_342_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_306_342_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&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">;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Detail&nbsp;other&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(Detail)object;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(other.id</span><span style="color: #000000">==</span><span style="color: #0000ff">null</span><span style="color: #000000">||</span><span style="color: #0000ff">this</span><span style="color: #000000">.id</span><span style="color: #000000">==</span><span style="color: #0000ff">null</span><span style="color: #000000">)<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&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">;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&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;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&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">;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&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">;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #000000">3</span><span style="color: #000000">）Main.hbm.xml中加入：<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">set&nbsp;name</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">detail</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;inverse</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">true</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;cascade</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">all</span><span style="color: #000000">"</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">key&nbsp;column</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">mainId</span><span style="color: #000000">"</span><span style="color: #000000">&gt;&lt;/</span><span style="color: #000000">key</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">one</span><span style="color: #000000">-</span><span style="color: #000000">to</span><span style="color: #000000">-</span><span style="color: #000000">many&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;Detail</span><span style="color: #000000">"</span><span style="color: #000000">/&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;/</span><span style="color: #000000">set</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #000000">4</span><span style="color: #000000">)Detail.hbm.xml中加入：<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">many</span><span style="color: #000000">-</span><span style="color: #000000">to</span><span style="color: #000000">-</span><span style="color: #000000">one&nbsp;name</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;main&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;Main</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;column</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;mainId</span><span style="color: #000000">"</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;/</span><span style="color: #000000">many</span><span style="color: #000000">-</span><span style="color: #000000">to</span><span style="color: #000000">-</span><span style="color: #000000">one</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;同时把mainId对应的</span><span style="color: #000000">&lt;</span><span style="color: #000000">property</span><span style="color: #000000">&gt;</span><span style="color: #000000">&#8230;&#8230;</span><span style="color: #000000">&lt;/</span><span style="color: #000000">property</span><span style="color: #000000">&gt;</span><span style="color: #000000">删掉<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #000000">5</span><span style="color: #000000">）操作：<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;双向设置：（调用setMain()setDetail()）</span></div>
<br />
&nbsp;&nbsp; 4、EJB中的getSingleResult()方法<br />
&nbsp;&nbsp;&nbsp; 查找返回一个结果,是唯一的一个结果，当getSingleResult()个方法被调用时执行查询。如果没有结果返回,这个方法将会抛出javax.persistence.EntityNotFoundException运行异常.如果找到多于一个结果, javax.persistence.NonUniqueResultException异常将会在运行期间抛出.因为这两个异常都是RuntimeException,例子中的代码不需要完整的try/catch块。<br />
<br />
&nbsp;&nbsp; 5、Hibernate3的解决中文查询问题
<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;&nbsp;&nbsp;如果直接把查询的参数放到sql语句中是查不出来的，比如：<br />
&nbsp;&nbsp;&nbsp;Query&nbsp;query</span><span style="color: #808080">=</span><span style="color: #000000">em.createQuery("</span><span style="color: #0000ff">select</span><span style="color: #000000">&nbsp;u&nbsp;</span><span style="color: #0000ff">from</span><span style="color: #000000">&nbsp;</span><span style="color: #ff00ff">User</span><span style="color: #000000">&nbsp;u&nbsp;</span><span style="color: #0000ff">where</span><span style="color: #000000">&nbsp;u.name&nbsp;</span><span style="color: #808080">like</span><span style="color: #000000">&nbsp;</span><span style="color: #ff0000">'</span><span style="color: #ff0000">%"+myName+"%</span><span style="color: #ff0000">'</span><span style="color: #000000">");&nbsp;<br />
&nbsp;&nbsp;&nbsp;可以使用占位符或者设置参数的方法来查询，例如：<br />
&nbsp;&nbsp;&nbsp;</span><span style="font-weight: bold; color: #800000">1</span><span style="color: #000000">)Query&nbsp;query</span><span style="color: #808080">=</span><span style="color: #000000">em.createQuery("</span><span style="color: #0000ff">select</span><span style="color: #000000">&nbsp;u&nbsp;</span><span style="color: #0000ff">from</span><span style="color: #000000">&nbsp;</span><span style="color: #ff00ff">User</span><span style="color: #000000">&nbsp;u&nbsp;</span><span style="color: #0000ff">where</span><span style="color: #000000">&nbsp;u.name&nbsp;</span><span style="color: #808080">like</span><span style="color: #000000">&nbsp;?&nbsp;");&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;query.setString(</span><span style="font-weight: bold; color: #800000">0</span><span style="color: #000000">,"</span><span style="color: #808080">%</span><span style="color: #000000">"</span><span style="color: #808080">+</span><span style="color: #000000">myName</span><span style="color: #808080">+</span><span style="color: #000000">"</span><span style="color: #808080">%</span><span style="color: #000000">");<br />
&nbsp;&nbsp;&nbsp;</span><span style="font-weight: bold; color: #800000">2</span><span style="color: #000000">)Query&nbsp;query</span><span style="color: #808080">=</span><span style="color: #000000">em.createQuery("</span><span style="color: #0000ff">select</span><span style="color: #000000">&nbsp;u&nbsp;</span><span style="color: #0000ff">from</span><span style="color: #000000">&nbsp;</span><span style="color: #ff00ff">User</span><span style="color: #000000">&nbsp;u&nbsp;</span><span style="color: #0000ff">where</span><span style="color: #000000">&nbsp;u.name&nbsp;</span><span style="color: #808080">like</span><span style="color: #000000">&nbsp;:name");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;query.setString("name","</span><span style="color: #808080">%</span><span style="color: #000000">"</span><span style="color: #808080">+</span><span style="color: #000000">myName</span><span style="color: #808080">+</span><span style="color: #000000">"</span><span style="color: #808080">%</span><span style="color: #000000">");</span></div>
<br />
&nbsp;&nbsp; 6、Like的其他用法（正则）
<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;&nbsp;&nbsp;</span><span style="color: #808080">like</span><span style="color: #000000">&nbsp;</span><span style="color: #ff0000">'</span><span style="color: #ff0000">_heryl</span><span style="color: #ff0000">'</span><span style="color: #000000">&nbsp;：搜索以字母&nbsp;heryl&nbsp;结尾的所有六个字母的名称（如&nbsp;Cheryl、Sheryl）。<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">like</span><span style="color: #000000">&nbsp;</span><span style="color: #ff0000">'</span><span style="color: #ff0000">[CK]ars[eo]n</span><span style="color: #ff0000">'</span><span style="color: #000000">&nbsp;：搜索下列字符串：Carsen、Karsen、Carson&nbsp;和&nbsp;Karson（如&nbsp;Carson）。<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">like</span><span style="color: #000000">&nbsp;</span><span style="color: #ff0000">'</span><span style="color: #ff0000">[M-Z]inger</span><span style="color: #ff0000">'</span><span style="color: #000000">&nbsp;：搜索以字符串&nbsp;inger&nbsp;结尾、以从M到Z的任何单个字母开头的所有名称如&nbsp;。<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">like</span><span style="color: #000000">&nbsp;</span><span style="color: #ff0000">'</span><span style="color: #ff0000">M[^c]%</span><span style="color: #ff0000">'</span><span style="color: #000000">&nbsp;：搜索以字母&nbsp;M&nbsp;开头，并且第二个字母不是&nbsp;c&nbsp;的所有名称（如&nbsp;MacFeather）。&nbsp;</span></div>
<br />
&nbsp;&nbsp; 7、一对多(one-to-many)删除不掉<br />
&nbsp;&nbsp; 比如Main-to-Detail是one-to-many关系，在新增的时候可以通过persistMain()同时把多个Detail插入数据库，但是如果想删除某个Main中的某几个Detail时，好像通过mergeMain()是无法做到的，通过mergeMain()可以更新Main的属性，但是没办法删除相应的Detail，至少我是没办法做到。这时，我一半都是写个方法单独来删除Detail，例如deleteDetailById()来一个个删除。<br />
&nbsp;<br />
&nbsp;&nbsp; 8、查询返回多个实体Bean
<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;&nbsp;&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">)查询(省略后的代码)<br />
&nbsp;&nbsp;&nbsp;@PersistenceContext(unitName</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">crm</span><span style="color: #000000">"</span><span style="color: #000000">)<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;EntityManager&nbsp;em;<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;List&nbsp;getUserinfoTrace(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;em.createQuery(</span><span style="color: #000000">"</span><span style="color: #000000">select&nbsp;new&nbsp;List(u,t)&nbsp;&nbsp;from&nbsp;Userinfo&nbsp;u,Trace&nbsp;t&nbsp;where&nbsp;u.id=t.id</span><span style="color: #000000">"</span><span style="color: #000000">).getResultList();<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">2</span><span style="color: #000000">)读取(省略后的代码)<br />
&nbsp;&nbsp;&nbsp;List</span><span style="color: #000000">&lt;</span><span style="color: #000000">List</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;result</span><span style="color: #000000">=</span><span style="color: #000000">(List</span><span style="color: #000000">&lt;</span><span style="color: #000000">List</span><span style="color: #000000">&gt;</span><span style="color: #000000">)remote.getUserinfoTrace();<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">(List&nbsp;obj:result){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Userinfo&nbsp;userinfo</span><span style="color: #000000">=</span><span style="color: #000000">(Userinfo)result.get(</span><span style="color: #000000">0</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Trace&nbsp;trace</span><span style="color: #000000">=</span><span style="color: #000000">(Trace)result.get(</span><span style="color: #000000">1</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8230;&#8230;<br />
&nbsp;&nbsp;&nbsp;}</span></div>
<br />
&nbsp;&nbsp; 9、设置ID自增
<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">在用netbean生成的实体Bean后，需要手工加上自增注释（@GeneratedValue(strategy&nbsp;<span style="color: #000000">=</span><span style="color: #000000">&nbsp;GenerationType.AUTO)</span>）<br />
例如：<br />
@Id<br />
@Column(name&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">id</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;nullable&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">false</span><span style="color: #000000">)<br />
@GeneratedValue(strategy&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;GenerationType.AUTO)<br />
</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;Integer&nbsp;id;</span></div>
<br />
&nbsp;&nbsp; 10、failed to lazily initialize a collection of role<br />
&nbsp;&nbsp; 因为延迟加载导致的，但是我在EntityBean中使用fetch=FetchType.EAGER和FetchType.LAZY都无效，我的EntityBean是@OneToMany，最后只有在SessionBean的读取EntityBean的方法中加入：
<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;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(main.getDetails()</span><span style="color: #000000">!=</span><span style="color: #0000ff">null</span><span style="color: #000000">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;main.getDetails().size();<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;main;</span></div>
&nbsp;&nbsp; 这样总算解决问题。 
<img src ="http://www.blogjava.net/luluyanglu/aggbug/299008.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/luluyanglu/" target="_blank">大鱼</a> 2009-10-20 12:34 <a href="http://www.blogjava.net/luluyanglu/archive/2009/10/20/299008.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>EJB3 QL查询</title><link>http://www.blogjava.net/luluyanglu/archive/2009/10/20/298924.html</link><dc:creator>大鱼</dc:creator><author>大鱼</author><pubDate>Tue, 20 Oct 2009 01:09:00 GMT</pubDate><guid>http://www.blogjava.net/luluyanglu/archive/2009/10/20/298924.html</guid><wfw:comment>http://www.blogjava.net/luluyanglu/comments/298924.html</wfw:comment><comments>http://www.blogjava.net/luluyanglu/archive/2009/10/20/298924.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/luluyanglu/comments/commentRss/298924.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/luluyanglu/services/trackbacks/298924.html</trackback:ping><description><![CDATA[EJB3 QL查询 <br />
<br />
EJB3的查询语言是一种和SQL非常类似的中间性和对象化查询语言。它可以被编译成不同的底层数据库能接受的SQL，从而屏蔽不同数据库的差异，确保用EJB3 QL查询语言编写的代码可在不同的数据库上运行。比起<span class="hilite1">EJB</span> 2.1的查询语言，EJB3可以运行期构造，支持多态，远远比<span class="hilite1">EJB</span> 2.1的查询更灵活和功能强大。在程序中使用EJB3 QL可以使用大写(SELECT)或者小写(select)，但不要大小写(比如:Select)混合使用。 <br />
　　　 <br />
Query接口 <br />
<br />
javax.persistence.Query是EJB3查询操作的接口。进行查询，首先要通过EntityManager 获得Query对象。 <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; public Query createQuery(String ejbqlString);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
<br />
下面我们做一个最简单的查询，查询所有的com.redsoft.samples.Order类。 <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; final Query query = entityManager.createQuery( "select o from Order o"); <br />
&nbsp;&nbsp;&nbsp; final List result = query.getResultList(); <br />
&nbsp;&nbsp;&nbsp; final Iterator iterator = result.iterator(); <br />
&nbsp;&nbsp;&nbsp; while( iterator.hasNext() ){ <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //　处理Order <br />
&nbsp;&nbsp;&nbsp; } <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
<br />
注意"from Order"。"Order"在EJB3查询中称为com.redsoft.samples.Order类的abstract schema Type。查询Entity在EJB3 QL中都是针对Entity的Abstract Schema Type进行查询。在同一个EntityManagerFactory中，不允许同时有两个Abstract Schema Type相同的Entity类。比如不允许同时有com.redsoft.samples.Order和com.redsoft.foo.Order。　　 <br />
<br />
Query返回一个List的集合结果，我们可以用Iterator或者List.get( int )的方法来获得每个符合条件的Entity。Liberator EJB3 Persistence运行环境的Query查询在构造Query的时候的只是把EJB3 QL编译成相应的SQL，但并不执行。只有当应用代码第一次调用Iterator.next(),Iterator.hasNext()或者 List.get( int )方法的时候,编译后的SQL才会被真正的执行。 <br />
<br />
在Liberator EJB3 Persistence运行环境返回的结果集合中，并不保存所有的结果，而只是保持一个指向JDBC ResultSet或者缓存ResultSet的一个行(row)指针。只有当用户确实需要获得Entity实例的时候，才会从ResultSet中获取数据并填充到Entity实例中返回给应用。 <br />
<br />
如果查询结果结合中包含所有符合条件的Entity, Liberator EJB3 Persistence运行环境默认会自动缓存每次查询的结果。这样下次同样的查询操作就无需访问数据库，而直接从缓存中返回结果集合。但如果在下次查询操作之前，有针对被缓存的Entity类进行update/insert/delete操作，则缓存的结果集合会自动被清空，这样下次查询就会从数据库获得数据， 确保查询总是获得正确的结果，避免缓存脏数据。 <br />
<br />
有时候查询会返回海量的数据。Liberator EJB3运行环境采用了自适应的弱引用POJO管理机制，可以处理海量的数据。在我们的测试中和客户的环境可以处千万级别的数据量。但在处理大数据量的时候，注意关闭对集合结果的缓存。 <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; // 假设返回的结果数量巨大 <br />
&nbsp;&nbsp;&nbsp; final Query query = entityManager.createQuery( "select o from Order o"); <br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; // 关闭对查询结果的缓存 <br />
&nbsp;&nbsp;&nbsp; query.setHint( Constants.QUERY_RESULT_CACHE, "false"); <br />
&nbsp;&nbsp;&nbsp; final List result = query.getResultList(); <br />
&nbsp;&nbsp;&nbsp; final Iterator iterator = result.iterator(); <br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; // 这里我们可以处理海量的数据 <br />
&nbsp;&nbsp;&nbsp; while( iterator.hasNext() ){ <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //　处理Order <br />
&nbsp;&nbsp;&nbsp; } <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
<br />
　　 <br />
简单查询 <br />
下面是一个简单查询的例子，可以看到和SQL的使用方法很类似。 <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; final Query query = entityManager.createQuery( "select o from Order o where o.id = 1"); <br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; final Query query = entityManager.createQuery( "select o from Order o where o.id = 1 and o.confirm = 'true' "); <br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; final Query query = entityManager.createQuery( "select o from Order o where o.id = 1 or o.customer = 'foo' "); <br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; // address是Order类上的一个对象变量属性，Address有一个streetNumber的属性 <br />
&nbsp;&nbsp;&nbsp; final Query query = entityManager.createQuery( "select o from Order o where o.address.streetNumber &gt;= 123" ); <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; <br />
<br />
注意条件语句中查询的是Entity的属性，属性的名字需要和Entity中的属性变量名字一致。 <br />
使用参数查询 <br />
<br />
参数查询也和SQL中的参数查询类似。EJB3 QL支持两种方式的参数定义方式: 命名参数和位置参数。在同一个查询中只允许使用一种参数定义方式。 <br />
命名参数: <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; final Query query = entityManager.createQuery( "select o from Order o where o.id = :myId"); <br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; // 设置查询中的参数 <br />
&nbsp;&nbsp;&nbsp; query.setParameter( "myId", 2 ); <br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; // 可以使用多个参数 <br />
&nbsp;&nbsp;&nbsp; final Query query = entityManager.createQuery( "select o from Order o where o.id = :myId and o.customer = :customerName" ); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; // 设置查询中的参数 <br />
&nbsp;&nbsp;&nbsp; query.setParameter( "myId", 2 ); <br />
&nbsp;&nbsp;&nbsp; query.setParameter( "customerName", "foo" ); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; <br />
<br />
注意不允许在同一个查询中使用两个相同名字的命名参数。 <br />
<br />
位置参数： <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; final Query query = entityManager.createQuery( "select o from Order o where o.id = ?1"); <br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; // 设置查询中的参数 <br />
&nbsp;&nbsp;&nbsp; query.setParameter( 1, 2 );// 1表示第一个参数，2是参数的值 <br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; //或者 <br />
&nbsp;&nbsp;&nbsp; final Query query = entityManager.createQuery( "select o from Order o where o.id = ?1").setParameter( 1, 2 ); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; // 可以使用多个参数 <br />
&nbsp;&nbsp;&nbsp; final Query query = entityManager.createQuery( "select o from Order o where o.id = ?1 and o.customer = ?2" ); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; // 设置查询中的参数 <br />
&nbsp;&nbsp;&nbsp; query.setParameter( 1, 2 ); <br />
&nbsp;&nbsp;&nbsp; query.setParameter( 2, "foo" ); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; <br />
<br />
如果在未来需要在不同的EJB3 运行环境中运行，请使用位置参数，保证应用是可移植的。 <br />
排序(order by) <br />
下面是一个简单查询的例子，可以看到和SQL的使用方法很类似。"ASC"和"DESC"分别为升序和降序，如果不显式注明，EJB3 QL中默认为asc升序。 <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; // 不注明的话，默认为asc为升序,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; final Query query = entityManager.createQuery( "select o from Order o order by o.id"); <br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; final Query query = entityManager.createQuery( "select o from Order o order by o.address.streetNumber desc");// desc为降序 <br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; final Query query = entityManager.createQuery( "select o from Order o order by o.id, o.address.streetNumber"); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; <br />
<br />
查询部分属性 <br />
在前面的例子中，都是对针对Entity类的查询，返回的也是被查询的Entity类的实体。EJB3 QL也允许我们直接查询返回我们需要的属性，而不是返回整个Entity。在一些Entity中属性特别多的情况，这样的查询可以提高性能。 <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; // 直接查询我们感兴趣的属性(列） <br />
&nbsp;&nbsp;&nbsp; final Query query = entityManager.createQuery( "select o.id, o.customerName, o.address.streetNumber from Order o order by o.id"); <br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; // 集合中的不再是Order,而是一个Object[]对象数组 <br />
&nbsp;&nbsp;&nbsp; final List result = query.getResultList(); <br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; // 第一个行 <br />
&nbsp;&nbsp;&nbsp; Object[] row = result.get( 0 ); <br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; // 数组中的第一个值是id <br />
&nbsp;&nbsp;&nbsp; int id = Integer.parseInt( row[0].toString() ); <br />
&nbsp;&nbsp;&nbsp; String customerName = row[1].toString(); <br />
&nbsp;&nbsp;&nbsp; String streetNumber = Integer.parseInt( row[2].toString() ); <br />
&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; <br />
<br />
查询中使用构造器(Constructor) <br />
EJB3 QL支持将查询的属性结果直接作为一个java class的构造器参数，并产生实体作为结果返回。 <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; // 我们把需要的三个属性作为一个class( OrderHolder )的构造器参数，并使用new函数。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; Query query = entityManager.createQuery("select new com.redsoft.ejb3.dummy.OrderHolder (&nbsp;&nbsp; o.id, o.vender, o.partNumber&nbsp; )&nbsp; FROM Order AS o"); <br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; // 集合中的结果是OrderHolder <br />
&nbsp;&nbsp;&nbsp; List result = query.getResultList(); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; <br />
<br />
该java class不需要是Entity Class。NEW要求java class使用全名。 <br />
聚合查询(Aggregation) <br />
<br />
象大部分的SQL一样,EJB3 QL也支持查询中的聚合函数。目前<span class="hilite1">EJB</span> QL支持的聚合函数包括： <br />
<br />
&nbsp;&nbsp;&nbsp; * AVG <br />
&nbsp;&nbsp;&nbsp; * SUM <br />
&nbsp;&nbsp;&nbsp; * COUNT <br />
&nbsp;&nbsp;&nbsp; * MAX <br />
&nbsp;&nbsp;&nbsp; * MIN <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; final Query query = entityManager.createQuery( "select MAX( o.id ) from Order where o.customerName='foo'"); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; // 如果我们知道结果是单个，我们可以用getSingleResult()获得结果 <br />
&nbsp;&nbsp;&nbsp; final Object result = query.getSingleResult(); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; // 由于Order中id的类型为long, <br />
&nbsp;&nbsp;&nbsp; final Long max = (Long)result; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; // 在一些数据库中max函数返回的结果的类型不一定于id对应的列的类型相符，更安全的方式可以采用string来转型 <br />
&nbsp;&nbsp;&nbsp; fina long max = Long.parseLong( result.toString() ); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
<br />
聚合函数也可以作为被查询的一个属性返回。 <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; // 返回所有的订单的生产厂商和他们的订单价值总额 <br />
&nbsp;&nbsp;&nbsp; final Query query <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = entityManager.createQuery( "select o.vender, sum(o.amount) FROM Order o　group by o.vender");"); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
<br />
和SQL一样，如果聚合函数不是select...from的唯一一个返回列，需要使用"GROUP BY"语句。"GROUP BY"应该包含select语句中除了聚合函数外的所有属性。 <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; // 返回所有的订单的生产厂商的的名字，货物号码和每种货物的订单价值总额 <br />
&nbsp;&nbsp;&nbsp; // 注意group by后面必须包含o.vender和o.partNumber <br />
&nbsp;&nbsp;&nbsp; final Query query <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = entityManager.createQuery( "select o.vender, o.partNumber, sum(o.amount) FROM Order o　group by o.vender，o.partNumber"); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
<br />
如果还需要加上查询条件，需要使用"HAVING"条件语句而不是"WHERE"语句。 <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; // 返回所有的订单的生产厂商是"foo"的货物号码和每种货物的订单价值总额 <br />
&nbsp;&nbsp;&nbsp; // 这里"having o.vender = 'foo'为条件 <br />
&nbsp;&nbsp;&nbsp; final Query query <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = entityManager.createQuery( "select o.vender, o.partNumber, sum(o.amount) FROM Order o　 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; group by o.vender，o.partNumber having o.vender='foo'"); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
<br />
在"HAVING"语句里可以跟"WHERE"语句一样使用参数。 <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; // 返回所有的订单的生产厂商是"foo"的货物号码和每种货物的订单价值总额 <br />
&nbsp;&nbsp;&nbsp; // 这里"having o.vender = 'foo'为条件 <br />
&nbsp;&nbsp;&nbsp; final Query query <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = entityManager.createQuery( "select o.vender, o.partNumber, sum(o.amount) FROM Order o　 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; group by o.vender，o.partNumber having o.vender=?1"); <br />
&nbsp;&nbsp;&nbsp; query.setParameter( 1, "foo" ); <br />
&nbsp;&nbsp;&nbsp; final List result = query.getResultList(); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
<br />
关联(join) <br />
<br />
在EJB3 QL中，大部分的情况下，使用对象属性都隐含了关联(join)。例如在以下查询中： <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; final Query query = entityManager.createQuery( "select o from Order o <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; where o.address.streetNumber=2000 order by o.id"); <br />
&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; <br />
<br />
当这个句EJB3 QL编译成以下的SQL时就会自动包含了关联,EJB3 QL编译成SQL时关联默认取左关联(left join)。 <br />
<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; select o.id, o.vender, o.partNumber, o.amount, addressTable.id, addressTable.streetNumber <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; from orderTable as o left join addressTable where addressTable.streetNumber = 2000 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; <br />
<br />
但在一些情况下，我们仍然需要对关联做精确的控制。因此EJB3 QL仍然支持和SQL中类似的关联语法： <br />
<br />
&nbsp;&nbsp;&nbsp; * left out join/left join <br />
&nbsp;&nbsp;&nbsp; * inner join <br />
&nbsp;&nbsp;&nbsp; * left join/inner join fetch <br />
<br />
left join, left out join等义，都是允许符合条件的右边表达式中的Entiies为空。 <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; // 返回所有地址为2000的Order纪录，不管Order中是否有OrderItem&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; final Query query = entityManager.createQuery( "select o from Order o <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; left join o.orderItems where o.address.streetNumber=2000 order by o.id"); <br />
&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; <br />
<br />
由于EJB3 QL默认采用left join。这样的查询和以下的EJB3 QL其实是等价的。 <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; // 返回所有地址为2000的Order纪录，不管Order中是否有OrderItem&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; final Query query = entityManager.createQuery( "select o from Order o <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; where o.address.streetNumber=2000 order by o.id"); <br />
&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; <br />
<br />
需要显式使用left join/left outer join的情况会比较少。 <br />
<br />
inner join要求右边的表达式必须返回Entities。 <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; // 返回所有地址为2000的Order纪录，Order中必须有OrderItem&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; final Query query = entityManager.createQuery( "select o from Order o <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; inner join o.orderItems where o.address.streetNumber=2000 order by o.id"); <br />
&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; <br />
<br />
left/left out/inner join fetch提供了一种灵活的查询加载方式来提高查询的性能。在默认的查询中，Entity中的集合属性默认不会被关联，集合属性默认是缓加载( lazy-load )。 <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
``` // 默认EJB3 QL编译后不关联集合属性变量(orderItems)对应的表&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; final Query query = entityManager.createQuery( "select o from Order o <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; inner join o.orderItems where o.address.streetNumber=2000 order by o.id"); <br />
&nbsp;&nbsp;&nbsp; final List result = query.getResultList(); <br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; // 这时获得Order实体中orderItems( 集合属性变量 )为空 <br />
&nbsp;&nbsp;&nbsp; final Order order = (Order)result.get( 0 ) <br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; // 当应用需要时，EJB3 Runtime才会执行一条SQL语句来加载属于当前Order的OrderItems <br />
&nbsp;&nbsp;&nbsp; Collection orderItems = order.getOrderItems(); <br />
&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; <br />
<br />
这样的查询性能上有不足的地方。为了查询N个Order，我们需要一条SQL语句获得所有的Order的原始/对象属性， 但需要另外N条语句获得每个Order的orderItems集合属性。为了避免N+1的性能问题，我们可以利用join fetch一次过用一条SQL语句把Order的所有信息查询出来。 <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; // 返回所有地址为2000的Order纪录，Order中必须有OrderItem&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; final Query query = entityManager.createQuery( "select o from Order o <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; inner join fetch o.orderItems where o.address.streetNumber=2000 order by o.id"); <br />
&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; <br />
<br />
由于使用了fetch,这个查询只会产生一条SQL语句，比原来需要N+1条SQL语句在性能上有了极大的提升。 <br />
比较Entity <br />
<br />
在查询中使用参数查询时，参数类型除了String, 原始数据类型( int, double等)和它们的对象类型( Integer, Double等),也可以是Entity的实例。 <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; final Query query = entityManager.createQuery( "select o from Order o where o.address = ?1 order by o.id"); <br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; final Address address = new Address( 2001, "foo street", "foo city", "foo province" ); <br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; // 直接把address对象作为参数。 <br />
&nbsp;&nbsp;&nbsp; query.setParameter( 1, address ); <br />
&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; <br />
<br />
批量更新(Batch Update) <br />
<br />
EJB3 QL支持批量更新。 <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp; Query query = managerNew.createQuery("update Order as o set o.vender=:newvender,&nbsp; o.partNumber='fooPart' where o.vender = 'foo'"); <br />
&nbsp;&nbsp; query.setParameter("newvender", "barVender"); <br />
&nbsp;&nbsp; <br />
&nbsp;&nbsp; // update的记录数 <br />
&nbsp;&nbsp; int result = query.executeUpdate(); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; <br />
<br />
批量删除(Batch Remove) <br />
<br />
EJB3 QL支持批量删除。 <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; Query query = managerNew.createQuery("DELETE FROM Order"); <br />
&nbsp;&nbsp;&nbsp; int result = query.executeUpdate(); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; Query query = managerNew.createQuery("DELETE FROM Order AS o WHERE o.vender='redsoft'"); <br />
&nbsp;&nbsp;&nbsp; int result = query.executeUpdate();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; <br />
<br />
使用操作符NOT <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; // 查询所有vender不等于"foo"的Order&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; Query query = managerNew.createQuery("SELECT FROM Order AS o WHERE not(o.vender='foo')"); <br />
&nbsp;&nbsp;&nbsp; List result = query.getResultList(); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; // 删除所有vender不等于"foo"的Order <br />
&nbsp;&nbsp;&nbsp; Query query = managerNew.createQuery("DELETE FROM Order AS o WHERE not(o.vender='foo')"); <br />
&nbsp;&nbsp;&nbsp; int result = query.executeUpdate();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; <br />
<br />
使用操作符BETWEEN <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; // 查询所有价值amount在５和10之间的(包含5,10)的Order&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; Query query = managerNew.createQuery("select o FROM Order AS o left join o.orderItems ot where o.amount BETWEEN 5 AND 10 order by o.vender desc"); <br />
&nbsp;&nbsp;&nbsp; List result = query.getResultList(); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; <br />
<br />
使用操作符IN <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; // 查询所有vender是"foo1", "foo2"或者"foo3"的Order&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; Query query = managerNew.createQuery("select o FROM Order AS o left join o.orderItems ot where o.vender in ( 'foo1', 'foo2', 'foo3' ) order by o.vender desc"); <br />
&nbsp;&nbsp;&nbsp; List result = query.getResultList(); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; <br />
<br />
使用操作符LIKE <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; // 查询所有vender以字符串"foo"开头的Order&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; Query query = managerNew.createQuery("select o FROM Order as o where o.vender like 'foo%' order by o.vender desc"); <br />
&nbsp;&nbsp;&nbsp; List result = query.getResultList(); <br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; // 查询所有vender以字符串"foo"结尾的Order&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; Query query = managerNew.createQuery("select o FROM Order as o where o.vender like '%foo' order by o.vender desc"); <br />
&nbsp;&nbsp;&nbsp; List result = query.getResultList(); <br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; // 可以结合NOT一起使用，比如查询所有vender不以以字符串"foo"结尾的Order&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; Query query = managerNew.createQuery("select o FROM Order as o where o.vender not like '%foo' order by o.vender desc"); <br />
&nbsp;&nbsp;&nbsp; List result = query.getResultList(); <br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; // 可以结合escape使用，比如查询所有vender以"foo"开始的Order并忽略'3'字符。 <br />
&nbsp;&nbsp;&nbsp; // 如果vender是"foo1", "foo2", "foo3"符合这个条件, 另外"3foo1", "f3oo4"也符合条件。 <br />
&nbsp;&nbsp;&nbsp; Query query = managerNew.createQuery("select o FROM Order as o where o.vender like '%foo' escape '3' order by o.vender desc"); <br />
&nbsp;&nbsp;&nbsp; List result = query.getResultList(); <br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; <br />
<br />
使用操作符IS NULL <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; // 查询所有没有地址的Order&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; Query query = managerNew.createQuery("select o FROM Order as o where o.address is null"); <br />
&nbsp;&nbsp;&nbsp; List result = query.getResultList(); <br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; // 查询所有地址非空的Order <br />
&nbsp;&nbsp;&nbsp; Query query = managerNew.createQuery("select o FROM Order as o where o.address is not null"); <br />
&nbsp;&nbsp;&nbsp; List result = query.getResultList(); <br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; <br />
<br />
使用操作符IS EMPTY <br />
<br />
IS EMPTY是针对集合属性(Collection)的操作符。可以和NOT一起使用。 <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; // 查询orderItems集合为空的Order&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; Query query = managerNew.createQuery("select o FROM Order o where o.orderItems is empty by o.vender desc"); <br />
&nbsp;&nbsp;&nbsp; List result = query.getResultList(); <br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp; // 查询orderItems集合非空的Order&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; Query query = managerNew.createQuery("select o FROM Order o where o.orderItems is not empty by o.vender desc"); <br />
&nbsp;&nbsp;&nbsp; List result = query.getResultList();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; <br />
<br />
使用操作符EXISTS <br />
<br />
[NOT]EXISTS需要和子查询配合使用。 <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; Query query = manager.createQuery("select o FROM Order o where exists (select o from Order o where o.partNumber=?1) order by o.vender desc"); <br />
&nbsp;&nbsp;&nbsp; query.setParameter(1, "partNumber"); <br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; Query query = manager.createQuery("select o FROM Order o where o.vender='partNumber' and not exists (select o from Order o where o.partNumber=?1) order by o.vender desc"); <br />
&nbsp;&nbsp;&nbsp; query.setParameter(1, "partNumber"); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; <br />
<br />
使用操作符ALL/SOME/ANY <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; Query query = managerNew.createQuery("select emp from EmployeeA emp where emp.salary &gt; all ( select m.salary from Manager m where m.department = emp.department)"); <br />
&nbsp;&nbsp;&nbsp; List result = query.getResultList(); <br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; Query query = managerNew.createQuery("select emp from EmployeeA emp where emp.salary &gt; any ( select m.salary from Manager m where m.department = emp.department)"); <br />
&nbsp;&nbsp;&nbsp; List result = query.getResultList(); <br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; Query query = managerNew.createQuery("select emp from EmployeeA emp where emp.salary &gt; some ( select m.salary from Manager m where m.department = emp.department)"); <br />
&nbsp;&nbsp;&nbsp; List result = query.getResultList(); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; <br />
<br />
字符串函数 <br />
<br />
EJB3 QL定义了内置函数方便使用。这些函数的使用方法和SQL中相应的函数方法类似。EJB3 QL中定义的字符串函数包括： <br />
<br />
&nbsp;&nbsp;&nbsp; * CONCAT　字符串拼接 <br />
&nbsp;&nbsp;&nbsp; * SUBSTRING　字符串截取 <br />
&nbsp;&nbsp;&nbsp; * TRIM 去掉空格 <br />
&nbsp;&nbsp;&nbsp; * LOWER　转换成小写 <br />
&nbsp;&nbsp;&nbsp; * UPPER　装换成大写 <br />
&nbsp;&nbsp;&nbsp; * LENGTH 字符串长度 <br />
&nbsp;&nbsp;&nbsp; * LOCATE 字符串定位 <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; // concat将参数中的两个字符串并结成一个字符串,这里firstName是"foo", lastName是"bar" <br />
&nbsp;&nbsp;&nbsp; Query query = entityManager.createQuery("select concat( o.owner.firstName, o.owner.lastName ) FROM Order AS o left outer join o.orderItems as oi where o.owner.firstName='foo'"); <br />
&nbsp;&nbsp;&nbsp; List result = query.getResultList(); <br />
&nbsp;&nbsp;&nbsp; assertEquals("foobar", result.get(0).toString()); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; // firstName是"fooBar",结果应该返回"oo" <br />
&nbsp;&nbsp;&nbsp; Query query = entityManager.createQuery("select o.vender,substring( o.owner.firstName, 1, 3 ), o.owner.info.age FROM Order AS o left outer join o.orderItems as oi where o.owner.firstName='charles'"); <br />
&nbsp;&nbsp;&nbsp; List result = query.getResultList(); <br />
&nbsp;&nbsp;&nbsp; Object[] row1 = (Object[]) result.get(0); <br />
&nbsp;&nbsp;&nbsp; assertEquals("oo", row1[1].toString()); <br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; // 获得"ar"在firstName中地起始位置 <br />
&nbsp;&nbsp;&nbsp; Query query = managerNew.createQuery("SELECT emp.firstName , emp.salary , locate( emp.firstName, 'ar') FROM EmployeeA as emp where emp.firstName='charles1111'"); <br />
&nbsp;&nbsp;&nbsp; List result = query.getResultList(); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; <br />
<br />
计算函数 <br />
<br />
EJB3 QL中定义的计算函数包括： <br />
<br />
&nbsp;&nbsp;&nbsp; * ABS　绝对值 <br />
&nbsp;&nbsp;&nbsp; * SQRT 平方根 <br />
&nbsp;&nbsp;&nbsp; * MOD 取余数 <br />
&nbsp;&nbsp;&nbsp; * SIZE 取集合的数量 <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; Query query = entityManager.createQuery("select o.vender, size( o.orderItems ) FROM Order o&nbsp; where o.owner.firstName = 'charles' group by o.vender order by o.vender desc"); <br />
&nbsp;&nbsp;&nbsp; List result = query.getResultList(); <br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; // 函数也可以用在条件中 <br />
&nbsp;&nbsp;&nbsp; Query query = managerNew.createQuery("select o.vender, sum(o.amount) FROM Order AS o left join o.orderItems ot group by o.vender having size(o.orderItems) = 0 or lower( o.vender ) = 'foo' order by o.vender desc"); <br />
&nbsp;&nbsp;&nbsp; List result = query.getResultList(); <br />
<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; // 取余数 <br />
&nbsp;&nbsp;&nbsp; Query query = managerNew.createQuery("select mod( o.owner.info.age, 10 ) FROM Order o where exists ( select o from Order o where o.partNumber= :name ) and o.vender='order1' and exists ( select o from Order o where o.amount= :name1 ) order by o.vender desc"); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; <br />
<br />
子查询 <br />
<br />
子查询可以用于WHERE和HAVING条件语句中。 <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; Query query = managerNew.createQuery("select emp from EmployeeA as emp where ( select count(m) from Manager as m where m.department = emp.department) &gt; 0 "); <br />
&nbsp;&nbsp;&nbsp; List result = query.getResultList();&nbsp;&nbsp; <br />
<img src ="http://www.blogjava.net/luluyanglu/aggbug/298924.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/luluyanglu/" target="_blank">大鱼</a> 2009-10-20 09:09 <a href="http://www.blogjava.net/luluyanglu/archive/2009/10/20/298924.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>EJB调用存储过程</title><link>http://www.blogjava.net/luluyanglu/archive/2009/09/24/296318.html</link><dc:creator>大鱼</dc:creator><author>大鱼</author><pubDate>Thu, 24 Sep 2009 09:28:00 GMT</pubDate><guid>http://www.blogjava.net/luluyanglu/archive/2009/09/24/296318.html</guid><wfw:comment>http://www.blogjava.net/luluyanglu/comments/296318.html</wfw:comment><comments>http://www.blogjava.net/luluyanglu/archive/2009/09/24/296318.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/luluyanglu/comments/commentRss/296318.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/luluyanglu/services/trackbacks/296318.html</trackback:ping><description><![CDATA[<font color="#0000ff"><font color="#000000"><font color="#ff0000"><font color="#000000"><strong><font color="#3366ff">EJB调用存储过程</font><br />
&nbsp;&nbsp;&nbsp;&nbsp; </strong>要调用存储过程，我们可以通过EntityManager 对象的createNativeQuery()方法执行SQL 语句(<font color="#0000ff">注意：这里说的是SQL 语句，不是EJB3 QL</font>), 调用存储过程的SQL 格式如下：<br />
&nbsp;&nbsp;&nbsp;&nbsp; {call 存储过程名称(参数1, 参数2, &#8230; )}<br />
</font></font></font></font><font color="#0000ff"><font color="#000000"><font color="#ff0000"><font color="#000000">&nbsp;&nbsp;&nbsp;&nbsp; </font></font></font></font><font color="#0000ff"><font color="#000000"><font color="#ff0000"><font color="#000000">在EJB3 中你可以调用的存储过程有两种<br />
</font></font></font></font><font color="#0000ff"><font color="#000000"><font color="#ff0000"><font color="#000000">&nbsp;&nbsp;&nbsp;&nbsp; </font></font></font></font><font color="#0000ff"><font color="#000000"><font color="#ff0000"><font color="#000000"><font color="#ff0000">1．无返回值的存储过程。</font><br />
</font></font></font></font><font color="#0000ff"><font color="#000000"><font color="#ff0000"><font color="#000000">&nbsp;&nbsp;&nbsp;&nbsp; </font></font></font></font><font color="#ff0000">2．返回值为ResultSet（以select 形式返回的值）的存储过程，EJB3 不能调用以OUT 参数返回值的存储过程<br />
<br />
<font color="#000000">1.调用无返回值的存储过程<br />
&nbsp;&nbsp; //调用无返回参数的存储过程<br />
&nbsp;&nbsp; Query query = em.createNativeQuery("{call Procedure()}");<br />
&nbsp;&nbsp; query.executeUpdate();<br />
<br />
2.调用返回单值的存储过程<br />
</font>&nbsp;&nbsp; <font color="#000000">//调用返回单个值的存储过程<br />
&nbsp;&nbsp; Query query = em.createNativeQuery("{call GetPersonName(?)}");<br />
&nbsp;&nbsp; query.setParameter(1, new Integer(1));<br />
&nbsp;&nbsp; String result = query.getSingleResult().toString();<br />
<br />
3.调用返回表全部列的存储过程<br />
&nbsp;&nbsp; 在调用存储过程时,可以让EJB3 Persistence 运行环境将列值直接填充入一个Entity 的实例（本例填充进Person 对象），并将实例作为结果返回<br />
&nbsp;&nbsp; //调用返回Person 全部列的存储过程<br />
&nbsp;&nbsp; Query query = em.createNativeQuery("{call GetPersonList()}", Person.class);<br />
&nbsp;&nbsp; List result = query.getResultList();<br />
存储过程</font></font><font color="#ff0000"><font color="#000000">GetPersonList:<br />
&nbsp;&nbsp; <font color="#0000ff">CREATE PROCEDURE `GetPersonList`()<br />
&nbsp;&nbsp; NOT DETERMINISTIC<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SQL SECURITY DEFINER<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; COMMENT ''<br />
&nbsp;&nbsp;&nbsp; BEGIN<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; select * from person;<br />
&nbsp;&nbsp;&nbsp; END;</font></font></font><font color="#ff0000"><br />
<br />
<font color="#000000">4.调用返回部分列的存储过程<br />
&nbsp;&nbsp; 创建存储过程:<br />
&nbsp;&nbsp; <font color="#0000ff">CREATE PROCEDURE `GetPersonPartProperties`()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NOT DETERMINISTICSQL SECURITY DEFINER<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; COMMENT ''<br />
&nbsp;&nbsp; BEGIN<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SELECT personid, personname from person;<br />
&nbsp;&nbsp; END;</font><br />
&nbsp;&nbsp; //调用返回部分列的存储过程<br />
&nbsp;&nbsp; Query query = em.createNativeQuery("{call GetPersonPartProperties()}");<br />
&nbsp;&nbsp; List result = query.getResultList();<br />
</font></font>
<img src ="http://www.blogjava.net/luluyanglu/aggbug/296318.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/luluyanglu/" target="_blank">大鱼</a> 2009-09-24 17:28 <a href="http://www.blogjava.net/luluyanglu/archive/2009/09/24/296318.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>EJB3常见异常及解决</title><link>http://www.blogjava.net/luluyanglu/archive/2009/03/16/260118.html</link><dc:creator>大鱼</dc:creator><author>大鱼</author><pubDate>Mon, 16 Mar 2009 14:22:00 GMT</pubDate><guid>http://www.blogjava.net/luluyanglu/archive/2009/03/16/260118.html</guid><wfw:comment>http://www.blogjava.net/luluyanglu/comments/260118.html</wfw:comment><comments>http://www.blogjava.net/luluyanglu/archive/2009/03/16/260118.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/luluyanglu/comments/commentRss/260118.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/luluyanglu/services/trackbacks/260118.html</trackback:ping><description><![CDATA[<p>缺少StandAlone的三个Jar包</p>
<p>customer Bill Burker<br />
Exception in thread "main" java.lang.NoClassDefFoundError: Lorg/jboss/invocation/Invoker;<br />
&nbsp;at java.lang.Class.getDeclaredFields0(Native Method)<br />
&nbsp;at java.lang.Class.privateGetDeclaredFields(Unknown Source)<br />
&nbsp;at java.lang.Class.getDeclaredField(Unknown Source)<br />
&nbsp;at java.io.ObjectStreamClass.getDeclaredSUID(Unknown Source)<br />
&nbsp;at java.io.ObjectStreamClass.access$700(Unknown Source)<br />
&nbsp;at java.io.ObjectStreamClass$2.run(Unknown Source)<br />
&nbsp;at java.security.AccessController.doPrivileged(Native Method)<br />
&nbsp;at java.io.ObjectStreamClass.&lt;init&gt;(Unknown Source)<br />
&nbsp;at java.io.ObjectStreamClass.lookup(Unknown Source)<br />
&nbsp;at java.io.ObjectStreamClass.initNonProxy(Unknown Source)<br />
&nbsp;at java.io.ObjectInputStream.readNonProxyDesc(Unknown Source)<br />
&nbsp;at java.io.ObjectInputStream.readClassDesc(Unknown Source)<br />
&nbsp;at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)<br />
&nbsp;at java.io.ObjectInputStream.readObject0(Unknown Source)<br />
&nbsp;at java.io.ObjectInputStream.defaultReadFields(Unknown Source)<br />
&nbsp;at java.io.ObjectInputStream.readSerialData(Unknown Source)<br />
&nbsp;at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)<br />
&nbsp;at java.io.ObjectInputStream.readObject0(Unknown Source)<br />
&nbsp;at java.io.ObjectInputStream.defaultReadFields(Unknown Source)<br />
&nbsp;at java.io.ObjectInputStream.readSerialData(Unknown Source)<br />
&nbsp;at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)<br />
&nbsp;at java.io.ObjectInputStream.readObject0(Unknown Source)<br />
&nbsp;at java.io.ObjectInputStream.readObject(Unknown Source)<br />
&nbsp;at org.jboss.aop.joinpoint.InvocationResponse.readExternal(InvocationResponse.java:107)<br />
&nbsp;at java.io.ObjectInputStream.readExternalData(Unknown Source)<br />
&nbsp;at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)<br />
&nbsp;at java.io.ObjectInputStream.readObject0(Unknown Source)<br />
&nbsp;at java.io.ObjectInputStream.defaultReadFields(Unknown Source)<br />
&nbsp;at java.io.ObjectInputStream.readSerialData(Unknown Source)<br />
&nbsp;at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)<br />
&nbsp;at java.io.ObjectInputStream.readObject0(Unknown Source)<br />
&nbsp;at java.io.ObjectInputStream.readObject(Unknown Source)<br />
&nbsp;at org.jboss.remoting.serialization.impl.java.JavaSerializationManager.receiveObject(JavaSerializationManager.java:128)<br />
&nbsp;at org.jboss.remoting.marshal.serializable.SerializableUnMarshaller.read(SerializableUnMarshaller.java:66)<br />
&nbsp;at org.jboss.remoting.transport.socket.SocketClientInvoker.transport(SocketClientInvoker.java:279)<br />
&nbsp;at org.jboss.remoting.RemoteClientInvoker.invoke(RemoteClientInvoker.java:143)<br />
&nbsp;at org.jboss.remoting.Client.invoke(Client.java:525)<br />
&nbsp;at org.jboss.remoting.Client.invoke(Client.java:488)<br />
&nbsp;at org.jboss.aspects.remoting.InvokeRemoteInterceptor.invoke(InvokeRemoteInterceptor.java:41)<br />
&nbsp;at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:88)<br />
&nbsp;at org.jboss.aspects.remoting.IsLocalInterceptor.invoke(IsLocalInterceptor.java:34)<br />
&nbsp;at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:88)<br />
&nbsp;at org.jboss.aspects.remoting.PojiProxy.invoke(PojiProxy.java:46)<br />
&nbsp;at $Proxy1.createProxy(Unknown Source)<br />
&nbsp;at org.jboss.ejb3.JndiProxyFactory.getObjectInstance(JndiProxyFactory.java:52)<br />
&nbsp;at javax.naming.spi.NamingManager.getObjectInstance(Unknown Source)<br />
&nbsp;at org.jnp.interfaces.NamingContext.getObjectInstance(NamingContext.java:1125)<br />
&nbsp;at org.jnp.interfaces.NamingContext.getObjectInstanceWrapFailure(NamingContext.java:1142)<br />
&nbsp;at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:705)<br />
&nbsp;at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:587)<br />
&nbsp;at javax.naming.InitialContext.lookup(Unknown Source)<br />
&nbsp;at com.lyh.ejb3.clients.TravelAgentShell.getAgent(TravelAgentShell.java:46)<br />
&nbsp;at com.lyh.ejb3.clients.TravelAgentShell.customer(TravelAgentShell.java:156)<br />
&nbsp;at com.lyh.ejb3.clients.TravelAgentShell.processCommand(TravelAgentShell.java:115)<br />
&nbsp;at com.lyh.ejb3.clients.TravelAgentShell.shell(TravelAgentShell.java:83)<br />
&nbsp;at com.lyh.ejb3.clients.TravelAgentShell.main(TravelAgentShell.java:36)</p>
<p>&nbsp;</p>
<p><br />
Hibernate EntityManager 文档描述如下:<br />
If no persistence.xml with the correct<br />
name are found or if the expected persistence provider is not found, a PersistenceException is raised.</p>
<p>数据库没有启动时会出现如下异常,persistence.xml配置错误也会出现,如帐户，密码错误<br />
Exception in thread "main" javax.persistence.PersistenceException: org.hibernate.HibernateException: Hibernate Dialect must be explicitly set<br />
&nbsp;at org.hibernate.ejb.Ejb3Configuration.createEntityManagerFactory(Ejb3Configuration.java:217)<br />
&nbsp;at org.hibernate.ejb.HibernatePersistence.createEntityManagerFactory(HibernatePersistence.java:114)<br />
&nbsp;at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:37)<br />
&nbsp;at com.titan.clients.StandaloneClient.main(StandaloneClient.java:16)<br />
Caused by: org.hibernate.HibernateException: Hibernate Dialect must be explicitly set<br />
&nbsp;at org.hibernate.dialect.DialectFactory.determineDialect(DialectFactory.java:57)<br />
&nbsp;at org.hibernate.dialect.DialectFactory.buildDialect(DialectFactory.java:39)<br />
&nbsp;at org.hibernate.cfg.SettingsFactory.determineDialect(SettingsFactory.java:397)<br />
&nbsp;at org.hibernate.cfg.SettingsFactory.buildSettings(SettingsFactory.java:111)<br />
&nbsp;at org.hibernate.cfg.Configuration.buildSettings(Configuration.java:1928)<br />
&nbsp;at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1211)<br />
&nbsp;at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:631)<br />
&nbsp;at org.hibernate.ejb.Ejb3Configuration.createEntityManagerFactory(Ejb3Configuration.java:760)<br />
&nbsp;at org.hibernate.ejb.Ejb3Configuration.createFactory(Ejb3Configuration.java:151)<br />
&nbsp;at org.hibernate.ejb.Ejb3Configuration.createEntityManagerFactory(Ejb3Configuration.java:205)<br />
&nbsp;... 3 more<br />
加入JBOSS的jboss-EJB-3.0_Embeddable_ALPHA_8中的jar包即可<br />
Exception in thread "main" javax.persistence.PersistenceException: No Persistence provider for EntityManager named titan<br />
&nbsp;at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:41)<br />
&nbsp;at com.lyh.ejb3.clients.StandaloneClient.main(StandaloneClient.java:21)</p>
<p>&nbsp;</p>
<p><br />
&nbsp;在数据库中插入字段，并抛出异常<br />
&nbsp;public Integer getId() {<br />
&nbsp; return this.id;<br />
&nbsp;}<br />
&nbsp;@Id<br />
&nbsp;@GeneratedValue(strategy=GenerationType.AUTO)<br />
&nbsp;public void setId(Integer id) {<br />
&nbsp; this.id = id;<br />
&nbsp;}</p>
<p><br />
文章出处：DIY部落(http://www.diybl.com/course/1_web/webjs/20071021/79030_6.html)</p>
<img src ="http://www.blogjava.net/luluyanglu/aggbug/260118.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/luluyanglu/" target="_blank">大鱼</a> 2009-03-16 22:22 <a href="http://www.blogjava.net/luluyanglu/archive/2009/03/16/260118.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>org.hibernate.MappingException: Could not determine type for: java.util.Collection, for columns: [org.hibernate.mapping.Column(lineItems)]</title><link>http://www.blogjava.net/luluyanglu/archive/2009/03/16/260117.html</link><dc:creator>大鱼</dc:creator><author>大鱼</author><pubDate>Mon, 16 Mar 2009 14:21:00 GMT</pubDate><guid>http://www.blogjava.net/luluyanglu/archive/2009/03/16/260117.html</guid><wfw:comment>http://www.blogjava.net/luluyanglu/comments/260117.html</wfw:comment><comments>http://www.blogjava.net/luluyanglu/archive/2009/03/16/260117.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/luluyanglu/comments/commentRss/260117.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/luluyanglu/services/trackbacks/260117.html</trackback:ping><description><![CDATA[<strong>
<p style="font-size: 15pt" align="center"><strong>org.hibernate.MappingException: Could not determine type for: java.util.Collection, for columns: [org.hibernate.mapping.Column(lineItems)]</strong></p>
<p style="font-size: 15pt" align="center"><strong>错误解决方案</strong></p>
<p style="font-size: 15pt" align="center"><strong></strong>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">近日在运行一个EJB3 Entity实例（一对多关系）时总遇到如下异常，久试不能修复。</font></p>
<p>javax.persistence.PersistenceException: org.hibernate.MappingException: Could not determine type for: java.util.Collection, for columns: [org.hibernate.mapping.Column(lineItems)]<br />
&nbsp;at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:720)<br />
&nbsp;at org.hibernate.ejb.HibernatePersistence.createContainerEntityManagerFactory(HibernatePersistence.java:127)<br />
&nbsp;at org.jboss.ejb3.entity.PersistenceUnitDeployment.start(PersistenceUnitDeployment.java:246)<br />
&nbsp;at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)<br />
&nbsp;at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)<br />
&nbsp;at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)<br />
&nbsp;at java.lang.reflect.Method.invoke(Method.java:585)<br />
&nbsp;at org.jboss.ejb3.ServiceDelegateWrapper.startService(ServiceDelegateWrapper.java:103)<br />
&nbsp;at org.jboss.system.ServiceMBeanSupport.jbossInternalStart(ServiceMBeanSupport.java:289)<br />
&nbsp;at org.jboss.system.ServiceMBeanSupport.jbossInternalLifecycle(ServiceMBeanSupport.java:245)<br />
&nbsp;at sun.reflect.GeneratedMethodAccessor25.invoke(Unknown Source)<br />
&nbsp;at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)<br />
&nbsp;at java.lang.reflect.Method.invoke(Method.java:585)<br />
&nbsp;at org.jboss.mx.interceptor.ReflectedDispatcher.invoke(ReflectedDispatcher.java:155)<br />
&nbsp;at org.jboss.mx.server.Invocation.dispatch(Invocation.java:94)<br />
&nbsp;at org.jboss.mx.server.Invocation.invoke(Invocation.java:86)<br />
&nbsp;at org.jboss.mx.server.AbstractMBeanInvoker.invoke(AbstractMBeanInvoker.java:264)<br />
&nbsp;at org.jboss.mx.server.MBeanServerImpl.invoke(MBeanServerImpl.java:659)<br />
&nbsp;at org.jboss.system.ServiceController$ServiceProxy.invoke(ServiceController.java:978)<br />
&nbsp;at $Proxy0.start(Unknown Source)<br />
&nbsp;at org.jboss.system.ServiceController.start(ServiceController.java:417)<br />
&nbsp;at sun.reflect.GeneratedMethodAccessor9.invoke(Unknown Source)<br />
&nbsp;at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)<br />
&nbsp;at java.lang.reflect.Method.invoke(Method.java:585)<br />
&nbsp;at org.jboss.mx.interceptor.ReflectedDispatcher.invoke(ReflectedDispatcher.java:155)<br />
&nbsp;at org.jboss.mx.server.Invocation.dispatch(Invocation.java:94)<br />
&nbsp;at org.jboss.mx.server.Invocation.invoke(Invocation.java:86)<br />
&nbsp;at org.jboss.mx.server.AbstractMBeanInvoker.invoke(AbstractMBeanInvoker.java:264)<br />
&nbsp;at org.jboss.mx.server.MBeanServerImpl.invoke(MBeanServerImpl.java:659)<br />
&nbsp;at org.jboss.mx.util.MBeanProxyExt.invoke(MBeanProxyExt.java:210)<br />
&nbsp;at $Proxy69.start(Unknown Source)<br />
&nbsp;at org.jboss.ejb3.JmxKernelAbstraction.install(JmxKernelAbstraction.java:120)<br />
&nbsp;at org.jboss.ejb3.Ejb3Deployment.startPersistenceUnits(Ejb3Deployment.java:627)<br />
&nbsp;at org.jboss.ejb3.Ejb3Deployment.start(Ejb3Deployment.java:351)<br />
&nbsp;at org.jboss.ejb3.Ejb3Module.startService(Ejb3Module.java:91)<br />
&nbsp;at org.jboss.system.ServiceMBeanSupport.jbossInternalStart(ServiceMBeanSupport.java:289)<br />
&nbsp;at org.jboss.system.ServiceMBeanSupport.jbossInternalLifecycle(ServiceMBeanSupport.java:245)<br />
&nbsp;at sun.reflect.GeneratedMethodAccessor25.invoke(Unknown Source)<br />
&nbsp;at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)<br />
&nbsp;at java.lang.reflect.Method.invoke(Method.java:585)<br />
&nbsp;at org.jboss.mx.interceptor.ReflectedDispatcher.invoke(ReflectedDispatcher.java:155)<br />
&nbsp;at org.jboss.mx.server.Invocation.dispatch(Invocation.java:94)<br />
&nbsp;at org.jboss.mx.server.Invocation.invoke(Invocation.java:86)<br />
&nbsp;at org.jboss.mx.server.AbstractMBeanInvoker.invoke(AbstractMBeanInvoker.java:264)<br />
&nbsp;at org.jboss.mx.server.MBeanServerImpl.invoke(MBeanServerImpl.java:659)<br />
&nbsp;at org.jboss.system.ServiceController$ServiceProxy.invoke(ServiceController.java:978)<br />
&nbsp;at $Proxy0.start(Unknown Source)<br />
&nbsp;at org.jboss.system.ServiceController.start(ServiceController.java:417)<br />
&nbsp;at sun.reflect.GeneratedMethodAccessor9.invoke(Unknown Source)<br />
&nbsp;at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)<br />
&nbsp;at java.lang.reflect.Method.invoke(Method.java:585)<br />
&nbsp;at org.jboss.mx.interceptor.ReflectedDispatcher.invoke(ReflectedDispatcher.java:155)<br />
&nbsp;at org.jboss.mx.server.Invocation.dispatch(Invocation.java:94)<br />
&nbsp;at org.jboss.mx.server.Invocation.invoke(Invocation.java:86)<br />
&nbsp;at org.jboss.mx.server.AbstractMBeanInvoker.invoke(AbstractMBeanInvoker.java:264)<br />
&nbsp;at org.jboss.mx.server.MBeanServerImpl.invoke(MBeanServerImpl.java:659)<br />
&nbsp;at org.jboss.mx.util.MBeanProxyExt.invoke(MBeanProxyExt.java:210)<br />
&nbsp;at $Proxy33.start(Unknown Source)<br />
&nbsp;at org.jboss.ejb3.EJB3Deployer.start(EJB3Deployer.java:512)<br />
&nbsp;at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)<br />
&nbsp;at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)<br />
&nbsp;at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)<br />
&nbsp;at java.lang.reflect.Method.invoke(Method.java:585)<br />
&nbsp;at org.jboss.mx.interceptor.ReflectedDispatcher.invoke(ReflectedDispatcher.java:155)<br />
&nbsp;at org.jboss.mx.server.Invocation.dispatch(Invocation.java:94)<br />
&nbsp;at org.jboss.mx.interceptor.AbstractInterceptor.invoke(AbstractInterceptor.java:133)<br />
&nbsp;at org.jboss.mx.server.Invocation.invoke(Invocation.java:88)<br />
&nbsp;at org.jboss.mx.interceptor.ModelMBeanOperationInterceptor.invoke(ModelMBeanOperationInterceptor.java:142)<br />
&nbsp;at org.jboss.mx.interceptor.DynamicInterceptor.invoke(DynamicInterceptor.java:97)<br />
&nbsp;at org.jboss.system.InterceptorServiceMBeanSupport.invokeNext(InterceptorServiceMBeanSupport.java:238)<br />
&nbsp;at org.jboss.wsf.container.jboss42.DeployerInterceptor.start(DeployerInterceptor.java:87)<br />
&nbsp;at org.jboss.deployment.SubDeployerInterceptorSupport$XMBeanInterceptor.start(SubDeployerInterceptorSupport.java:188)<br />
&nbsp;at org.jboss.deployment.SubDeployerInterceptor.invoke(SubDeployerInterceptor.java:95)<br />
&nbsp;at org.jboss.mx.server.Invocation.invoke(Invocation.java:88)<br />
&nbsp;at org.jboss.mx.server.AbstractMBeanInvoker.invoke(AbstractMBeanInvoker.java:264)<br />
&nbsp;at org.jboss.mx.server.MBeanServerImpl.invoke(MBeanServerImpl.java:659)<br />
&nbsp;at org.jboss.mx.util.MBeanProxyExt.invoke(MBeanProxyExt.java:210)<br />
&nbsp;at $Proxy34.start(Unknown Source)<br />
&nbsp;at org.jboss.deployment.MainDeployer.start(MainDeployer.java:1025)<br />
&nbsp;at org.jboss.deployment.MainDeployer.deploy(MainDeployer.java:819)<br />
&nbsp;at org.jboss.deployment.MainDeployer.deploy(MainDeployer.java:782)<br />
&nbsp;at sun.reflect.GeneratedMethodAccessor26.invoke(Unknown Source)<br />
&nbsp;at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)<br />
&nbsp;at java.lang.reflect.Method.invoke(Method.java:585)<br />
&nbsp;at org.jboss.mx.interceptor.ReflectedDispatcher.invoke(ReflectedDispatcher.java:155)<br />
&nbsp;at org.jboss.mx.server.Invocation.dispatch(Invocation.java:94)<br />
&nbsp;at org.jboss.mx.interceptor.AbstractInterceptor.invoke(AbstractInterceptor.java:133)<br />
&nbsp;at org.jboss.mx.server.Invocation.invoke(Invocation.java:88)<br />
&nbsp;at org.jboss.mx.interceptor.ModelMBeanOperationInterceptor.invoke(ModelMBeanOperationInterceptor.java:142)<br />
&nbsp;at org.jboss.mx.server.Invocation.invoke(Invocation.java:88)<br />
&nbsp;at org.jboss.mx.server.AbstractMBeanInvoker.invoke(AbstractMBeanInvoker.java:264)<br />
&nbsp;at org.jboss.mx.server.MBeanServerImpl.invoke(MBeanServerImpl.java:659)<br />
&nbsp;at org.jboss.mx.util.MBeanProxyExt.invoke(MBeanProxyExt.java:210)<br />
&nbsp;at $Proxy9.deploy(Unknown Source)<br />
&nbsp;at org.jboss.deployment.scanner.URLDeploymentScanner.deploy(URLDeploymentScanner.java:421)<br />
&nbsp;at org.jboss.deployment.scanner.URLDeploymentScanner.scan(URLDeploymentScanner.java:634)<br />
&nbsp;at org.jboss.deployment.scanner.AbstractDeploymentScanner$ScannerThread.doScan(AbstractDeploymentScanner.java:263)<br />
&nbsp;at org.jboss.deployment.scanner.AbstractDeploymentScanner$ScannerThread.loop(AbstractDeploymentScanner.java:274)<br />
&nbsp;at org.jboss.deployment.scanner.AbstractDeploymentScanner$ScannerThread.run(AbstractDeploymentScanner.java:225)<br />
Caused by: org.hibernate.MappingException: Could not determine type for: java.util.Collection, for columns: [org.hibernate.mapping.Column(lineItems)]<br />
&nbsp;at org.hibernate.mapping.SimpleValue.getType(SimpleValue.java:266)<br />
&nbsp;at org.hibernate.mapping.SimpleValue.isValid(SimpleValue.java:253)<br />
&nbsp;at org.hibernate.mapping.Property.isValid(Property.java:185)<br />
&nbsp;at org.hibernate.mapping.PersistentClass.validate(PersistentClass.java:440)<br />
&nbsp;at org.hibernate.mapping.RootClass.validate(RootClass.java:192)<br />
&nbsp;at org.hibernate.cfg.Configuration.validate(Configuration.java:1102)<br />
&nbsp;at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1287)<br />
&nbsp;at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:713)</p>
<p>-----------------------------------------------------------------------------------------------------------------------------------------------------------------</p>
<p><font color="#0000ff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;通过google查找问题原因时发现是Hibenate的一个bug（外文网站上是这么说的，我并不认为是Hibernate的原因）。需要把</font></p>
<p><font color="#0000ff">&nbsp;&nbsp;&nbsp; &nbsp;@Id<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@Column(name = "ID")</font></p>
<p><font color="#0000ff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;写到public int getId()&nbsp;{return this.id;&nbsp;}方法的上面。不能像书中例子那样写在private int id;的上面。</font></p>
</strong>
<img src ="http://www.blogjava.net/luluyanglu/aggbug/260117.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/luluyanglu/" target="_blank">大鱼</a> 2009-03-16 22:21 <a href="http://www.blogjava.net/luluyanglu/archive/2009/03/16/260117.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>EJB异常：Cannot instantiate class:org.jnp.interfaces.NamingContextFactory </title><link>http://www.blogjava.net/luluyanglu/archive/2009/03/16/260116.html</link><dc:creator>大鱼</dc:creator><author>大鱼</author><pubDate>Mon, 16 Mar 2009 14:19:00 GMT</pubDate><guid>http://www.blogjava.net/luluyanglu/archive/2009/03/16/260116.html</guid><wfw:comment>http://www.blogjava.net/luluyanglu/comments/260116.html</wfw:comment><comments>http://www.blogjava.net/luluyanglu/archive/2009/03/16/260116.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/luluyanglu/comments/commentRss/260116.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/luluyanglu/services/trackbacks/260116.html</trackback:ping><description><![CDATA[<div class="postTitle" style="text-align: center"><span style="color: #000000"><strong><span style="font-size: large">EJB异常：Cannot instantiate class:org.jnp.interfaces.NamingContextFactory </span></strong></span></div>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><span style="font-size: medium">如出现以下异常：</span></p>
<p><span style="font-size: medium">Cannot instantiate class: org.jnp.interfaces.NamingContextFactory [Root exception is java.lang.ClassNotFoundException: org.jnp.interfaces.NamingContextFactory]</span></p>
<p>&nbsp;</p>
<p><span style="color: #0000ff"><span style="font-size: medium">请查看是否将JBOSS_Home下client文件夹中的所有jar包都导入到了项目工程中。</span></span></p>
<img src ="http://www.blogjava.net/luluyanglu/aggbug/260116.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/luluyanglu/" target="_blank">大鱼</a> 2009-03-16 22:19 <a href="http://www.blogjava.net/luluyanglu/archive/2009/03/16/260116.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>EJB异常：Collection has neither generic type or OneToMany.targetEntity() defined:</title><link>http://www.blogjava.net/luluyanglu/archive/2009/03/16/260114.html</link><dc:creator>大鱼</dc:creator><author>大鱼</author><pubDate>Mon, 16 Mar 2009 14:19:00 GMT</pubDate><guid>http://www.blogjava.net/luluyanglu/archive/2009/03/16/260114.html</guid><wfw:comment>http://www.blogjava.net/luluyanglu/comments/260114.html</wfw:comment><comments>http://www.blogjava.net/luluyanglu/archive/2009/03/16/260114.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/luluyanglu/comments/commentRss/260114.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/luluyanglu/services/trackbacks/260114.html</trackback:ping><description><![CDATA[<p style="text-align: center"><span style="font-size: medium"><strong>EJB异常：Collection has neither generic type or OneToMany.targetEntity() defined:</strong></span></p>
<p><span style="font-size: medium"><strong></strong></span></p>
<p><span style="font-size: medium"><strong></strong></span></p>
<p><span style="font-size: medium">
<p><span style="font-size: small">如出现类似以下异常：</span></p>
</span>
<p>&nbsp;</p>
<p><span style="font-size: small">org.hibernate.AnnotationException: Collection has neither generic type or OneToMany.targetEntity() defined: org.svse.org.model.Order.orderItems</span></p>
<p>&nbsp;</p>
<p><span style="font-size: small"><span style="color: #0000ff">请检查orderItems这个属性是否使用了泛型,如:Set&lt;OrderItem&gt;.</span></span></p>
<p><span style="font-size: small"><span style="color: #0000ff">如果未使用泛型,请在OneToMany注释中使用targetEntity指定元素的类型</span></span></p>
<img src ="http://www.blogjava.net/luluyanglu/aggbug/260114.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/luluyanglu/" target="_blank">大鱼</a> 2009-03-16 22:19 <a href="http://www.blogjava.net/luluyanglu/archive/2009/03/16/260114.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>EJB3.x：部署(卸载)EntityBean时自动创建(删除)表结构</title><link>http://www.blogjava.net/luluyanglu/archive/2009/03/16/260113.html</link><dc:creator>大鱼</dc:creator><author>大鱼</author><pubDate>Mon, 16 Mar 2009 14:18:00 GMT</pubDate><guid>http://www.blogjava.net/luluyanglu/archive/2009/03/16/260113.html</guid><wfw:comment>http://www.blogjava.net/luluyanglu/comments/260113.html</wfw:comment><comments>http://www.blogjava.net/luluyanglu/archive/2009/03/16/260113.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/luluyanglu/comments/commentRss/260113.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/luluyanglu/services/trackbacks/260113.html</trackback:ping><description><![CDATA[EJB3.x：部署(卸载)EntityBean时自动创建(删除)表结构<cite class="fav_csdnstylebykimi"><a class="fav_csdnstylebykimi" title="收藏到我的网摘中，并分享给我的朋友" href="javascript:d=document;t=d.selection?(d.selection.type!='None'?d.selection.createRange().text:''):(d.getSelection?d.getSelection():'');void(saveit=window.open('http://wz.csdn.net/storeit.aspx?t='+escape(d.title)+'&amp;u='+escape(d.location.href)+'&amp;c='+escape(t),'saveit','scrollbars=no,width=590,height=300,left=75,top=20,status=no,resizable=yes'));saveit.focus();">收藏</a></cite>
<div class="blogstory"><script>function StorePage(){d=document;t=d.selection?(d.selection.type!='None'?d.selection.createRange().text:''):(d.getSelection?d.getSelection():'');void(keyit=window.open('http://www.365key.com/storeit.aspx?t='+escape(d.title)+'&u='+escape(d.location.href)+'&c='+escape(t),'keyit','scrollbars=no,width=475,height=575,left=75,top=20,status=no,resizable=yes'));keyit.focus();}</script>
<p style="text-align: center"><span style="font-size: medium"><strong>&nbsp;EJB3.x：部署(卸载)EntityBean时自动创建(删除)表结构</strong></span></p>
<p style="text-align: left"><span style="font-size: small"><strong><span style="color: #008000">persistence.xml</span></strong></span></p>
<p style="text-align: left"><span style="font-size: medium"><strong></strong></span></p>
<p style="text-align: left"><span style="font-size: medium"><strong></strong></span>
<div class="dp-highlighter">
<div class="bar">
<div class="tools"><a onclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" href="http://blog.csdn.net/yexianyi/archive/2009/01/23/3851767.aspx#">view plain</a><a onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" href="http://blog.csdn.net/yexianyi/archive/2009/01/23/3851767.aspx#">copy to clipboard</a><a onclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" href="http://blog.csdn.net/yexianyi/archive/2009/01/23/3851767.aspx#">print</a><a onclick="dp.sh.Toolbar.Command('About',this);return false;" href="http://blog.csdn.net/yexianyi/archive/2009/01/23/3851767.aspx#">?</a></div>
</div>
<ol class="dp-xml">
    <li class="alt"><span><span class="tag">&lt;?</span><span class="tag-name">xml</span><span>&nbsp;</span><span class="attribute">version</span><span>=</span><span class="attribute-value">"1.0"</span><span class="tag">?&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span class="tag">&lt;</span><span class="tag-name">persistence</span><span>&nbsp;</span><span class="attribute">xmlns</span><span>=</span><span class="attribute-value">"http://java.sun.com/xml/ns/persistence"</span><span>&nbsp;</span><span class="attribute">xmlns:xsi</span><span>=</span><span class="attribute-value">"http://www.w3.org/2001/XMLSchema-instance"</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span class="attribute">xsi:schemaLocation</span><span>=</span><span class="attribute-value">"http://java.sun.com/xml/ns/persistence&nbsp;http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"</span><span>&nbsp;</span><span class="attribute">version</span><span>=</span><span class="attribute-value">"1.0"</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">persistence-unit</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">"EJBBookStore"</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">jta-data-source</span><span class="tag">&gt;</span><span>java:/MSSQLDS</span><span class="tag">&lt;/</span><span class="tag-name">jta-data-source</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">properties</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">"hibernate.hbm2ddl.auto"</span><span>&nbsp;</span><span class="attribute">value</span><span>=</span><span class="attribute-value">"none"</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comments">&lt;!--&nbsp;调整JDBC抓取数量的大小:&nbsp;Statement.setFetchSize()&nbsp;--&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">"hibernate.jdbc.fetch_size"</span><span>&nbsp;</span><span class="attribute">value</span><span>=</span><span class="attribute-value">"18"</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comments">&lt;!--&nbsp;调整JDBC批量更新数量&nbsp;--&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">"hibernate.jdbc.batch_size"</span><span>&nbsp;</span><span class="attribute">value</span><span>=</span><span class="attribute-value">"10"</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comments">&lt;!--&nbsp;显示最终执行的SQL&nbsp;--&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">"hibernate.show_sql"</span><span>&nbsp;</span><span class="attribute">value</span><span>=</span><span class="attribute-value">"true"</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comments">&lt;!--&nbsp;格式化显示的SQL&nbsp;--&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">"hibernate.format_sql"</span><span>&nbsp;</span><span class="attribute">value</span><span>=</span><span class="attribute-value">"true"</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">properties</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">persistence-unit</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span class="tag">&lt;/</span><span class="tag-name">persistence</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<textarea class="xhtml" style="display: none" name="code" rows="15" cols="77">&lt;?xml version="1.0"?&gt;
&lt;persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd" version="1.0"&gt;
&lt;persistence-unit name="EJBBookStore"&gt;
&lt;jta-data-source&gt;java:/MSSQLDS&lt;/jta-data-source&gt;
&lt;properties&gt;
&lt;property name="hibernate.hbm2ddl.auto" value="none"/&gt;
&lt;!-- 调整JDBC抓取数量的大小: Statement.setFetchSize() --&gt;
&lt;property name="hibernate.jdbc.fetch_size" value="18"/&gt;
&lt;!-- 调整JDBC批量更新数量 --&gt;
&lt;property name="hibernate.jdbc.batch_size" value="10"/&gt;
&lt;!-- 显示最终执行的SQL --&gt;
&lt;property name="hibernate.show_sql" value="true"/&gt;
&lt;!-- 格式化显示的SQL --&gt;
&lt;property name="hibernate.format_sql" value="true"/&gt;
&lt;/properties&gt;
&lt;/persistence-unit&gt;
&lt;/persistence&gt;
</textarea>&nbsp;&nbsp;
<p>&nbsp;</p>
<p style="text-align: left"><span style="font-size: medium"><span style="font-size: small"><span style="color: #0000ff">properties 节点用作指定Hibernate的各项属性，如果hibernate.hbm2ddl.auto的值设为create-drop，在实体Bean发布及卸载时将自动创建及删除相应数据库表(注意：Jboss服务器启动或关闭时会引发实体Bean的发布及卸载)。</span></span></span></p>
<p><span style="font-size: small"><span style="color: #0000ff">如果你的表已经存在,并且想保留数据，发布实体bean时可以把hibernate.hbm2ddl.auto的值设为none或update,以后为了实体bean 的改动能反应到数据表，建议使用update，这样实体Bean添加一个属性时能同时在数据表增加相应字段。</span></span></p>
</div>
<img src ="http://www.blogjava.net/luluyanglu/aggbug/260113.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/luluyanglu/" target="_blank">大鱼</a> 2009-03-16 22:18 <a href="http://www.blogjava.net/luluyanglu/archive/2009/03/16/260113.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>EJB异常：identifier of an instance of net.model.entity.Role was altered from 2 to 0</title><link>http://www.blogjava.net/luluyanglu/archive/2009/03/16/260111.html</link><dc:creator>大鱼</dc:creator><author>大鱼</author><pubDate>Mon, 16 Mar 2009 14:17:00 GMT</pubDate><guid>http://www.blogjava.net/luluyanglu/archive/2009/03/16/260111.html</guid><wfw:comment>http://www.blogjava.net/luluyanglu/comments/260111.html</wfw:comment><comments>http://www.blogjava.net/luluyanglu/archive/2009/03/16/260111.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/luluyanglu/comments/commentRss/260111.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/luluyanglu/services/trackbacks/260111.html</trackback:ping><description><![CDATA[<p style="text-align: center"><span style="font-size: medium"><strong>EJB异常：identifier of an instance of net.model.entity.Role was</strong> <strong>altered from 2 to 0</strong></span></p>
<p style="text-align: left">&nbsp;</p>
<p style="text-align: left"><span style="font-size: medium"><span style="font-size: small">如出现类似以下异常：</span></span></p>
<p style="text-align: left">&nbsp;</p>
<p style="text-align: left"><span style="font-size: medium"><span style="font-size: small">&nbsp;21:23:05,106 WARN&nbsp; [arjLoggerI18N] [com.arjuna.ats.arjuna.coordinator.TwoPhaseCoordinator_2] TwoPhaseCoordinator.beforeCompletion - failed for <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#99;&#111;&#109;&#46;&#97;&#114;&#106;&#117;&#110;&#97;&#46;&#97;&#116;&#115;&#46;&#105;&#110;&#116;&#101;&#114;&#110;&#97;&#108;&#46;&#106;&#116;&#97;&#46;&#114;&#101;&#115;&#111;&#117;&#114;&#99;&#101;&#115;&#46;&#97;&#114;&#106;&#117;&#110;&#97;&#99;&#111;&#114;&#101;&#46;&#83;&#121;&#110;&#99;&#104;&#114;&#111;&#110;&#105;&#122;&#97;&#116;&#105;&#111;&#110;&#73;&#109;&#112;&#108;&#101;&#64;&#52;&#55;&#51;&#50;&#48;&#49;">com.arjuna.ats.internal.jta.resources.arjunacore.SynchronizationImple@473201</a><br />
<span style="background-color: #888888"><span style="color: #ff0000"><span style="background-color: #ffffff">javax.persistence.PersistenceException: org.hibernate.HibernateException: identifier of an instance of net.model.entity.Role was altered from 2 to 0<br />
</span></span></span>&nbsp;at org.hibernate.ejb.AbstractEntityManagerImpl.throwPersistenceException(AbstractEntityManagerImpl.java:614)<br />
&nbsp;at org.hibernate.ejb.AbstractEntityManagerImpl$1.beforeCompletion(AbstractEntityManagerImpl.java:513)<br />
&nbsp;at com.arjuna.ats.internal.jta.resources.arjunacore.SynchronizationImple.beforeCompletion(SynchronizationImple.java:101)<br />
&nbsp;at com.arjuna.ats.arjuna.coordinator.TwoPhaseCoordinator.beforeCompletion(TwoPhaseCoordinator.java:263)<br />
&nbsp;at com.arjuna.ats.arjuna.coordinator.TwoPhaseCoordinator.end(TwoPhaseCoordinator.java:86)<br />
&nbsp;at com.arjuna.ats.arjuna.AtomicAction.commit(AtomicAction.java:177)<br />
&nbsp;at com.arjuna.ats.internal.jta.transaction.arjunacore.TransactionImple.commitAndDisassociate(TransactionImple.java:1414)<br />
&nbsp;at com.arjuna.ats.internal.jta.transaction.arjunacore.BaseTransaction.commit(BaseTransaction.java:135)<br />
&nbsp;at com.arjuna.ats.jbossatx.BaseTransactionManagerDelegate.commit(BaseTransactionManagerDelegate.java:75)<br />
&nbsp;at org.jboss.aspects.tx.TxPolicy.endTransaction(TxPolicy.java:170)<br />
&nbsp;at org.jboss.aspects.tx.TxPolicy.invokeInOurTx(TxPolicy.java:87)<br />
&nbsp;at org.jboss.aspects.tx.TxInterceptor$Required.invoke(TxInterceptor.java:190)<br />
&nbsp;at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)<br />
&nbsp;at org.jboss.aspects.tx.TxPropagationInterceptor.invoke(TxPropagationInterceptor.java:76)<br />
&nbsp;at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)<br />
&nbsp;at org.jboss.ejb3.tx.NullInterceptor.invoke(NullInterceptor.java:42)<br />
&nbsp;at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)<br />
&nbsp;at org.jboss.ejb3.security.Ejb3AuthenticationInterceptorv2.invoke(Ejb3AuthenticationInterceptorv2.java:159)<br />
&nbsp;at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)<br />
&nbsp;at org.jboss.ejb3.ENCPropagationInterceptor.invoke(ENCPropagationInterceptor.java:41)<br />
&nbsp;at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)<br />
&nbsp;at org.jboss.ejb3.asynchronous.AsynchronousInterceptor.invoke(AsynchronousInterceptor.java:106)<br />
&nbsp;at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)<br />
&nbsp;at org.jboss.ejb3.BlockContainerShutdownInterceptor.invoke(BlockContainerShutdownInterceptor.java:65)<br />
&nbsp;at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)<br />
&nbsp;at org.jboss.aspects.currentinvocation.CurrentInvocationInterceptor.invoke(CurrentInvocationInterceptor.java:67)<br />
&nbsp;at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)<br />
&nbsp;at org.jboss.ejb3.stateless.StatelessContainer.dynamicInvoke(StatelessContainer.java:486)<br />
&nbsp;at org.jboss.ejb3.session.InvokableContextClassProxyHack._dynamicInvoke(InvokableContextClassProxyHack.java:56)<br />
&nbsp;at org.jboss.aop.Dispatcher.invoke(Dispatcher.java:91)<br />
&nbsp;at org.jboss.aspects.remoting.AOPRemotingInvocationHandler.invoke(AOPRemotingInvocationHandler.java:82)<br />
&nbsp;at org.jboss.remoting.ServerInvoker.invoke(ServerInvoker.java:908)<br />
&nbsp;at org.jboss.remoting.transport.socket.ServerThread.completeInvocation(ServerThread.java:742)<br />
&nbsp;at org.jboss.remoting.transport.socket.ServerThread.processInvocation(ServerThread.java:695)<br />
&nbsp;at org.jboss.remoting.transport.socket.ServerThread.dorun(ServerThread.java:522)<br />
&nbsp;at org.jboss.remoting.transport.socket.ServerThread.run(ServerThread.java:230)<br />
<span style="color: #ff0000">Caused by: org.hibernate.HibernateException: identifier of an instance of net.model.entity.Role was altered from 2 to 0<br />
</span>&nbsp;at org.hibernate.event.def.DefaultFlushEntityEventListener.checkId(DefaultFlushEntityEventListener.java:81)<br />
&nbsp;at org.hibernate.event.def.DefaultFlushEntityEventListener.getValues(DefaultFlushEntityEventListener.java:187)<br />
&nbsp;at org.hibernate.event.def.DefaultFlushEntityEventListener.onFlushEntity(DefaultFlushEntityEventListener.java:143)<br />
&nbsp;at org.hibernate.event.def.AbstractFlushingEventListener.flushEntities(AbstractFlushingEventListener.java:219)<br />
&nbsp;at org.hibernate.event.def.AbstractFlushingEventListener.flushEverythingToExecutions(AbstractFlushingEventListener.java:99)<br />
&nbsp;at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:49)<br />
&nbsp;at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1027)<br />
&nbsp;at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:365)<br />
&nbsp;at org.hibernate.ejb.AbstractEntityManagerImpl$1.beforeCompletion(AbstractEntityManagerImpl.java:504)<br />
&nbsp;... 34 more<br />
</span></span></p>
<p style="text-align: left"></p>
<p style="text-align: left"><span style="font-size: medium"><span style="font-size: small"><span style="color: #0000ff">请检查Role类的主键属性是否是封装类型。例如：Integer，Long &#8230;&#8230;。不能是int，long等数据类型。</span></span></span></p>
<img src ="http://www.blogjava.net/luluyanglu/aggbug/260111.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/luluyanglu/" target="_blank">大鱼</a> 2009-03-16 22:17 <a href="http://www.blogjava.net/luluyanglu/archive/2009/03/16/260111.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>EJB3.x：关于@UniqueConstraint标记中的columnNames属性</title><link>http://www.blogjava.net/luluyanglu/archive/2009/03/16/260110.html</link><dc:creator>大鱼</dc:creator><author>大鱼</author><pubDate>Mon, 16 Mar 2009 14:16:00 GMT</pubDate><guid>http://www.blogjava.net/luluyanglu/archive/2009/03/16/260110.html</guid><wfw:comment>http://www.blogjava.net/luluyanglu/comments/260110.html</wfw:comment><comments>http://www.blogjava.net/luluyanglu/archive/2009/03/16/260110.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/luluyanglu/comments/commentRss/260110.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/luluyanglu/services/trackbacks/260110.html</trackback:ping><description><![CDATA[<p style="text-align: center"><strong><span style="font-size: large">EJB3.x：关于@UniqueConstraint标记中的columnNames属性</span></strong></p>
<p style="text-align: left"><span style="font-size: small">例如以下代码：</span></p>
<p style="text-align: left">
<div class="dp-highlighter">
<div class="bar">
<div class="tools"><a onclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" href="http://blog.csdn.net/yexianyi/archive/2009/01/24/3852222.aspx#">view plain</a><a onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" href="http://blog.csdn.net/yexianyi/archive/2009/01/24/3852222.aspx#">copy to clipboard</a><a onclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" href="http://blog.csdn.net/yexianyi/archive/2009/01/24/3852222.aspx#">print</a><a onclick="dp.sh.Toolbar.Command('About',this);return false;" href="http://blog.csdn.net/yexianyi/archive/2009/01/24/3852222.aspx#">?</a></div>
</div>
<ol class="dp-j">
    <li class="alt"><span><span class="keyword">package</span><span>&nbsp;net.model.entity; &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span class="keyword">import</span><span>&nbsp;java.io.Serializable; &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span class="keyword">import</span><span>&nbsp;javax.persistence.Column; &nbsp;&nbsp;</span></span></li>
    <li class=""><span class="keyword">import</span><span>&nbsp;javax.persistence.Entity; &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span class="keyword">import</span><span>&nbsp;javax.persistence.GeneratedValue; &nbsp;&nbsp;</span></span></li>
    <li class=""><span class="keyword">import</span><span>&nbsp;javax.persistence.GenerationType; &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span class="keyword">import</span><span>&nbsp;javax.persistence.Id; &nbsp;&nbsp;</span></span></li>
    <li class=""><span class="keyword">import</span><span>&nbsp;javax.persistence.Table; &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span class="keyword">import</span><span>&nbsp;javax.persistence.UniqueConstraint; &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span class="annotation">@Entity</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span class="annotation">@Table</span><span>( &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;name=</span><span class="string">"ROLE"</span><span>&nbsp;, &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uniqueConstraints={</span><span class="annotation">@UniqueConstraint</span><span>(columnNames={</span><span class="string">"ROLE_NAME"</span><span>})}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>) &nbsp;&nbsp;</span></li>
    <li class=""><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;Role&nbsp;</span><span class="keyword">implements</span><span>&nbsp;Serializable &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;Integer&nbsp;id&nbsp;; &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;String&nbsp;roleName; &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;</span><span class="keyword">int</span><span>&nbsp;roleValue&nbsp;; &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="annotation">@Id</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="annotation">@GeneratedValue</span><span>(strategy=GenerationType.AUTO) &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="annotation">@Column</span><span>(name=</span><span class="string">"ROLE_ID"</span><span>) &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;Integer&nbsp;getId()&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;id; &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;setId(Integer&nbsp;id)&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">this</span><span>.id&nbsp;=&nbsp;id; &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="annotation">@Column</span><span>(name=</span><span class="string">"ROLE_NAME"</span><span>&nbsp;,&nbsp;nullable=</span><span class="keyword">false</span><span>&nbsp;,length=</span><span class="number">50</span><span>) &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;String&nbsp;getRoleName()&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;roleName; &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;setRoleName(String&nbsp;roleName)&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">this</span><span>.roleName&nbsp;=&nbsp;roleName; &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="annotation">@Column</span><span>(name=</span><span class="string">"ROLE_VALUE"</span><span>&nbsp;,&nbsp;nullable=</span><span class="keyword">false</span><span>) &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">int</span><span>&nbsp;getRoleValue()&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;roleValue; &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;setRoleValue(</span><span class="keyword">int</span><span>&nbsp;roleValue)&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">this</span><span>.roleValue&nbsp;=&nbsp;roleValue; &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>}&nbsp;&nbsp;</span></li>
</ol>
</div>
<textarea class="java" style="display: none" name="code" rows="15" cols="78">package net.model.entity;
import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.UniqueConstraint;
@Entity
@Table(
name="ROLE" ,
uniqueConstraints={@UniqueConstraint(columnNames={"ROLE_NAME"})}
)
public class Role implements Serializable
{
private Integer id ;
private String roleName;
private int roleValue ;
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name="ROLE_ID")
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
@Column(name="ROLE_NAME" , nullable=false ,length=50)
public String getRoleName() {
return roleName;
}
public void setRoleName(String roleName) {
this.roleName = roleName;
}
@Column(name="ROLE_VALUE" , nullable=false)
public int getRoleValue() {
return roleValue;
}
public void setRoleValue(int roleValue) {
this.roleValue = roleValue;
}
}</textarea>&nbsp;&nbsp;
<p>&nbsp;</p>
<p style="text-align: left">&nbsp;</p>
<p style="text-align: left"><span style="color: #0000ff"><span style="font-size: small">注意uniqueConstraints={@UniqueConstraint(columnNames={"ROLE_NAME"})}&nbsp;中的<span style="color: #0000ff">columnNames属性值为数据库表中的<strong><span style="color: #ff0000"><span style="font-size: medium">字段名</span></span></strong>，而不是Role类中的类成员名roleName。</span></span></span></p>
<img src ="http://www.blogjava.net/luluyanglu/aggbug/260110.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/luluyanglu/" target="_blank">大鱼</a> 2009-03-16 22:16 <a href="http://www.blogjava.net/luluyanglu/archive/2009/03/16/260110.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>EJB3.x: 关于@UniqueConstraint标记无效问题</title><link>http://www.blogjava.net/luluyanglu/archive/2009/03/16/260107.html</link><dc:creator>大鱼</dc:creator><author>大鱼</author><pubDate>Mon, 16 Mar 2009 14:13:00 GMT</pubDate><guid>http://www.blogjava.net/luluyanglu/archive/2009/03/16/260107.html</guid><wfw:comment>http://www.blogjava.net/luluyanglu/comments/260107.html</wfw:comment><comments>http://www.blogjava.net/luluyanglu/archive/2009/03/16/260107.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/luluyanglu/comments/commentRss/260107.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/luluyanglu/services/trackbacks/260107.html</trackback:ping><description><![CDATA[<p style="text-align: center"><strong><span style="font-size: large">EJB3.x: 关于@UniqueConstraint标记无效问题</span></strong></p>
<p style="text-align: left"><span style="font-size: small">在制定Entity Bean时，设置了该实体的@UniqueConstraint限制。但是对该实体Bean进行部署后，并没有在数据库表中看到对应表字段出现unique限制。这是因为@UniqueConstraint标记必须在自动生成表的情况下才起作用。即，在persistence.xml中将hibernate.hbm2ddl.auto设置为create-drop。否则，唯一性约束限制不会被加入到数据库中。</span></p>
<p style="text-align: left"><span style="font-size: small">以下是《JSR 220: Enterprise JavaBeansTM,Version 3.0 Java Persistence API》文档的原文说明：</span></p>
<p style="text-align: center"><span style="font-size: small">
<table style="width: 583px; border-collapse: collapse" cellspacing="0" cellpadding="0" border="1">
    <tbody>
        <tr>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: windowtext 1pt solid; padding-left: 5.4pt; padding-bottom: 0cm; border-left: windowtext 1pt solid; width: 86.4pt; padding-top: 0cm; border-bottom: windowtext 1pt solid; background-color: transparent" valign="top" width="115">
            <p style="margin: 0cm 0cm 0pt; text-align: center" align="center"><strong><span style="font-size: 14pt"><span style="font-family: Times New Roman">Type</span></span></strong></p>
            </td>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: windowtext 1pt solid; padding-left: 5.4pt; border-left-color: #ece9d8; padding-bottom: 0cm; width: 85.3pt; padding-top: 0cm; border-bottom: windowtext 1pt solid; background-color: transparent" valign="top" width="114">
            <p style="margin: 0cm 0cm 0pt; text-align: center" align="center"><strong><span style="font-size: 14pt"><span style="font-family: Times New Roman">Name</span></span></strong></p>
            </td>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: windowtext 1pt solid; padding-left: 5.4pt; border-left-color: #ece9d8; padding-bottom: 0cm; width: 196.5pt; padding-top: 0cm; border-bottom: windowtext 1pt solid; background-color: transparent" valign="top" width="262">
            <p style="margin: 0cm 0cm 0pt; text-align: center" align="center"><strong><span style="font-size: 14pt"><span style="font-family: Times New Roman">Description</span></span></strong></p>
            </td>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: windowtext 1pt solid; padding-left: 5.4pt; border-left-color: #ece9d8; padding-bottom: 0cm; width: 69.05pt; padding-top: 0cm; border-bottom: windowtext 1pt solid; background-color: transparent" valign="top" width="92">
            <p style="margin: 0cm 0cm 0pt; text-align: center" align="center"><span style="font-family: Times New Roman"><strong><span style="font-size: 14pt">Default</span></strong></span></p>
            </td>
        </tr>
        <tr>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; padding-bottom: 0cm; border-left: windowtext 1pt solid; width: 86.4pt; border-top-color: #ece9d8; padding-top: 0cm; border-bottom: windowtext 1pt solid; background-color: transparent" width="115">
            <p style="margin: 0cm 0cm 0pt; text-align: center" align="center"><span style="font-size: small"><span style="font-family: Times New Roman">UniqueConstraint[]</span></span></p>
            </td>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: #ece9d8; padding-bottom: 0cm; width: 85.3pt; border-top-color: #ece9d8; padding-top: 0cm; border-bottom: windowtext 1pt solid; background-color: transparent" width="114">
            <p style="margin: 0cm 0cm 0pt; text-align: center" align="center"><span style="font-size: small"><span style="font-family: Times New Roman">uniqueConstraints</span></span></p>
            </td>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: #ece9d8; padding-bottom: 0cm; width: 196.5pt; border-top-color: #ece9d8; padding-top: 0cm; border-bottom: windowtext 1pt solid; background-color: transparent" valign="top" width="262">
            <p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: small"><span style="font-family: Times New Roman">(Optional) Unique constraints that are to be placed on the table. These are only used if table generation is in effect. These constraints apply in addition to any constraints specified by the Column and JoinColumn annotations and constraints entailed by primary key mappings.</span></span></p>
            </td>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: #ece9d8; padding-bottom: 0cm; width: 69.05pt; border-top-color: #ece9d8; padding-top: 0cm; border-bottom: windowtext 1pt solid; background-color: transparent" width="92">
            <p style="margin: 0cm 0cm 0pt; text-align: center" align="center"><span style="font-size: small"><span style="font-family: Times New Roman">No additional</span></span></p>
            <p style="margin: 0cm 0cm 0pt; text-align: center" align="center"><span style="font-size: small; font-family: Times New Roman">constraints</span></p>
            </td>
        </tr>
    </tbody>
</table>
</span></p>
<img src ="http://www.blogjava.net/luluyanglu/aggbug/260107.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/luluyanglu/" target="_blank">大鱼</a> 2009-03-16 22:13 <a href="http://www.blogjava.net/luluyanglu/archive/2009/03/16/260107.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>