Hibernate中雙向維護產生的多餘sql問題
阿新 • • 發佈:2019-02-04
這裡我們就不展示關於java實體類的程式碼了,想必各位程式設計師看完下面的xml檔案之後也就會知道實體類的程式碼了。 Customer.hbm.xml檔案中的程式碼如下:<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="domain.Customer" table="cst_customer"> <id name="cust_id"> <generator class="native"></generator> </id> <property name="cust_name"></property> <property name="cust_source"></property> <property name="cust_industry"></property> <property name="cust_level"></property> <property name="cust_phone"></property> <property name="cust_mobile"></property> <!-- one_to_many --> <set name="linkMans" cascade="save-update,delete"> <key column="lkm_cust_id"></key> <one-to-many class="domain.LinkMan"/> </set> </class> </hibernate-mapping>
LinkMan.hbm.xml檔案中的程式碼如下:測試類程式碼如下:<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="domain.LinkMan" table="cst_linkman"> <id name="lkm_id"> <generator class="native"></generator> </id> <property name="lkm_name"></property> <property name="lkm_gender"></property> <property name="lkm_phone"></property> <property name="lkm_mobile"></property> <property name="lkm_email"></property> <property name="lkm_qq"></property> <property name="lkm_postion"></property> <property name="lkm_memo"></property> <!-- customer代表本類屬性中的物件名稱 class:;一的一方的全路徑 column:本類對應本表的外來鍵 --> <many-to-one name="customer" class="domain.Customer" column="lkm_cust_id" cascade="save-update,delete"></many-to-one> </class> </hibernate-mapping>
輸出的結果如下: 我們從輸出結果中可以發現更改了兩次的lkm_cust_id的值,這是為什麼呢?這是因為在每個物件中都還有外來鍵對應的屬性,而又因為我們設定了相互關係,,從而導致我們在每次儲存資料時都會修改lkm_cust_id的值,讓查詢的效能降低,那麼我們怎麼去解決這個問題呢?我們通過讓一方放棄對外來鍵的維護權就可以解決這類問題,通常是讓一的一方去放棄外來鍵的維護權,因為一的一方維護外來鍵相對比較麻煩。 放棄外來鍵維護權就是要在Customer.hbm.xml的檔案中的<set>標籤上新增 inverse=false。 實際修改如下:@Test public void test6(){ Session session = HibernateUtil.getCurrentSession(); Transaction tx = session.beginTransaction(); /* * 這裡不用寫session.update的原因是因為查詢出之後物件處於持久態,能夠自動 * 更新資料庫。 */ Customer customer = session.get(Customer.class, 2l); LinkMan linkMan = session.get(LinkMan.class, 2l); customer.getLinkMans().add(linkMan); linkMan.setCustomer(customer); tx.commit(); }
<set name="linkMans" cascade="save-update,delete" inverse="false"> <key column="lkm_cust_id"></key> <one-to-many class="domain.LinkMan"/> </set>