01-03-01【Nhibernate (版本3.3.1.4000) 出入江湖】id标签的unsaved-value属性
父表
<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" >
其他资料:
http://www.cnblogs.com/amboyna/archive/2008/02/18/1072260.html