﻿<?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-salt-随笔分类-JAVA</title><link>http://www.blogjava.net/salt/category/10576.html</link><description /><language>zh-cn</language><lastBuildDate>Sat, 03 Mar 2007 09:27:30 GMT</lastBuildDate><pubDate>Sat, 03 Mar 2007 09:27:30 GMT</pubDate><ttl>60</ttl><item><title>hibernate关系映射之多对多</title><link>http://www.blogjava.net/salt/archive/2006/06/08/51411.html</link><dc:creator>盐巴</dc:creator><author>盐巴</author><pubDate>Thu, 08 Jun 2006 09:24:00 GMT</pubDate><guid>http://www.blogjava.net/salt/archive/2006/06/08/51411.html</guid><wfw:comment>http://www.blogjava.net/salt/comments/51411.html</wfw:comment><comments>http://www.blogjava.net/salt/archive/2006/06/08/51411.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/salt/comments/commentRss/51411.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/salt/services/trackbacks/51411.html</trackback:ping><description><![CDATA[近来使用hbernate越多，越觉得他的关系映射不简单。<br />如果用错映射策略，很可能导致表设计的修改。<br />下面我们分析一下他的多对多关系，<br />其唯一的用途就是维护关系数据库中两张表或者多张表之间的关系<br />如最典型的权限设计时，基于组－角色－用户的设计，<br />三者之间分别为多对多的关系，换言之，组可以有多个角色，角色也可以属于多个组。<br /><br />group:<br />properties:id,name,description,roleSet,userSet<br /><br />role<br />properties:id,name,description,groupset<br /><br />多对多关系需要一个中间表来维护（group_role)<br />group.hbm.xml<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080"> 1</span><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">hibernate-mapping</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080"> 2</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">class </span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="model.GroupInfo"</span><span style="COLOR: #ff0000"> table</span><span style="COLOR: #0000ff">="GROUP_INFO"</span><span style="COLOR: #ff0000"> lazy</span><span style="COLOR: #0000ff">="false"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080"> 3</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">id </span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="id"</span><span style="COLOR: #ff0000"> type</span><span style="COLOR: #0000ff">="long"</span><span style="COLOR: #ff0000"> column</span><span style="COLOR: #0000ff">="ID"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080"> 4</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">generator </span><span style="COLOR: #ff0000">class</span><span style="COLOR: #0000ff">="native"</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080"> 5</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">id</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080"> 6</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">property </span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="name"</span><span style="COLOR: #ff0000"> column</span><span style="COLOR: #0000ff">="name"</span><span style="COLOR: #ff0000"> length</span><span style="COLOR: #0000ff">="20"</span><span style="COLOR: #ff0000"> type</span><span style="COLOR: #0000ff">="string"</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080"> 7</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">property </span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="description"</span><span style="COLOR: #ff0000"> column</span><span style="COLOR: #0000ff">="description"</span><span style="COLOR: #ff0000"> type</span><span style="COLOR: #0000ff">="string"</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080"> 8</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">set </span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="userSet"</span><span style="COLOR: #ff0000"> table</span><span style="COLOR: #0000ff">="group_user"</span><span style="COLOR: #ff0000"> cascade</span><span style="COLOR: #0000ff">="save-update"</span><span style="COLOR: #ff0000"> lazy</span><span style="COLOR: #0000ff">="true"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080"> 9</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">key </span><span style="COLOR: #ff0000">column</span><span style="COLOR: #0000ff">="group_id"</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">10</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">many-to-many </span><span style="COLOR: #ff0000">column</span><span style="COLOR: #0000ff">="user_id"</span><span style="COLOR: #ff0000"> class</span><span style="COLOR: #0000ff">="com.essp.fable.model.UserInfo"</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">11</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">set</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">12</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">set </span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="roleSet"</span><span style="COLOR: #ff0000"> table</span><span style="COLOR: #0000ff">="group_role"</span><span style="COLOR: #ff0000"> cascade</span><span style="COLOR: #0000ff">="save-update"</span><span style="COLOR: #ff0000"> lazy</span><span style="COLOR: #0000ff">="true"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">13</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">key </span><span style="COLOR: #ff0000">column</span><span style="COLOR: #0000ff">="group_id"</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">14</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">many-to-many </span><span style="COLOR: #ff0000">column</span><span style="COLOR: #0000ff">="role_id"</span><span style="COLOR: #ff0000"> class</span><span style="COLOR: #0000ff">="com.essp.fable.model.RoleInfo"</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">15</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">set</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">16</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">class</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">17</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">hibernate-mapping</span><span style="COLOR: #0000ff">&gt;</span></div>role.hbm.xml<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080"> 1</span><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">hibernate-mapping</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080"> 2</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">class </span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="model.RoleInfo"</span><span style="COLOR: #ff0000"> table</span><span style="COLOR: #0000ff">="ROLE_INFO"</span><span style="COLOR: #ff0000"> lazy</span><span style="COLOR: #0000ff">="false"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080"> 3</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">id </span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="id"</span><span style="COLOR: #ff0000"> type</span><span style="COLOR: #0000ff">="long"</span><span style="COLOR: #ff0000"> column</span><span style="COLOR: #0000ff">="ID"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080"> 4</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">generator </span><span style="COLOR: #ff0000">class</span><span style="COLOR: #0000ff">="native"</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080"> 5</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">id</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080"> 6</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">property </span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="name"</span><span style="COLOR: #ff0000"> column</span><span style="COLOR: #0000ff">="name"</span><span style="COLOR: #ff0000"> length</span><span style="COLOR: #0000ff">="20"</span><span style="COLOR: #ff0000"> type</span><span style="COLOR: #0000ff">="string"</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080"> 7</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">set </span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="groupSet"</span><span style="COLOR: #ff0000"> table</span><span style="COLOR: #0000ff">="group_role"</span><span style="COLOR: #ff0000"> cascade</span><span style="COLOR: #0000ff">="save-update"</span><span style="COLOR: #ff0000"> inverse</span><span style="COLOR: #0000ff">="true"</span><span style="COLOR: #ff0000"> lazy</span><span style="COLOR: #0000ff">="true"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080"> 8</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">key </span><span style="COLOR: #ff0000">column</span><span style="COLOR: #0000ff">="role_id"</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080"> 9</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">many-to-many </span><span style="COLOR: #ff0000">column</span><span style="COLOR: #0000ff">="group_id"</span><span style="COLOR: #ff0000"> class</span><span style="COLOR: #0000ff">="com.essp.fable.model.GroupInfo"</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">10</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">set</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">11</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">class</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">12</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">hibernate-mapping</span><span style="COLOR: #0000ff">&gt;</span></div><br />我们大都以set集合来实现他们的映射关系，配置xml的时候，最重的几个属性就是<font color="#ff0000">cascade</font><font color="#000000">和</font><font color="#ff0000">inverse</font><font color="#000000">，<br />cascade翻译为 小瀑布, 喷流，在这里表示对象间的级联关系，可以分别取值 为<font face="Courier New">all,none,save-update,delete,all-delete-orphan,delete-orphan<br /><br />cascade属性并不是多对多关系一定要用的，有了它只是让我们在插入或删除对像时更方便一些，只要在cascade的源头上插入或是删除，所有cascade的关系就会被自己动的插入或是删除。<br />为了能正确的cascade，unsaved-value是个很重要的属性。Hibernate通过这个属性来判断一个对象应该save还是update，如果这个对象的id是unsaved-value的话，那说明这个对象不是persistence object要save（insert)；如果id是非unsaved-value的话，那说明这个对象是persistence object（数据库中已存在），只要update就行了。saveOrUpdate方法用的也是这个机制。<br />如unsaved-value="0"，那当该值为0时，hibernate即判断其为未存储的对像，当执行saveOrUpdate时，实际执行的是save了。<br /><em>In Hibernate3, it is no longer necessary to specify an <tt class="literal">unsaved-value</tt> explicitly.</em> 不过在hibernate3中我们不需要显示的去指定他，hiberante会自动差别出该对像是否是新产生的对象。<br /><br /><strong>inverse</strong>翻译为 倒转的, 反转的。他属于关系和对象的级联关系，默认时为false,，就是说关系的两端都来维护关系.如果一边设为true，那表示他们之间的关系由对方来维护。<br />比如上面的例子，我们设role的inverse为true,即他们的关系有group来维护。<br />GroupInfo group = new GroupInfo();<br />group.setName("admin");<br />RoleInfo role = new RoleInfo();<br />role.setName("acl");<br />group.addRole(role);<br />save(group);<br />执行完这些操作后，hibernate会自动保存group,role，若反之，则只会保存role.</font></font><img src ="http://www.blogjava.net/salt/aggbug/51411.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/salt/" target="_blank">盐巴</a> 2006-06-08 17:24 <a href="http://www.blogjava.net/salt/archive/2006/06/08/51411.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>