1. 程式人生 > >Hibernate中雙向維護產生的多餘sql問題

Hibernate中雙向維護產生的多餘sql問題

這裡我們就不展示關於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>
測試類程式碼如下:
@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();
	}
輸出的結果如下:     我們從輸出結果中可以發現更改了兩次的lkm_cust_id的值,這是為什麼呢?這是因為在每個物件中都還有外來鍵對應的屬性,而又因為我們設定了相互關係,,從而導致我們在每次儲存資料時都會修改lkm_cust_id的值,讓查詢的效能降低,那麼我們怎麼去解決這個問題呢?我們通過讓一方放棄對外來鍵的維護權就可以解決這類問題,通常是讓一的一方去放棄外來鍵的維護權,因為一的一方維護外來鍵相對比較麻煩。     放棄外來鍵維護權就是要在Customer.hbm.xml的檔案中的<set>標籤上新增 inverse=false。     實際修改如下:
<set name="linkMans" cascade="save-update,delete" inverse="false">
			<key column="lkm_cust_id"></key>
			<one-to-many class="domain.LinkMan"/>
		</set>