﻿<?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-心梦帆影——JavaEE探索与研究-随笔分类-JPA</title><link>http://www.blogjava.net/rongxh7/category/40151.html</link><description>Struts2.x+Spring2.x+Hibernate3.x+EJB3.0+JPA+Jquery+SOA+WebService+Eclipse+MySQL+Oracle+WebLogic+JBoss+.......探索与求知，寻找一条完美的路，通过梦想的世界！</description><language>zh-cn</language><lastBuildDate>Sat, 20 Jun 2009 12:17:01 GMT</lastBuildDate><pubDate>Sat, 20 Jun 2009 12:17:01 GMT</pubDate><ttl>60</ttl><item><title>用户授权与新闻发布系统中的JPA实例</title><link>http://www.blogjava.net/rongxh7/archive/2009/06/13/281945.html</link><dc:creator>心梦帆影</dc:creator><author>心梦帆影</author><pubDate>Fri, 12 Jun 2009 18:15:00 GMT</pubDate><guid>http://www.blogjava.net/rongxh7/archive/2009/06/13/281945.html</guid><wfw:comment>http://www.blogjava.net/rongxh7/comments/281945.html</wfw:comment><comments>http://www.blogjava.net/rongxh7/archive/2009/06/13/281945.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/rongxh7/comments/commentRss/281945.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rongxh7/services/trackbacks/281945.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 开发工具：Eclipse 3.4 for JavaEE开发环境：JDK-6u14，JBoss5.0.1GA从JPA开始，先设计四个类，分别为User, Role, Category, Article，它们之间的关系，如下图： 设置关联映射时，为简单起见，一个用户只能拥有一个角色，一篇文章只能属于一个栏目。而授权与权限管理方面，也为了简单起见，只设置角色拥有操纵哪些栏目的权限。下...&nbsp;&nbsp;<a href='http://www.blogjava.net/rongxh7/archive/2009/06/13/281945.html'>阅读全文</a><img src ="http://www.blogjava.net/rongxh7/aggbug/281945.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rongxh7/" target="_blank">心梦帆影</a> 2009-06-13 02:15 <a href="http://www.blogjava.net/rongxh7/archive/2009/06/13/281945.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate(JPA)多对多(ManyToMany)关联映射不完美之处</title><link>http://www.blogjava.net/rongxh7/archive/2009/06/08/280637.html</link><dc:creator>心梦帆影</dc:creator><author>心梦帆影</author><pubDate>Mon, 08 Jun 2009 05:33:00 GMT</pubDate><guid>http://www.blogjava.net/rongxh7/archive/2009/06/08/280637.html</guid><wfw:comment>http://www.blogjava.net/rongxh7/comments/280637.html</wfw:comment><comments>http://www.blogjava.net/rongxh7/archive/2009/06/08/280637.html#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://www.blogjava.net/rongxh7/comments/commentRss/280637.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rongxh7/services/trackbacks/280637.html</trackback:ping><description><![CDATA[近来，在做的一个NewsMS项目中，需要用到多对多关联映射，以下是项目中用到的两个实体类：用户类User和角色类Role，它们之间是多对多的关系。<br />
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /><span style="color: #008000">//</span><span style="color: #008000">用户表</span><span style="color: #008000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #000000">@Entity<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />@Table(name</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">rong_user</span><span style="color: #000000">"</span><span style="color: #000000">)<br />
<img id="Codehighlighter1_74_489_Open_Image" onclick="this.style.display='none'; Codehighlighter1_74_489_Open_Text.style.display='none'; Codehighlighter1_74_489_Closed_Image.style.display='inline'; Codehighlighter1_74_489_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_74_489_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_74_489_Closed_Text.style.display='none'; Codehighlighter1_74_489_Open_Image.style.display='inline'; Codehighlighter1_74_489_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;User</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_74_489_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_74_489_Open_Text"><span style="color: #000000">{<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" /><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">省略其它内容</span><span style="color: #008000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&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">Role</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;roles&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;LinkedHashSet</span><span style="color: #000000">&lt;</span><span style="color: #000000">Role</span><span style="color: #000000">&gt;</span><span style="color: #000000">();&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">角色集合</span><span style="color: #008000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img id="Codehighlighter1_174_213_Open_Image" onclick="this.style.display='none'; Codehighlighter1_174_213_Open_Text.style.display='none'; Codehighlighter1_174_213_Closed_Image.style.display='inline'; Codehighlighter1_174_213_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_174_213_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_174_213_Closed_Text.style.display='none'; Codehighlighter1_174_213_Open_Image.style.display='inline'; Codehighlighter1_174_213_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;@ManyToMany(cascade&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_174_213_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_174_213_Open_Text"><span style="color: #000000">{CascadeType.PERSIST,&nbsp;CascadeType.MERGE}</span></span><span style="color: #000000">)<br />
<img id="Codehighlighter1_267_298_Open_Image" onclick="this.style.display='none'; Codehighlighter1_267_298_Open_Text.style.display='none'; Codehighlighter1_267_298_Closed_Image.style.display='inline'; Codehighlighter1_267_298_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_267_298_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_267_298_Closed_Text.style.display='none'; Codehighlighter1_267_298_Open_Image.style.display='inline'; Codehighlighter1_267_298_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;@JoinTable(name&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">rong_user_role</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;joinColumns&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_267_298_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_267_298_Open_Text"><span style="color: #000000">{&nbsp;@JoinColumn(name&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">user_id</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;)}</span></span><span style="color: #000000">,&nbsp;inverseJoinColumns&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_322_354_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_322_354_Open_Text"><span style="color: #000000">{&nbsp;@JoinColumn(name&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">role_id</span><span style="color: #000000">"</span><span style="color: #000000">)&nbsp;}</span></span><span style="color: #000000">)<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;@OrderBy(</span><span style="color: #000000">"</span><span style="color: #000000">id</span><span style="color: #000000">"</span><span style="color: #000000">)<br />
<img id="Codehighlighter1_402_421_Open_Image" onclick="this.style.display='none'; Codehighlighter1_402_421_Open_Text.style.display='none'; Codehighlighter1_402_421_Closed_Image.style.display='inline'; Codehighlighter1_402_421_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_402_421_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_402_421_Closed_Text.style.display='none'; Codehighlighter1_402_421_Open_Image.style.display='inline'; Codehighlighter1_402_421_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;Set</span><span style="color: #000000">&lt;</span><span style="color: #000000">Role</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;getRoles()&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_402_421_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_402_421_Open_Text"><span style="color: #000000">{<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;roles;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img id="Codehighlighter1_462_487_Open_Image" onclick="this.style.display='none'; Codehighlighter1_462_487_Open_Text.style.display='none'; Codehighlighter1_462_487_Closed_Image.style.display='inline'; Codehighlighter1_462_487_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_462_487_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_462_487_Closed_Text.style.display='none'; Codehighlighter1_462_487_Open_Image.style.display='inline'; Codehighlighter1_462_487_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;setRoles(Set</span><span style="color: #000000">&lt;</span><span style="color: #000000">Role</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;roles)&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_462_487_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_462_487_Open_Text"><span style="color: #000000">{<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.roles&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;roles;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" />}</span></span></div>
<br />
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /><span style="color: #008000">//</span><span style="color: #008000">角色表</span><span style="color: #008000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #000000">@Entity<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />@Table(name</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">rong_role</span><span style="color: #000000">"</span><span style="color: #000000">)<br />
<img id="Codehighlighter1_56_352_Open_Image" onclick="this.style.display='none'; Codehighlighter1_56_352_Open_Text.style.display='none'; Codehighlighter1_56_352_Closed_Image.style.display='inline'; Codehighlighter1_56_352_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_56_352_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_56_352_Closed_Text.style.display='none'; Codehighlighter1_56_352_Open_Image.style.display='inline'; Codehighlighter1_56_352_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Role</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_56_352_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_56_352_Open_Text"><span style="color: #000000">{<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">省略其它内容</span><span style="color: #008000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&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">User</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;user&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;LinkedHashSet</span><span style="color: #000000">&lt;</span><span style="color: #000000">User</span><span style="color: #000000">&gt;</span><span style="color: #000000">();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">用户集合</span><span style="color: #008000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #000000"><br />
<img id="Codehighlighter1_156_195_Open_Image" onclick="this.style.display='none'; Codehighlighter1_156_195_Open_Text.style.display='none'; Codehighlighter1_156_195_Closed_Image.style.display='inline'; Codehighlighter1_156_195_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_156_195_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_156_195_Closed_Text.style.display='none'; Codehighlighter1_156_195_Open_Image.style.display='inline'; Codehighlighter1_156_195_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;@ManyToMany(cascade&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_156_195_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_156_195_Open_Text"><span style="color: #000000">{CascadeType.PERSIST,&nbsp;CascadeType.MERGE}</span></span><span style="color: #000000">,&nbsp;mappedBy&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">roles</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;fetch&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;FetchType.LAZY)<br />
<img id="Codehighlighter1_270_288_Open_Image" onclick="this.style.display='none'; Codehighlighter1_270_288_Open_Text.style.display='none'; Codehighlighter1_270_288_Closed_Image.style.display='inline'; Codehighlighter1_270_288_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_270_288_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_270_288_Closed_Text.style.display='none'; Codehighlighter1_270_288_Open_Image.style.display='inline'; Codehighlighter1_270_288_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;Set</span><span style="color: #000000">&lt;</span><span style="color: #000000">User</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;getUser()&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_270_288_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_270_288_Open_Text"><span style="color: #000000">{<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;user;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img id="Codehighlighter1_327_350_Open_Image" onclick="this.style.display='none'; Codehighlighter1_327_350_Open_Text.style.display='none'; Codehighlighter1_327_350_Closed_Image.style.display='inline'; Codehighlighter1_327_350_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_327_350_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_327_350_Closed_Text.style.display='none'; Codehighlighter1_327_350_Open_Image.style.display='inline'; Codehighlighter1_327_350_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;setUser(Set</span><span style="color: #000000">&lt;</span><span style="color: #000000">User</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;user)&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_327_350_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_327_350_Open_Text"><span style="color: #000000">{<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.user&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;user;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" />}</span></span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span></div>
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这两个生成数据库中的三个表，分别是rong_user, rong_role和一个中间表rong_user_role。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Hibernate和JPA控制关联关系的，只能是一方，不能双方控制的，上面的程序中，我通过在Role类中设置mappedBy="roles"来设置由User来控制关系，<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这样，问题就出现了：当我在要删除角色Role时，如果没有用户拥有这个角色的话，就能成功删除；如果有用户拥有这个角色的时候，就不能删除，会抛以下异常：<br />
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /><span style="color: #000000">12</span><span style="color: #000000">:</span><span style="color: #000000">53</span><span style="color: #000000">:</span><span style="color: #000000">33</span><span style="color: #000000">,</span><span style="color: #000000">125</span><span style="color: #000000">&nbsp;&nbsp;WARN&nbsp;JDBCExceptionReporter:</span><span style="color: #000000">100</span><span style="color: #000000">&nbsp;-&nbsp;SQL&nbsp;Error:&nbsp;</span><span style="color: #000000">1451</span><span style="color: #000000">,</span><span style="color: #000000">&nbsp;SQLState:&nbsp;</span><span style="color: #000000">23000</span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #000000">12</span><span style="color: #000000">:</span><span style="color: #000000">53</span><span style="color: #000000">:</span><span style="color: #000000">33</span><span style="color: #000000">,</span><span style="color: #000000">125</span><span style="color: #000000">&nbsp;ERROR&nbsp;JDBCExceptionReporter:</span><span style="color: #000000">101</span><span style="color: #000000">&nbsp;-&nbsp;Cannot&nbsp;delete&nbsp;or&nbsp;update&nbsp;a&nbsp;parent&nbsp;row:&nbsp;a&nbsp;foreign&nbsp;key&nbsp;constraint&nbsp;fails&nbsp;(`newsms/rong_user_role`</span><span style="color: #000000">,</span><span style="color: #000000">&nbsp;CONSTRAINT&nbsp;`FKF1698421A337A5FA`&nbsp;FOREIGN&nbsp;KEY&nbsp;(`role_id`)&nbsp;REFERENCES&nbsp;`rong_role`&nbsp;(`id`))<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #000000">12</span><span style="color: #000000">:</span><span style="color: #000000">53</span><span style="color: #000000">:</span><span style="color: #000000">33</span><span style="color: #000000">,</span><span style="color: #000000">171</span><span style="color: #000000">&nbsp;ERROR&nbsp;AbstractFlushingEventListener:</span><span style="color: #000000">324</span><span style="color: #000000">&nbsp;-&nbsp;Could&nbsp;not&nbsp;synchronize&nbsp;database&nbsp;state&nbsp;with&nbsp;session<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />org.hibernate.exception.ConstraintViolationException:&nbsp;Could&nbsp;not&nbsp;execute&nbsp;JDBC&nbsp;batch&nbsp;update<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />/****堆栈信息略****/<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span></div>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /><span style="color: #000000">Caused&nbsp;by:&nbsp;java.sql.BatchUpdateException:&nbsp;Cannot&nbsp;delete&nbsp;or&nbsp;update&nbsp;a&nbsp;parent&nbsp;row:&nbsp;a&nbsp;foreign&nbsp;key&nbsp;constraint&nbsp;fails&nbsp;(`newsms/rong_user_role`</span><span style="color: #000000">,</span><span style="color: #000000">&nbsp;CONSTRAINT&nbsp;`FKF1698421A337A5FA`&nbsp;FOREIGN&nbsp;KEY&nbsp;(`role_id`)&nbsp;REFERENCES&nbsp;`rong_role`&nbsp;(`id`))<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />/******堆栈信息略*****/</span></div>
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当我设置成单向关系映射时，即把Role类中，Set&lt;User&gt;信息去掉，这样，也不能删，原因也是说有外键约束！怎么办？<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 苦恼了好几天，最后，只能归于Hibernate(JPA)的多对多关联映射设计得有点不符实际！就像上面我说的例子，有人选了某角色，就不能删掉该角色。还有一种做法是，在Role类中:<br />
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><img id="Codehighlighter1_22_80_Open_Image" onclick="this.style.display='none'; Codehighlighter1_22_80_Open_Text.style.display='none'; Codehighlighter1_22_80_Closed_Image.style.display='inline'; Codehighlighter1_22_80_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_22_80_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_22_80_Closed_Text.style.display='none'; Codehighlighter1_22_80_Open_Image.style.display='inline'; Codehighlighter1_22_80_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif"  alt="" /><span style="color: #000000">@ManyToMany(cascade&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_22_80_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_22_80_Open_Text"><span style="color: #000000">{CascadeType.PERSIST,&nbsp;CascadeType.MERGE,CascadeType.REMOVE}</span></span><span style="color: #000000">,&nbsp;mappedBy&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">roles</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;fetch&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;FetchType.LAZY)<br />
<img id="Codehighlighter1_155_173_Open_Image" onclick="this.style.display='none'; Codehighlighter1_155_173_Open_Text.style.display='none'; Codehighlighter1_155_173_Closed_Image.style.display='inline'; Codehighlighter1_155_173_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_155_173_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_155_173_Closed_Text.style.display='none'; Codehighlighter1_155_173_Open_Image.style.display='inline'; Codehighlighter1_155_173_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;Set</span><span style="color: #000000">&lt;</span><span style="color: #000000">User</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;getUser()&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_155_173_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_155_173_Open_Text"><span style="color: #000000">{<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;user;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span></div>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 即加多一个&#8220;CascadeType.REMOVE&#8221;，这样能把角色Role给删掉了，但连拥有该角色的所有用户User也被级联删掉了。这样来看，某个用户拥有许多角色，就因为其中有这一个角色，就被级联删了整个自己，那不是很冤枉。这也不符合实际！<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;个人认为，Hibernate(JPA)在设置多对多关联映射时，应该有做法能使得双方都能控制关联关系才好，才符合实际吧！但事实上，好像还没有发现有Hibernate(JPA)这种能力！<br />
<img src ="http://www.blogjava.net/rongxh7/aggbug/280637.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rongxh7/" target="_blank">心梦帆影</a> 2009-06-08 13:33 <a href="http://www.blogjava.net/rongxh7/archive/2009/06/08/280637.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>