• 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
  • 相关阅读:
    企业级管理软件快速开发平台在同一个数据库上进行多个系统开发
    企业级管理软件快速开发平台设计思想分享
    由IT代码工转行做销售2年,给自己的销售管理团队做了个CRM,欢迎大家批评指正!
    探讨未来平台化开发技术
    企业级管理软件快速开发平台极致业务基础平台开发效果一览
    封装原生js的Ajax方法
    正则表达式之圆括号(转)
    完美/兼容版添加事件以及删除事件
    判断浏览器版本及浏览器类型
    使用Normalize.css重置默认样式
  • 原文地址:https://www.cnblogs.com/easy5weikai/p/3746322.html
Copyright © 2020-2023  润新知