Nhibernate学习之many-to-many篇(转 明了篇)

  1. 学习目的:

通过进一步学习Nhibernate基础知识,掌握用Nhiberate实现多对多的业务逻辑

  1. 开发环境+必要准备

  开发环境: windows 2003,Visual studio .Net 2005,Sql server 2005 developer edition

      前期准备: 学习上两篇单表操作many-to-one篇
 

3.对上篇文章的部分解释

 1)bag节点:用于定义System.Collection.IList类型的集合元素。

属性

用法

举例

name

映射的属性(必须)

name=”SalaryList”

table

映射的数据表(可选) table=”Salary”
lazy 延迟加载(可选) Lazy=true|false
cascade 指示级联操作方式(可选) Cascade=all
inverse 关联由谁负责维护 Inverse=”true”

当lazy=”true”,父类初始化的时候不会自动加载子类集合

 Cascade为级联操作方式,包括: 

属性 用法说明
none 默认值,不进行级联操作
save-update save和update级联
delete 删除级联
delete-orphan 删除不相关的父对象的子对象
all save/update/delete级联
all-delete-orphan all+delete-arphan
  当inverse=”true”的时候代表由子类维护级联关系。这时候如果只往父类中添加子类,但不设定子类的父类,是不能保存子类的

 4.多对多业务模型

    还是用户系统,1个用户职员隶属于多个部门,同时1个部门有多个不同的职员 
    用户和部门之间的数据关系图为:

5.  实现步骤:
  1)User.cs


using System;
using System.Collections.Generic;
using System.Text;

namespace NhibernateSample1
{
    
public class User
    
{
        
private int _id;
        
private string _name;
        
private string _pwd;
        
private System.Collections.IList _departmentsList;
        
/// <summary>
        
/// 编号
        
/// </summary>

        public virtual int Id
        
{
            
get
            
{
                
return _id;
            }

            
set
            
{
                _id 
= value;
            }

        }


        
/// <summary>
        
/// 名称
        
/// </summary>

        public virtual string Name
        
{
            
get
            
{
                
return _name;
            }

            
set
            
{
                _name 
= value;
            }

        }


        
/// <summary>
        
/// 密码
        
/// </summary>

        public virtual string Pwd
        
{
            
get
            
{
                
return _pwd;
            }

            
set
            
{
                _pwd 
= value;
            }

        }

        
/// <summary>
        
/// 工资列表
        
/// </summary>

        public System.Collections.IList DepartmentsList
        
{
            
get
            
{
                
return _departmentsList;
            }

            
set
            
{
                _departmentsList 
= value;
            }

        }

    }

}

  2)User.hbm.xml 


<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
  
<class name="NhibernateSample1.User,NhibernateSample1" table="Users" lazy="false">
    
<id name="Id" column="Id" unsaved-value="0">
      
<generator class="native" />
    
</id>
    
<property name="Name" column="Name" type="string" length="64" not-null="true" unique="true"></property>
    
<property name="Pwd"  column="Pwd"  type="string" length="64" not-null="true"></property>
    
<bag name="DepartmentsList" table="Users_Departments" inverse="true" lazy="false" cascade="all">
      
<key column="Id"/>
      
<many-to-many class="NhibernateSample1.Departments,NhibernateSample1" column="DepID"></many-to-many>
    
</bag>
  
</class>
</hibernate-mapping>
  3) Departments.cs

using System;
using System.Collections.Generic;
using System.Text;
using System.Collections;

namespace NhibernateSample1
{
    
public class Departments
    
{
        
int _depID;
        
string _name;
        IList _usersList
= new ArrayList();
        
public virtual int DepID
        
{
            
get
            
{
                
return _depID;
            }

            
set
            
{
                _depID 
= value;
            }

        }

        
public virtual string Name
        
{
            
get
            
{
                
return _name;
            }

            
set
            
{
                _name 
= value;
            }

        }

        
public virtual IList UsersList
        
{
            
get
            
{
                
return _usersList;
            }

            
set
            
{
                _usersList 
= value;
            }

        }

    }

}

4) Departments.hbm.xml

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
  
<class name="NhibernateSample1.Departments,NhibernateSample1" table="Departments" lazy="false">
    
<id name="DepID" column="DepID" unsaved-value="0">
      
<generator class="native" />
    
</id>
    
<property name="Name" column="Name" type="string" length="64" not-null="true" unique="true"></property>   
    
<bag name="UsersList" table="Users_Departments"  lazy="true" >
      
<key column="DepID"/>
      
<many-to-many class="NhibernateSample1.User,NhibernateSample1" column="Id"></many-to-many>
    
</bag>
  
</class>
</hibernate-mapping>
5) 数据操作类 

using System;
using System.Collections.Generic;
using System.Text;
using System.Collections;
using NHibernate;
using NHibernate.Cfg;
using NHibernate.Tool.hbm2ddl;

namespace NhibernateSample1
{
    
public  class UserDepartmentFixure
    
{
        
private ISessionFactory _sessions; 
        
public void Configure()
        
{
            Configuration cfg 
= GetConfiguration();      
            _sessions 
= cfg.BuildSessionFactory();
        }

        Configuration GetConfiguration()
        
{
            
string cfgPath = @"E:\my project\nhibernate study\simle 1\NHibernateStudy1\NhibernateSample1\hibernate.cfg.xml";
            Configuration cfg 
= new Configuration().Configure(cfgPath);
            
return cfg;
        }

        
public void ExportTables()
        
{
            Configuration cfg 
= GetConfiguration();           
            
new SchemaExport(cfg).Create(truetrue);
        }

        
public User CreateUser(String name,string pwd)
        
{
            User u 
= new User();
            u.Name 
= name;
            u.Pwd 
= pwd;
            u.DepartmentsList 
= new ArrayList();

            ISession session 
= _sessions.OpenSession();

            ITransaction tx 
= null;

            
try
            
{
                tx 
= session.BeginTransaction();
                session.Save(u);
                tx.Commit();
            }

            
catch (HibernateException e)
            
{
                
if (tx != null) tx.Rollback();
                
throw e;
            }

            
finally
            
{
                session.Close();
            }


            
return u;
        }

        
public Departments CreateDepartments(User u, string name)
        
{
            Departments item 
= new Departments();
            item.Name
=name;
            u.DepartmentsList.Add(item);
            item.UsersList.Add(u);
            ISession session 
= _sessions.OpenSession();
            ITransaction tx 
= null;

            
try
            
{
                tx 
= session.BeginTransaction();
                session.Save(item);
                tx.Commit();
            }

            
catch (HibernateException e)
            
{
                
if (tx != null) tx.Rollback();
                
throw e;
            }

            
finally
            
{
                session.Close();
            }

            
return item;
        }
       
        
public Departments GetDepartments(int depID)
        
{
            ISession session 
= _sessions.OpenSession();
            ITransaction tx 
= null;
            
try
            
{
                tx 
= session.BeginTransaction();
                Departments item 
= (Departments)session.Load(typeof(Departments),
                    depID);               
                tx.Commit();
                
return item;
            }

            
catch (HibernateException e)
            
{
                
if (tx != null) tx.Rollback();
                
return null;
            }

            
finally
            
{
                session.Close();
            }

            
return null;
        }

        
public User GetUser(int uid)
        
{
            ISession session 
= _sessions.OpenSession();
            ITransaction tx 
= null;
            
try
            
{
                tx 
= session.BeginTransaction();
                User item 
= (User)session.Load(typeof(User),
                    uid);
                tx.Commit();
                
return item;
            }

            
catch (HibernateException e)
            
{
                
if (tx != null) tx.Rollback();
                
return null;
            }

            
finally
            
{
                session.Close();
            }

            
return null;
        }
       

        
public void Delete(int uid)
        
{
            ISession session 
= _sessions.OpenSession();
            ITransaction tx 
= null;
            
try
            
{
                tx 
= session.BeginTransaction();
                Departments item 
= session.Load(typeof(Departments), uid) as Departments;
                session.Delete(item);
                tx.Commit();
            }

            
catch (HibernateException e)
            
{
                
if (tx != null) tx.Rollback();
                
throw e;
            }

            
finally
            
{
                session.Close();
            }

        }


    }

}

6)单元测试类

using System;
using System.Text;
using System.Collections.Generic;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using NhibernateSample1;

namespace TestProject1
{
    
/// <summary>
    
/// UnitTest1 的摘要说明
    
/// </summary>

    [TestClass]
    
public class UnitTest1
    
{
        
public UnitTest1()
        
{
            
//
            
// TODO: 在此处添加构造函数逻辑
            
//
        }

        NhibernateSample1.UserDepartmentFixure usf 
= new UserDepartmentFixure();
        
其他测试属性

        [TestMethod]
        
public void Test1()
        
{
            usf.Configure();
            usf.ExportTables();
            User u 
= usf.CreateUser(Guid.NewGuid().ToString(), "ds");
            Assert.IsTrue(u.Id
>0);
            Departments s 
= usf.CreateDepartments(u, "政治部");
            Assert.IsTrue(s.DepID 
> 0);
            Departments s1 
= usf.CreateDepartments(u, "事业部");
            Assert.IsTrue(s1.DepID 
> 0);         
            usf.Delete(s1.DepID);
            s1 
= usf.GetDepartments(s1.DepID);
            Assert.IsNull(s1);
            User u1 
= usf.GetUser(1);
            Assert.IsTrue(u1.DepartmentsList.Count
>0);
        }


    }

}

posted @ 2008-09-04 17:39  YFeng_Lee  阅读(492)  评论(0编辑  收藏  举报