標籤:style c class blog code java
父表
<class name="Model.Customer, Model" discriminator-value="0"> <!--unsaved-value="0" 主鍵表中不需要定義,而是需要在子表中定義--> <id name="CustomerId" column="CustomerId" type="Int32" unsaved-value="0"> <generator class="native" /> <!-- unsaved-value used to be null and generator was increment in h2.0.3 --> </id>
子表
<class name="Model.Order, Model" table ="[Order]" discriminator-value="0" lazy="false"> <id name="OrderId" column="OrderId" type="Int32" unsaved-value="0"> <generator class="native" /> <!-- unsaved-value used to be null and generator was increment in h2.0.3 --> </id>
瞭解unsaved-value,需要知道如下知識點:
1.unsaved-value預設值是null
2.id的type標籤屬性可以標示為:
【1】基本物件類型如int,long
【2】物件類型,如Int32,Int64
3.Nhibernate儲存機制:
當父物件調用save(),由於級聯的關係,儲存子物件,那麼儲存子物件的方式
到底是Upadate(已經持久化在資料庫中)
還是Save(還沒有持久化在資料庫中,只是剛剛在記憶體中新new)?
如何判斷是用調用upadte還是調用Save,
答案是:
用unsaved-value的值與HNibernate自動從資料庫中擷取的子類對象的Id進行比較,
(注意:如果沒有持久化,HNibernate自動從資料庫中擷取的子類對象的Id的值等於null)
如果是:
【1】unsaved-value的值與子類對象的Id相等,表明沒有持久化,調用save;
【2】unsaved-value的值與子類對象的Id不相等,表明已持久化,調用Update;
綜上,
當子表id標籤的type標籤屬性標示為:
【1】基本物件類型如int,long,需要顯示明unsaved-value = 0,因為unsaved-value預設值是null,而基本物件類型如int的預設值為0,
這樣使得即使子類對象還沒有持久化,HNibernate自動從資料庫中擷取的子類對象的Id=0,
這樣根據上述的Nhibernate儲存機制,永遠調用Upadte,不會調用save。
<id name="OrderId" column="OrderId" type="Int" unsaved-value="0">
【2】物件類型,如Int32,Int64,不需要
<id name="OrderId" column="OrderId" type="Int32" >