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

要点:

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


 1 using Iesi.Collections.Generic;
2 using System;
3 using System.Linq;
4 using System.Text;
5
6 namespace Model
7 {
8 public class Customer
9 {
10 public virtual int CustomerId{ get; set; }
11 public virtual String FirstName { get; set; }
12 public virtual String LastName { get; set; }
13
14 public virtual int Age { get; set; }
15 public virtual int Version { get; set; }
16
17 private ISet<Order> _orders = new HashedSet<Order>();
18 public virtual ISet<Order> Orders
19 {
20 get { return _orders; }
21 set { this._orders = value; }
22 }
23
24 }
25 }

Customer.hbm.xml


 1 <?xml version="1.0" encoding="utf-8" ?>
2 <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
3 namespace="Model"
4 assembly="Model"
5 default-lazy="true">
6
7 <class name="Model.Customer, Model"
8 discriminator-value="0">
9 <!--unsaved-value="0" 主键表中不需要定义,而是需要在子表中定义-->
10 <id name="CustomerId"
11 column="CustomerId"
12 type="Int32"
13 unsaved-value="0">
14 <generator class="native" />
15 <!-- unsaved-value used to be null and generator was increment in h2.0.3 -->
16 </id>
17
18 <!--version标签必须放在Id后面,否则出错-->
19 <version name="Version"/>
20
21 <property name="FirstName" >
22 <column name="Firstname" length="50" not-null="true"/>
23 </property>
24
25 <property name="LastName" type="String">
26 <column name="Lastname"/>
27 </property>
28
29 <property name="Age" type="int">
30 <column name="Age"/>
31 </property>
32
33 <!--双向关联时要用:
34 inverse:由子表来维护关系,cascade:级联的关系 如果没有这个设置,
35 插入Customer成功(即使现在Order插入Order抛异常,这时产生了垃圾数据,
36 好的做法是用事务两者都能插入,避免垃圾数据的产生-->
37 <!--经测试:只需要在主表配置cascade="all",而子表不用配置cascade="all",
38 当删除主表实体时,子表的级联实体也会被删除-->
39 <!--cascade有4种??是吗??,分别表示级联操作的4种操作:
40 cascade = "none": 不能执行操作(有子时不给删父),经测试,为none时,添加父时没有自动添加子
41 cascade = "all" : 1.级联(删父时删子),经测试,为all时,添加父时自动添加子,
42 2.经测试,当设置cascade = "all",MS SQL Server设置删除和更新操作虽然设置为:不执行操作,却被覆盖为联级
43 cascade = "null": (删父时子设置为null),但经测试Nhibernate不支持这个值
44 cascade = "???": 删父时子设置为默认值-->
45 <set name="Orders" table="Order" generic="true"
46 inverse="true" cascade="all">
47
48 <key column="CustomerId" foreign-key="FK_CustomerOrders"/>
49 <one-to-many class="Model.Order,Model"/>
50 </set>
51 </class>
52 </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="0" 主键表中不需要定义,而是需要在子表中定义
unsaved-value id的类型是对象类型(如Int32等)unsaved-value不用显示标出来,因为unsaved-value默认值是null
unsaved-value默认值是null,
作用是:用于判断实体对象是新new的内存对象,还是应经持久化的对象,Nhibernate会从数据库中去获取
该实体对象的Id与unsaved-value的值比较(如果持久化,id不等于null,当然也就不等于默认值为unsaved-value):

1.实体对象的Id与unsaved-value的值,相等,说明调用Save()添加,
2.实体对象的Id与unsaved-value的值,不相等相等,调用Update(),

并在如果
-->
<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>

<!--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
级联相关

时间: 2024-08-09 10:28:08

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

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

http://www.cnblogs.com/lyj/archive/2008/11/28/1343418.html 管理NHibernate二级缓存 NHibernate二级缓存由ISessionFactory创建并由ISessionFactory自行维护.我们使用NHibernate操作数据时,ISessionFactory能够自动同步缓存,保证缓存的有效性.但是当我们批量操作数据时,往往NHibernate不能维护缓存持久有效.ISessionFactory提供了可编程方式的缓存管理方法.

01-06-01【Nhibernate (版本3.3.1.4000) 出入江湖】事务

Nhibernate事务的使用: public void Add(Customer customer) { ISession session = _sessionManager.GetSession(); ITransaction transaction = session.BeginTransaction(); try { session.Save(customer); session.Flush();//清除一级缓存 transaction.Commit(); } catch (Except

01-08-01【Nhibernate (版本3.3.1.4000) 出入江湖】NHibernate中的三种状态

以下属于不明来源资料: 引入 在程序运行过程中使用对象的方式对数据库进行操作,这必然会产生一系列的持久化类的实例对象.这些对象可能是刚刚创建并准备存储的,也可能是从数据库中查询的,为了区分这些对象,根据对象和当前会话的关联状态,我们可以把对象分为三种: 瞬时对象:对象刚刚建立.该对象在数据库中没有记录,也不在ISession缓存中.如果该对象是自动生成主键,则该对象的对象标识符为空. 持久化对象:对象已经通过NHibernate进行了持久化,数据库中已经存在对应的记录.如果该对象是自动生成主键,

01-08-01【Nhibernate (版本3.3.1.4000) 出入江湖】NHibernate中的一级缓存

缓存的范围? 1.事务范围 事务范围的缓存只能被当前事务访问,每个事务都有各自的缓存,缓存内的数据通常采用相互关联的对象形式.缓存的生命周期依赖于事务的生命周期,只有当事务结束时,缓存的生命周期才会结束.事务范围的缓存使用内存作为存储介质,一级缓存就属于事务范围. 2.应用范围 应用程序的缓存可以被应用范围内的所有事务共享访问.缓存的生命周期依赖于应用的生命周期,只有当应用结束时,缓存的生命周期才会结束.应用范围的缓存可以使用内存或硬盘作为存储介质,二级缓存就属于应用范围. 3.集群范围 在集群

01-05-01-1【Nhibernate (版本3.3.1.4000) 出入江湖】延迟加载及其class和集合(set、bag等)的Lazy属性配置组合对Get和Load方法的影响

这篇文章 http://ayende.com/blog/3988/nhibernate-the-difference-between-get-load-and-querying-by-id One of the more common mistakes that I see people doing with NHibernate is related to how they are loading entities by the primary key. This is because the

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

一.准备工作 [1]根据操作系统(位数)选择下载相应版本的MemCache, MemCache的下载和安装,参看: http://www.cnblogs.com/easy5weikai/p/3760677.html [2]第三方MemCache缓存适配器,下载地址: http://sourceforge.net/projects/nhcontrib/files/ 特别说明: 1.一定要版本一致 MemCache缓存适配器写本文的时候最高版本是:NHCH-3.2.0.GA-bin(不支持高版本的N

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

Nhibernate 并发控制 [1]悲观并发控制 正在使用数据的操作,加上锁,使用完后解锁释放资源. 使用场景:数据竞争激烈,锁的成本低于回滚事务的成本 缺点:阻塞,可能死锁 [2]乐观并发控制: 所谓乐观,就是乐观的认为其他人没有在用该资源,资源的使用者不加锁. A 读取数据后,如果该数据被别人B修改,产生错误,A回滚事务并重新开始. 使用场景:数据竞争不激烈,回滚事务的成本低于锁的成本. ---------------------------------------------------

01-04-01【Nhibernate (版本3.3.1.4000) 出入江湖】原生的SQL查询

Nhibernate 支持原生的SQL查询 : 1 /// <summary> 2 /// 使用原生的SQL查询 3 /// </summary> 4 /// <param name="datetime"></param> 5 /// <returns></returns> 6 public IList<Customer> GetCustomersByDateTimeUsingSql(string da

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

NHibernate--Save方法: CustomerService.cs 1 public void Save(Customer customer) 2 { 3 ISession session = _sessionManager.GetSession(); 4 ITransaction transaction = session.BeginTransaction(); 5 6 try 7 { 8 session.Save(customer); 9 transaction.Commit();