1. 程式人生 > >hibernate級聯處理問題

hibernate級聯處理問題

hibernate進行級聯處理時,關於一對一的關係應該注意的問題。

1、假如有獎品項item和獎品aword,他們之間的對應關係是

  1)item      1:1    aword獎品項與獎品是一對一的關係,一個獎品項只能包含一個獎品。

  2)aword   1:n    item獎品與獎品項是一對多的關係,一個獎品可以出現在多個獎品項中。

2、在進行hibernate註解配置的時候,他們的關係應該如下:

1)entity   Item

<span style="white-space:pre">	</span>//紅包,一對一
<span style="white-space:pre">	</span>//將在item表中建立awordId欄位。
<span style="white-space:pre">	</span>//級聯只選擇更新,表示資料更新時,item更新,這裡不要級聯刪除,因為獎品項刪除不會影響到獎品
<span style="white-space:pre">	</span>@ManyToOne(cascade = {CascadeType.REFRESH}, fetch = FetchType.LAZY,optional = true)
<span style="white-space:pre">	</span>@JoinColumn(name = "awordId")
<span style="white-space:pre">	</span>private Aword aword;
2)entity  aword
	//紅包與轉盤的獎品項是一對多的關係,如果刪除紅包,那麼紅包對應的所有大轉盤獎項也應該刪除。
<span style="white-space:pre">	</span>//mappedBy欄位表明關聯到item表中的aword,關聯關係有aword來維護,如果獎品刪除了,那麼對應的所有的獎品項也要刪除
	@OneToMany(mappedBy="aword" , cascade = {CascadeType.REMOVE,CascadeType.REFRESH},fetch = FetchType.LAZY)
	private List<Item> items;
3、有了以上的hibernate級聯關係後,刪除獎品項,不會影響到獎品,那麼也不會影響到其他使用了這個獎品的獎品項。這裡還需要注意幾點:

1)在資料庫中,需要在獎品項item中新增外來鍵欄位awordId,因此可以通過這個獎品id取出對應的獎品。

2)在做獎品aword刪除時,切記要使用hibernate的delete刪除方法,如果刪除多個獎品,就用for迴圈刪除。不能使用hibernate呼叫query方法,不能去使用sql刪除資料,否則會繞過hibernate機制,不會進行級聯刪除等操作。有些類似於spring的session,如果你自己openSession,那麼這個session就需要自己開啟關閉,並且還需要放在事務中處理。但是如果使用getCurrentSession,那麼spring會幫你管理這個session,前提你需要在spring配置檔案中配置事務。

4、hibernate如果使用延遲載入機制,如果使用除錯,那麼除錯的資料是看不到的,需要列印,如獎品項item,如果使用延遲載入,除錯是看不到item的資料的,如果想看item的某一個數據,可以列印這個資料。

hibernate延遲載入只會將資料儲存在session中(未確認),那麼如果你在dao層去資料,那麼在service層使用資料時,資料可能報錯,原因時資料取出來後session就會關閉,那麼其他層,或者web就不能得到資料。解決這個問題的方法是,讓延遲載入的範圍擴大到一次請求,可以在web.xml中配置監聽器進行處理。

	<!-- 將hibernate延遲載入擴充套件到一次請求,而不是一個session的範圍 -->
	<filter>
		<filter-name>hibernateOpenSessionInViewFilter</filter-name>
		<filter-class>
			org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>hibernateOpenSessionInViewFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>