要点:

1.

<!--双向关联时要用:
inverse:由子表来维护关系,cascade:级联的关系 如果没有这个设置,
插入Customer成功(即使现在Order插入Order抛异常,这时产生了垃圾数据,
好的做法是用事务两者都能插入,避免垃圾数据的产生-->
<!--经测试:只需要在主表配置cascade="all",而子表不用配置cascade="all",
当删除主表实体时,子表的级联实体也会被删除-->
<!--cascade有4种??是吗??,分别表示级联操作的4种操作:
cascade = "none": 不能执行操作(有子时不给删父),经测试,为none时,添加父时没有自动添加子
cascade = "all" : 1.级联(删父时删子),经测试,为all时,添加父时自动添加子,
2.经测试,当设置cascade = "all",MS SQL Server设置删除和更新操作虽然设置为:不执行操作,却被覆盖为联级
cascade = "null": (删父时子设置为null),但经测试Nhibernate不支持这个值
cascade = "???": 删父时子设置为默认值-->

<set name="Orders" table="Order" generic="true"
inverse="true" cascade="all"> <key column="CustomerId" foreign-key="FK_CustomerOrders"/>
<one-to-many class="Model.Order,Model"/>
</set>

2

Custmer.cs

 using Iesi.Collections.Generic;
using System;
using System.Linq;
using System.Text; namespace Model
{
public class Customer
{
public virtual int CustomerId{ get; set; }
public virtual String FirstName { get; set; }
public virtual String LastName { get; set; } public virtual int Age { get; set; }
public virtual int Version { get; set; } private ISet<Order> _orders = new HashedSet<Order>();
public virtual ISet<Order> Orders
{
get { return _orders; }
set { this._orders = value; }
} }
}

Customer.hbm.xml

 <?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
namespace="Model"
assembly="Model"
default-lazy="true"> <class name="Model.Customer, Model"
discriminator-value="">
<!--unsaved-value="" 主键表中不需要定义,而是需要在子表中定义-->
<id name="CustomerId"
column="CustomerId"
type="Int32"
unsaved-value="">
<generator class="native" />
<!-- unsaved-value used to be null and generator was increment in h2.0.3 -->
</id> <!--version标签必须放在Id后面,否则出错-->
<version name="Version"/> <property name="FirstName" >
<column name="Firstname" length="" not-null="true"/>
</property> <property name="LastName" type="String">
<column name="Lastname"/>
</property> <property name="Age" type="int">
<column name="Age"/>
</property> <!--双向关联时要用:
inverse:由子表来维护关系,cascade:级联的关系 如果没有这个设置,
插入Customer成功(即使现在Order插入Order抛异常,这时产生了垃圾数据,
好的做法是用事务两者都能插入,避免垃圾数据的产生-->
<!--经测试:只需要在主表配置cascade="all",而子表不用配置cascade="all",
当删除主表实体时,子表的级联实体也会被删除-->
<!--cascade有4种??是吗??,分别表示级联操作的4种操作:
cascade = "none": 不能执行操作(有子时不给删父),经测试,为none时,添加父时没有自动添加子
cascade = "all" : .级联(删父时删子),经测试,为all时,添加父时自动添加子,
.经测试,当设置cascade = "all",MS SQL Server设置删除和更新操作虽然设置为:不执行操作,却被覆盖为联级
cascade = "null": (删父时子设置为null),但经测试Nhibernate不支持这个值
cascade = "???": 删父时子设置为默认值-->
<set name="Orders" table="Order" generic="true"
inverse="true" cascade="all"> <key column="CustomerId" foreign-key="FK_CustomerOrders"/>
<one-to-many class="Model.Order,Model"/>
</set>
</class>
</hibernate-mapping>

Order.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace Model
{
public class Order
{
public virtual int OrderId { get; set; }
public virtual DateTime OrderDate { get; set; }
public virtual Customer Customer { get; set; } public virtual int Version { get; set; }
}
}

Order.hbm.xml

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
namespace="Model"
assembly="Model"
default-lazy="true"> <!--table ="[Order]"因为Order是SQL关键字,表名如果不添加中括号[]会抛异常-->
<!--unsaved-value="" 主键表中不需要定义,而是需要在子表中定义
unsaved-value id的类型是对象类型(如Int32等)unsaved-value不用显示标出来,因为unsaved-value默认值是null
unsaved-value默认值是null,
作用是:用于判断实体对象是新new的内存对象,还是应经持久化的对象,Nhibernate会从数据库中去获取
该实体对象的Id与unsaved-value的值比较(如果持久化,id不等于null,当然也就不等于默认值为unsaved-value): .实体对象的Id与unsaved-value的值,相等,说明调用Save()添加,
.实体对象的Id与unsaved-value的值,不相等相等,调用Update(), 并在如果
-->
<class name="Model.Order, Model"
table ="[Order]"
discriminator-value="" lazy="false">
<id name="OrderId"
column="OrderId"
type="Int32"
unsaved-value="">
<generator class="native" />
<!-- unsaved-value used to be null and generator was increment in h2.0.3 -->
</id> <!--version标签必须放在Id后面,否则出错-->
<!--<version name="Version"/>--> <property name="OrderDate" type="DateTime" not-null="true">
<column name="OrderDate" />
</property> <many-to-one name="Customer" not-null="true">
<column name="CustomerId" />
</many-to-one> </class>
</hibernate-mapping>

01-03-02-1【Nhibernate (版本3.3.1.4000) 出入江湖】CRUP操作--cascade 级联相关的更多相关文章

  1. 01-08-05【Nhibernate (版本3.3.1.4000) 出入江湖】NHibernate二级缓存:第三方MemCache缓存

    一.准备工作 [1]根据操作系统(位数)选择下载相应版本的MemCache, MemCache的下载和安装,参看: http://www.cnblogs.com/easy5weikai/p/37606 ...

  2. 01-03-02-2【Nhibernate (版本3.3.1.4000) 出入江湖】CRUP操作-Save方法的一些问题

    此文由于当时不知道NHibernate的Sava方法不是更新操作,不知道Save就是Add,造成如下荒唐的求证过程,但结论是对的 ,可报废此文,特此声明. NHibernate--Save方法: Cu ...

  3. 01-01-01【Nhibernate (版本3.3.1.4000) 出入江湖】配置文件

    默认配置文件名称是:hibernate.cfg.xml 放置在应用程序集的根目录下 <?xml version="1.0" encoding="utf-8" ...

  4. 01-04-02【Nhibernate (版本3.3.1.4000) 出入江湖】HQL查询

    public IList<Customer> GetAllHql() { IList<Customer> result = null; ISession session = _ ...

  5. 01-07-01【Nhibernate (版本3.3.1.4000) 出入江湖】并发控制

    Nhibernate 并发控制 [1]悲观并发控制 正在使用数据的操作,加上锁,使用完后解锁释放资源. 使用场景:数据竞争激烈,锁的成本低于回滚事务的成本 缺点:阻塞,可能死锁 [2]乐观并发控制: ...

  6. 01-03-03【Nhibernate (版本3.3.1.4000) 出入江湖】cascade的测试

    相关文章: http://www.cnblogs.com/amboyna/archive/2008/02/18/1072260.html注意上面是hibernate,不是Nhibernate,这解释是 ...

  7. 01-03-01【Nhibernate (版本3.3.1.4000) 出入江湖】id标签的unsaved-value属性

    父表 <class name="Model.Customer, Model" discriminator-value="0"> <!--uns ...

  8. 01-08-03【Nhibernate (版本3.3.1.4000) 出入江湖】二级缓存:NHibernate自带的HashtableProvider之缓存管理

    http://www.cnblogs.com/lyj/archive/2008/11/28/1343418.html 管理NHibernate二级缓存 NHibernate二级缓存由ISessionF ...

  9. 01-08-04【Nhibernate (版本3.3.1.4000) 出入江湖】二级缓存:NHibernate自带的HashtableProvider之命名缓存

    http://www.cnblogs.com/lyj/archive/2008/11/28/1343418.html 可以在映射文件中定义命名查询,<query>元素提供了很多属性,可以用 ...

随机推荐

  1. MVC 模型js远程校验的使用方法

    我们在网站注册的时候往往需要在用户注册完毕的时候显示用户名是否可用,这就要用到模型的远程校验了.具体如下. [Required(ErrorMessage = "用户名不能为空"), ...

  2. 10款经典的web前端特效的预览及源码

    1.CSS3响应式导航菜单 今天我给大家介绍一下如何使用纯CSS来实现的一个响应式导航菜单,我们使用的是HTML5+CSS3技术,当浏览器窗口变小或者使用手机浏览器访问的时候,原本横条菜单会收缩成一个 ...

  3. Android四大组件之一:Activity

    介绍:活动是最基本的Android组件之一,在应用程序中,一个活动通常就是一个用户界面,每一个活动都被实现为一个独立的类,并且从活动几类中继承, 活动类将会显示由View控件组成的用户接口,并对时间E ...

  4. unity打包android游戏部分问题总结

    一:虚拟导航栏挡到游戏按钮: 解决方案如下: 1.获取焦点的时候隐藏 虚拟导航条 Navigation bar 隐藏导航条 2.出现导航条的时候,改变游戏界面大小 Unity tidbits: cha ...

  5. C#操作Excel基本操作

    /// using Microsoft.Office.Core; using Microsoft.Office.Interop.Excel; using System.IO; using System ...

  6. 基础学习总结(四)---内存获取、XML之PULL解析

    外部项目引入如果没找到工程文件要先创建一个android项目在引入. 根据要查看的项目名在项目中搜索逐步查看 ==================== 内存详情获取: public class Mai ...

  7. Silverlight动画的基本知识、关键帧动画

    基础知识 (一)动画:是快速播放一系列图像(其中每个图像与下一个图像略微不同)给人造成的一种幻觉 (二)动画类型:两类    (1)From/To/By动画:在起始值和结束值之间进行动画处理.     ...

  8. 配置Windows 2008 R2 64位 Odoo 8.0/9.0 源码开发调试环境

    安装过程中,需要互联网连接下载python依赖库: 1.安装: Windows Server 2008 R2 x64标准版 2.安装: Python 2.7.10 amd64 到C:\Python27 ...

  9. MediaRecorder类介绍

    audiocallbackvideojavadescriptorencoding 目录(?)[+] 找到个MediaRecorder类介绍和大家分享一下. Mediarecorder类在官网的介绍和在 ...

  10. Ubuntu12.10编译openwrt遇到的错误

    由于Openwrt有很多工具是要先编译的,在Ubuntu12.10平台下编译openwrt时就遇到了下面这样的错误:elf.cpp: In static member function 'static ...