﻿<?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-我爱佳娃-随笔分类-Hibernate</title><link>http://www.blogjava.net/alwayscy/category/20895.html</link><description /><language>zh-cn</language><lastBuildDate>Thu, 16 Jul 2009 16:42:48 GMT</lastBuildDate><pubDate>Thu, 16 Jul 2009 16:42:48 GMT</pubDate><ttl>60</ttl><item><title>用flush+clear加速SPRING＋JPA+HIBERNATE的批量插入操作</title><link>http://www.blogjava.net/alwayscy/archive/2009/07/16/287026.html</link><dc:creator>我爱佳娃</dc:creator><author>我爱佳娃</author><pubDate>Thu, 16 Jul 2009 13:20:00 GMT</pubDate><guid>http://www.blogjava.net/alwayscy/archive/2009/07/16/287026.html</guid><wfw:comment>http://www.blogjava.net/alwayscy/comments/287026.html</wfw:comment><comments>http://www.blogjava.net/alwayscy/archive/2009/07/16/287026.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/alwayscy/comments/commentRss/287026.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/alwayscy/services/trackbacks/287026.html</trackback:ping><description><![CDATA[<a href="http://blog.csdn.net/jxspace/archive/2006/09/18/1234002.aspx">这里</a>有个帖子论证HIBERNATE在批量插入时性能下降，以及一些解决方式。<br />
<br />
其核心在于批量插入时，积攒一定量后就写库，并清除SESSION里的第一级缓存，以免后续插入操作受缓存查找而影响效率：<br />
<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(&nbsp;j&nbsp;</span><span style="color: #000000;">%</span><span style="color: #000000;">&nbsp;batchNum2&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">&nbsp;)&nbsp;{</span><span style="color: #008000;">//</span><span style="color: #008000;">执行物理批量插入</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;session.flush();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;session.clear();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<br />
}</span></div>
<br />
<br />
基于JPA的事务操作，SESSION不可见，此时，需要直接调用EntityManager的flush和clear。<br />
但EntityManager也是被封装入JpaDaoSupport，实际的EntityManager对象也不容易取得。<br />
此时可以用其JpaTemplate成员的execute方法来实现这两个操作：<br />
<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;getJpaTemplate().execute(</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;JpaCallback()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;Object&nbsp;doInJpa(EntityManager&nbsp;em)&nbsp;</span><span style="color: #0000ff;">throws</span><span style="color: #000000;">&nbsp;PersistenceException&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;em.flush();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;em.clear();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&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;">null</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;},&nbsp;</span><span style="color: #0000ff;">true</span><span style="color: #000000;">);</span></div>
<br />
在我这里测试结果：<br />
没有定期调用以上方法时，插入50个记录要2秒，并且随着记录增多，时间越来越长。<br />
每插入50个调用以上方法后，插入50个记录小于300毫秒，且不随记录个数线性增长。<br />
<img src ="http://www.blogjava.net/alwayscy/aggbug/287026.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/alwayscy/" target="_blank">我爱佳娃</a> 2009-07-16 21:20 <a href="http://www.blogjava.net/alwayscy/archive/2009/07/16/287026.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ManyToMany关系中，使用非主键联合的方法</title><link>http://www.blogjava.net/alwayscy/archive/2008/10/27/236920.html</link><dc:creator>我爱佳娃</dc:creator><author>我爱佳娃</author><pubDate>Mon, 27 Oct 2008 09:30:00 GMT</pubDate><guid>http://www.blogjava.net/alwayscy/archive/2008/10/27/236920.html</guid><wfw:comment>http://www.blogjava.net/alwayscy/comments/236920.html</wfw:comment><comments>http://www.blogjava.net/alwayscy/archive/2008/10/27/236920.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/alwayscy/comments/commentRss/236920.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/alwayscy/services/trackbacks/236920.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 当ManyToMany或者ManyToOne定义时，JoinTable中referencedColumnName指向的是非主键(non PK columns)，将 报ClassCastException。这里有个简单解决办法。&nbsp;&nbsp;<a href='http://www.blogjava.net/alwayscy/archive/2008/10/27/236920.html'>阅读全文</a><img src ="http://www.blogjava.net/alwayscy/aggbug/236920.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/alwayscy/" target="_blank">我爱佳娃</a> 2008-10-27 17:30 <a href="http://www.blogjava.net/alwayscy/archive/2008/10/27/236920.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>PowerDesigner中设置Hibernate一对多，多对一属性</title><link>http://www.blogjava.net/alwayscy/archive/2007/04/15/110791.html</link><dc:creator>我爱佳娃</dc:creator><author>我爱佳娃</author><pubDate>Sun, 15 Apr 2007 09:17:00 GMT</pubDate><guid>http://www.blogjava.net/alwayscy/archive/2007/04/15/110791.html</guid><wfw:comment>http://www.blogjava.net/alwayscy/comments/110791.html</wfw:comment><comments>http://www.blogjava.net/alwayscy/archive/2007/04/15/110791.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/alwayscy/comments/commentRss/110791.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/alwayscy/services/trackbacks/110791.html</trackback:ping><description><![CDATA[例如：表示主机HOST含有多个磁盘DISK关系：<br><br>在PD的OOM中双击一条关系连线，设置Navigate，这样才会在各自hbm.xml中生成many-to-one及one-to-many关系。<br><img height=768 src="http://www.blogjava.net/images/blogjava_net/alwayscy/pd1.JPG" width=1024 border=0><br><br><br>另外，根据&#8220;附文&#8221;的效率说明还需要设置：由多方DISK维护关系，并且当HOST更新时，也要更新DISK。<br><img height=768 src="http://www.blogjava.net/images/blogjava_net/alwayscy/pd2.JPG" width=1024 border=0><br><br><br>生成的HBM.XML如下：<br>HOST的：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;joined-subclass name="Host" table="host" dynamic-update="false" dynamic-insert="false" select-before-update="false" lazy="true" abstract="false"&gt;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&lt;key on-delete="noaction" unique="true"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &lt;column name="dev_id" sql-type="int" not-null="true" length="0"/&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&lt;/key&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&lt;array name="nic" optimistic-lock="true"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&lt;key on-delete="noaction" unique="true"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&lt;column name="dev_id" sql-type="int" not-null="false" length="0"/&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&lt;/key&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&lt;list-index column="IndexColumnB"/&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&lt;one-to-many class="eb.nms.db.Nic"/&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&lt;/array&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&lt;set name="disk" outer-join="false"<span style="COLOR: #993300"> inverse="true"</span> lazy="true" optimistic-lock="true" <span style="COLOR: #993300">cascade="save-update</span>"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&lt;key on-delete="noaction" unique="true"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&lt;column name="dev_id" sql-type="int" not-null="false" length="0"/&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&lt;/key&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&lt;one-to-many class="eb.nms.db.Disk"/&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&lt;/set&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/joined-subclass&gt;<br><br><br>DISK的：<br>&nbsp;&nbsp; &lt;class name="Disk" table="disk" mutable="true" lazy="true" abstract="false"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;id name="diskId"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;column name="disk_id" sql-type="int" not-null="true"/&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;generator class="native"&gt;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/generator&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/id&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="diskName" insert="true" update="true" optimistic-lock="true"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;column name="disk_name" sql-type="varchar(254)" length="254"/&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;many-to-one name="host" class="Host" outer-join="false" update="true" insert="true"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&lt;column name="dev_id" sql-type="int" not-null="false" length="0"/&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/many-to-one&gt;<br>&nbsp;&nbsp; &lt;/class&gt;<br><br><br>附文：<br>&nbsp;
<div>
<p align=left><strong><span><a href="http://caterpillar.onlyfun.net/Gossip/HibernateGossip/HibernateGossip.html"><span>Hibernate Gossip:&nbsp;</span><span><span>雙向關聯（</span></span><span>inverse </span><span><span>的意義）</span></span></a></span></strong></p>
</div>
<table cellSpacing=0 cellPadding=0 width=691 border=0>
    <tbody>
        <tr>
            <td vAlign=top width=691>
            <p align=left><span>在</span><span> <span><a href="http://caterpillar.onlyfun.net/Gossip/HibernateGossip/ManyToOne.html"><strong><span><span>多對一</span></span></strong></a> </span></span><span>、</span><span><a href="http://caterpillar.onlyfun.net/Gossip/HibernateGossip/OneToMany.html"><strong><span><span>一對多</span></span></strong></a> </span><span>中都是單向關聯，也就是其中一方關聯到另一方，而另一方不知道自己被關聯。</span><span><br><br></span><span>如果讓雙方都意識到另一方的存在，這就形成了雙向關聯，在多對一、一對多的例子可以改寫一下，重新設計</span><span>User</span><span>類別如下：</span><span> </span></p>
            <ul type=disc>
                <li><span>User.java </span></li>
            </ul>
            <div>
            <p align=left><span>package onlyfun.caterpillar;<br><br>public class User {<br><span>&nbsp;&nbsp;&nbsp; </span>private Integer id;<br><span>&nbsp;&nbsp;&nbsp; </span>private String name;<br><span>&nbsp;&nbsp;&nbsp; </span><strong>private Room room;</strong><br>&nbsp;<br><span>&nbsp;&nbsp;&nbsp; </span>public User() {}<br><br><span>&nbsp;&nbsp;&nbsp; </span>public Integer getId() {<br><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>return id;<br><span>&nbsp;&nbsp;&nbsp; </span>}<br><br><span>&nbsp;&nbsp;&nbsp; </span>public void setId(Integer id) {<br><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>this.id = id;<br><span>&nbsp;&nbsp;&nbsp; </span>}<br><br><span>&nbsp;&nbsp;&nbsp; </span>public String getName() {<br><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>return name;<br><span>&nbsp;&nbsp;&nbsp; </span>}<br><br><span>&nbsp;&nbsp;&nbsp; </span>public void setName(String name) {<br><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>this.name = name;<br><span>&nbsp;&nbsp;&nbsp; </span>}<br><br><span>&nbsp;&nbsp;&nbsp; </span>public Room getRoom() {<br><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>return room;<br><span>&nbsp;&nbsp;&nbsp; </span>}<br><br><span>&nbsp;&nbsp;&nbsp; </span>public void setRoom(Room room) {<br><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>this.room = room;<br><span>&nbsp;&nbsp;&nbsp; </span>}<br>}</span></p>
            </div>
            <p align=left><span><br>Room</span><span>類別如下：</span></p>
            <ul type=disc>
                <li><span>Room.java </span></li>
            </ul>
            <div>
            <p align=left><span>package onlyfun.caterpillar; <br><br>import java.util.Set;<br><br>public class Room { <br><span>&nbsp;&nbsp;&nbsp; </span>private Integer id; <br><span>&nbsp;&nbsp;&nbsp; </span>private String address;<br><span>&nbsp;&nbsp;&nbsp; </span><strong>private Set users;</strong><br>&nbsp;<br><span>&nbsp;&nbsp;&nbsp; </span>public Room() {}<br>&nbsp;<br><span>&nbsp;&nbsp;&nbsp; </span>public Integer getId() { <br><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>return id; <br><span>&nbsp;&nbsp;&nbsp; </span>} <br><br><span>&nbsp;&nbsp;&nbsp; </span>public void setId(Integer id) { <br><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>this.id = id; <br><span>&nbsp;&nbsp;&nbsp; </span>} <br>&nbsp;<br><span>&nbsp;&nbsp;&nbsp; </span>public String getAddress() { <br><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>return address; <br><span>&nbsp;&nbsp;&nbsp; </span>}<br>&nbsp;<br><span>&nbsp;&nbsp;&nbsp; </span>public void setAddress(String address) { <br><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>this.address = address; <br><span>&nbsp;&nbsp;&nbsp; </span>}<br><br><span>&nbsp;&nbsp;&nbsp; </span>public Set getUsers() {<br><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>return users;<br><span>&nbsp;&nbsp;&nbsp; </span>}<br><br><span>&nbsp;&nbsp;&nbsp; </span>public void setUsers(Set users) {<br><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>this.users = users;<br><span>&nbsp;&nbsp;&nbsp; </span>} <br>&nbsp;<br><span>&nbsp;&nbsp;&nbsp; </span>public void addUser(User user) {<br><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>users.add(user); <br><span>&nbsp;&nbsp;&nbsp; </span>}<br>&nbsp;<br><span>&nbsp;&nbsp;&nbsp; </span>public void removeUser(User user) {<br><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>users.remove(user);<br><span>&nbsp;&nbsp;&nbsp; </span>}<br>}</span></p>
            </div>
            <p align=left><span><br></span><span>如此，</span><span>User</span><span>實例可參考至</span><span>Room</span><span>實例而維持多對一關係，而</span><span>Room</span><span>實例記得</span><span>User</span><span>實例而維持一對多關係。</span><span><br><br></span><span>在映射文件方面，可以如下撰寫：</span><span> </span></p>
            <ul type=disc>
                <li><span>User.hbm.xml </span></li>
            </ul>
            <div>
            <p align=left><span>&lt;?xml version="1.0" encoding="utf-8"?&gt; <br>&lt;!DOCTYPE hibernate-mapping <br>&nbsp;PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" <br>&nbsp;"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"&gt; <br><br>&lt;hibernate-mapping&gt; <br><br><span>&nbsp;&nbsp;&nbsp; </span>&lt;class name="onlyfun.caterpillar.User" table="user"&gt; <br><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;id name="id" column="id" type="java.lang.Integer"&gt; <br><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;generator class="native"/&gt; <br><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;/id&gt; <br><br><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;property name="name" column="name" type="java.lang.String"/&gt; <br>&nbsp;<br><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><strong>&lt;many-to-one name="room" <br></strong><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><strong>column="room_id" <br></strong><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><strong>&nbsp;class="onlyfun.caterpillar.Room"<br></strong><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><strong>&nbsp;cascade="save-update"<br></strong><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><strong>&nbsp;outer-join="true"/&gt; </strong><br><span>&nbsp;&nbsp;&nbsp; </span>&lt;/class&gt; <br><br>&lt;/hibernate-mapping&gt;</span></p>
            </div>
            <p align=left>&nbsp;</p>
            <ul type=disc>
                <li><span>Room.hbm.xml </span></li>
            </ul>
            <div>
            <p align=left><span>&lt;?xml version="1.0" encoding="utf-8"?&gt; <br>&lt;!DOCTYPE hibernate-mapping <br>&nbsp;PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" <br>&nbsp;"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"&gt; <br><br>&lt;hibernate-mapping&gt; <br><br><span>&nbsp;&nbsp;&nbsp; </span>&lt;class name="onlyfun.caterpillar.Room" table="room"&gt; <br><span>&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;</span>&lt;id name="id" column="id"&gt; <br><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;generator class="native"/&gt; <br><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;/id&gt; <br><br><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;property name="address" <br><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>column="address" <br><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>type="java.lang.String"/&gt; <br>&nbsp;<br><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><strong>&lt;set name="users" table="user" cascade="save-update"&gt;<br></strong><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><strong>&lt;key column="room_id"/&gt;<br></strong><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><strong>&lt;one-to-many class="onlyfun.caterpillar.User"/&gt;<br></strong><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><strong>&lt;/set&gt;</strong><br><span>&nbsp;&nbsp;&nbsp; </span>&lt;/class&gt; <br><br>&lt;/hibernate-mapping&gt;</span></p>
            </div>
            <p align=left><span><br></span><span>映射文件雙方都設定了</span><span>cascade</span><span>為</span><span>save-update</span><span>，所以您可以用多對一的方式來維持關聯：</span></p>
            <p align=left><strong><span>User user1 = new User();<br>user1.setName("bush"); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>User user2 = new User(); <br>user2.setName("caterpillar"); <br><br>Room room1 = new Room(); <br>room1.setAddress("NTU-M8-419");<br><br>user1.setRoom(room1);<br>user2.setRoom(room1);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>Session session = sessionFactory.openSession();<br>Transaction tx = session.beginTransaction();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>session.save(user1);<br>session.save(user2);<br></span></strong><span><br><strong>tx.commit();<br>session.close();</strong></span></p>
            <p align=left><span><br></span><span>或是反過來由一對多的方式來維持關聯：</span></p>
            <p align=left><strong><span>User user1 = new User();<br>user1.setName("bush"); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>User user2 = new User(); <br>user2.setName("caterpillar"); <br><br>Room room1 = new Room(); <br>room1.setUsers(new HashSet());<br>room1.setAddress("NTU-M8-419");<br>room1.addUser(user1);<br>room1.addUser(user2);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>Session session = sessionFactory.openSession();<br>Transaction tx = session.beginTransaction();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>session.save(room1); <br><br>tx.commit();<br>session.close();</span></strong></p>
            <p align=left><span><br></span><span>這邊有個效率議題可以探討，上面的程式片段</span><span>Hibernate</span><span>將使用以下的</span><span>SQL</span><span>進行儲存：</span></p>
            <p align=left><strong><span>Hibernate: insert into room (address) values (?)<br>Hibernate: insert into user (name, room_id) values (?, ?)<br>Hibernate: insert into user (name, room_id) values (?, ?)<br>Hibernate: update user set room_id=? where id=?<br>Hibernate: update user set room_id=? where id=?</span></strong></p>
            <p align=left><span><br></span><span>上面的程式寫法表示關聯由</span><span>Room</span><span>單方面維持，而主控方也是</span><span>Room</span><span>，</span><span>User</span><span>不知道</span><span>Room</span><span>的</span><span>room_id</span><span>是多少，所以必須分別儲存</span><span>Room</span><span>與</span><span> User</span><span>之後，再更新</span><span>user</span><span>的</span><span>room_id</span><span>。</span><span><br><br></span><span>在一對多、多對一形成雙向關聯的情況下，可以將關聯維持的控制權交給多的一方，這樣會比較有效率，理由不難理解，就像是在公司中，老闆要記住多個員工的姓名快，還是每一個員工都記得老闆的姓名快。</span><span><br><br></span><span>所以在一對多、多對一形成雙向關聯的情況下，可以在「一」的一方設定控制權反轉，也就是當儲存「一」的一方時，將關聯維持的控制權交給「多」的一方，以上面的例子來說，可以設定</span><span>Room.hbm.xml</span><span>如下：</span><span> </span></p>
            <ul type=disc>
                <li><span>Room.hbm.xml </span></li>
            </ul>
            <div>
            <p align=left><span>&lt;?xml version="1.0" encoding="utf-8"?&gt; <br>&lt;!DOCTYPE hibernate-mapping <br>&nbsp;PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" <br>&nbsp;"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"&gt; <br><br>&lt;hibernate-mapping&gt; <br><br><span>&nbsp;&nbsp;&nbsp; </span>&lt;class name="onlyfun.caterpillar.Room" table="room"&gt; <br><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;id name="id" column="id"&gt; <br><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;generator class="native"/&gt; <br><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;/id&gt; <br><br><span>&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;</span>&lt;property name="address" <br><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>column="address" <br><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>type="java.lang.String"/&gt; <br>&nbsp;<br><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;set name="users" table="user" cascade="save-update" <strong>inverse="true"</strong>&gt;<br><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;key column="room_id"/&gt;<br><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;one-to-many class="onlyfun.caterpillar.User"/&gt;<br><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;/set&gt;<br><span>&nbsp;&nbsp;&nbsp; </span>&lt;/class&gt; <br><br>&lt;/hibernate-mapping&gt;</span></p>
            </div>
            <p align=left><span><br></span><span>由於關聯的控制權交給「多」的一方了，所以直接儲存「一」方前，「多」的一方必須意識到「一」的存在，所以程式片段必須改為如下：</span></p>
            <p align=left><strong><span>User user1 = new User();<br>user1.setName("bush"); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>User user2 = new User(); <br>user2.setName("caterpillar"); <br><br>Room room1 = new Room(); <br>room1.setUsers(new HashSet());<br>room1.setAddress("NTU-M8-419");<br>room1.addUser(user1);<br>room1.addUser(user2);<br><br>// </span></strong><strong><span>多方必須意識到單方的存在</span></strong><strong><span><br>user1.setRoom(room1);</span></strong><span><br><strong>user2.setRoom(room1);</strong><br><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>Session session = sessionFactory.openSession();<br>Transaction tx = session.beginTransaction();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>session.save(room1); <br><br>tx.commit();<br>session.close();</strong></span></p>
            <p align=left><span><br></span><span>上面的程式片段</span><span>Hibernate</span><span>將使用以下的</span><span>SQL</span><span>：</span></p>
            <p align=left><strong><span>Hibernate: insert into room (address) values (?)<br>Hibernate: insert into user (name, room_id) values (?, ?)<br>Hibernate: insert into user (name, room_id) values (?, ?)</span></strong></p>
            <p align=left><span><br></span><span>如果控制權交給另一方了，而另一方沒有意識到對方的存在的話會如何？試著將上面的程式片段中</span><span>user1.setRoom(room1);</span><span>與</span><span> user2.setRoom(room1);</span><span>移去，執行之後，您會發現資料庫中</span><span>room_id</span><span>會出現</span><span>null</span><span>值，這種結果就好比在</span><span> <span><a href="http://caterpillar.onlyfun.net/Gossip/HibernateGossip/ManyToOne.html"><strong><span><span>多對一</span></span></strong></a> </span></span><span>中，您沒有分配給</span><span>User</span><span>一個</span><span>Room</span><span>，理所當然的，</span><span>room_id</span><span>會出現</span><span>null</span><span>。</span></p>
            </td>
        </tr>
    </tbody>
</table>
<p>&nbsp;</p>
<img src ="http://www.blogjava.net/alwayscy/aggbug/110791.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/alwayscy/" target="_blank">我爱佳娃</a> 2007-04-15 17:17 <a href="http://www.blogjava.net/alwayscy/archive/2007/04/15/110791.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate继承映射讲解</title><link>http://www.blogjava.net/alwayscy/archive/2007/04/15/110776.html</link><dc:creator>我爱佳娃</dc:creator><author>我爱佳娃</author><pubDate>Sun, 15 Apr 2007 07:06:00 GMT</pubDate><guid>http://www.blogjava.net/alwayscy/archive/2007/04/15/110776.html</guid><wfw:comment>http://www.blogjava.net/alwayscy/comments/110776.html</wfw:comment><comments>http://www.blogjava.net/alwayscy/archive/2007/04/15/110776.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/alwayscy/comments/commentRss/110776.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/alwayscy/services/trackbacks/110776.html</trackback:ping><description><![CDATA[<p>&nbsp;</p>
<font style="BACKGROUND-COLOR: #ffffff"><a href="http://macrochen.blogdriver.com/macrochen/687759.html">http://macrochen.blogdriver.com/macrochen/687759.html</a></font>
<img src ="http://www.blogjava.net/alwayscy/aggbug/110776.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/alwayscy/" target="_blank">我爱佳娃</a> 2007-04-15 15:06 <a href="http://www.blogjava.net/alwayscy/archive/2007/04/15/110776.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用PowerDesigner生成Hibernate映射文件的步骤</title><link>http://www.blogjava.net/alwayscy/archive/2007/04/07/109089.html</link><dc:creator>我爱佳娃</dc:creator><author>我爱佳娃</author><pubDate>Sat, 07 Apr 2007 07:25:00 GMT</pubDate><guid>http://www.blogjava.net/alwayscy/archive/2007/04/07/109089.html</guid><wfw:comment>http://www.blogjava.net/alwayscy/comments/109089.html</wfw:comment><comments>http://www.blogjava.net/alwayscy/archive/2007/04/07/109089.html#Feedback</comments><slash:comments>9</slash:comments><wfw:commentRss>http://www.blogjava.net/alwayscy/comments/commentRss/109089.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/alwayscy/services/trackbacks/109089.html</trackback:ping><description><![CDATA[<p><font style="BACKGROUND-COLOR: #d8d0c8">执行：New-&gt;Conceptual Data Model<br>编译完概念模型后，再通过CDM生成PDM和OOM，注意要先生成OOM，再生成PDM。<br>在3种模型都具备时，生成JAVA　CODE时才会有*.hbm.xml文件：<br><br>执行：Tools-&gt;Generate Object-Oriented Model<br>在对话框中，选择Detail，勾选O/R Mapping，点击Enable Transformations，在多出来的选项卡Extended Model Definitions中的O/R Mapping页中选择Hibernate。<br><br>执行：Tools-&gt;Generate Physical Data Model<br>在对话框中，选择Detail，勾选O/R Mapping，点击Enable Transformations，在多出来的选项卡Extended Model Definitions中的O/R Mapping页中选择Hibernate。<br><br>再执行：Language-&gt;Generate Java Code<br></font></p>
就会看见生成的JAVA代码和映射HBM.XML文件<br><br>这里只是刚刚摸索的一些步骤，如果有实际用过，或者有详细资料的XDJM，请回复出来共享下。多谢。<br>PD的帮助让人摸不着头脑。<br><br>这是最后结果：<br><br><img height=768 alt="" src="http://www.blogjava.net/images/blogjava_net/alwayscy/1.JPG" width=1024 border=0> 
<img src ="http://www.blogjava.net/alwayscy/aggbug/109089.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/alwayscy/" target="_blank">我爱佳娃</a> 2007-04-07 15:25 <a href="http://www.blogjava.net/alwayscy/archive/2007/04/07/109089.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>inverse和cascade</title><link>http://www.blogjava.net/alwayscy/archive/2007/03/13/103628.html</link><dc:creator>我爱佳娃</dc:creator><author>我爱佳娃</author><pubDate>Tue, 13 Mar 2007 13:17:00 GMT</pubDate><guid>http://www.blogjava.net/alwayscy/archive/2007/03/13/103628.html</guid><wfw:comment>http://www.blogjava.net/alwayscy/comments/103628.html</wfw:comment><comments>http://www.blogjava.net/alwayscy/archive/2007/03/13/103628.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/alwayscy/comments/commentRss/103628.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/alwayscy/services/trackbacks/103628.html</trackback:ping><description><![CDATA[
		<p>inverse，表示两个表的关系由谁维护。值为false的一方将维护这种关系。如下面多对多关系中，由HOST来维护它们之间的关系表hostalarmrule。<br /><br />cascade，表示更新本表时，是否附带更新与其相关的其它表。如下面，更新HOST表，由于值为save-update，也会将rules增加或者更新到ALARMRULE表；但，删除HOST时，不会删除ALARMRULE表中数据。除非，其值为all。<br /><br />    &lt;class name="db.Host" table="host" catalog="rw"&gt;<br />        &lt;set name="rules" <font color="#ff0000">inverse="false"</font> table="hostalarmrule" <font color="#ff0000">cascade="save-update"</font>&gt;<br />            &lt;key column="host_id"/&gt;<br />            &lt;many-to-many class="db.Alarmrule" column="alarmrule_id"/&gt;<br />        &lt;/set&gt;                <br />    &lt;/class&gt;<br /><br />    &lt;class name="db.Alarmrule" table="alarmrule" catalog="rw"&gt;<br />      &lt;set name="hosts" table="hostalarmrule" <font color="#ff0000">inverse="true"</font>&gt;<br />            &lt;key column="alarmrule_id"/&gt;<br />            &lt;many-to-many class="db.Host" column="host_id"/&gt;<br />        &lt;/set&gt;<br />    &lt;/class&gt;</p>
<img src ="http://www.blogjava.net/alwayscy/aggbug/103628.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/alwayscy/" target="_blank">我爱佳娃</a> 2007-03-13 21:17 <a href="http://www.blogjava.net/alwayscy/archive/2007/03/13/103628.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>