惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

酷 壳 – CoolShell
酷 壳 – CoolShell
雷峰网
雷峰网
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Spread Privacy
Spread Privacy
H
Hacker News: Front Page
PCI Perspectives
PCI Perspectives
Webroot Blog
Webroot Blog
罗磊的独立博客
H
Heimdal Security Blog
TaoSecurity Blog
TaoSecurity Blog
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
大猫的无限游戏
大猫的无限游戏
月光博客
月光博客
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
Google Online Security Blog
Google Online Security Blog
Last Week in AI
Last Week in AI
美团技术团队
Help Net Security
Help Net Security
The Hacker News
The Hacker News
C
Cisco Blogs
T
The Blog of Author Tim Ferriss
J
Java Code Geeks
The Register - Security
The Register - Security
IT之家
IT之家
WordPress大学
WordPress大学
Jina AI
Jina AI
Recent Commits to openclaw:main
Recent Commits to openclaw:main
H
Help Net Security
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
T
Threat Research - Cisco Blogs
P
Proofpoint News Feed
NISL@THU
NISL@THU
爱范儿
爱范儿
The GitHub Blog
The GitHub Blog
Scott Helme
Scott Helme
V
Vulnerabilities – Threatpost
B
Blog
T
Tenable Blog
博客园 - 三生石上(FineUI控件)
T
The Exploit Database - CXSecurity.com
S
Security Affairs
小众软件
小众软件
Hacker News: Ask HN
Hacker News: Ask HN
Security Latest
Security Latest
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
W
WeLiveSecurity
A
Arctic Wolf
L
LINUX DO - 热门话题
Google DeepMind News
Google DeepMind News
M
MIT News - Artificial intelligence

博客园 - YFeng_Lee

webHttpBinding+wsHttpBinding+basicHttpBinding的区别 (转) AppDomain对于静态对象的独享引用 AppDomain 详解(转) .net工具 InstallShield12 添加自定义对话框,并根据输入值修改对应的Config文件。 普通管理类程序开发之难度系数、层次之说法(转自csdn) 待阅读书目 C#开发Windows Service程序 创建一个windows service应用程序 Ext简介(转) Ext的组件结构分析(转) XML与数据库 分析模式 - 责任模式 NHibernate Cascades: the different between all, all-delete-orphans and save-update 企业开发框架NHibernate和Spring.Net简介-4 企业开发框架NHibernate和Spring.Net简介-3 企业开发框架NHibernate和Spring.Net简介-2 企业开发框架NHibernate和Spring.Net简介-1 Nhibernate学习起步之many-to-one篇(转 明了篇)
Nhibernate学习之many-to-many篇(转 明了篇)
YFeng_Lee · 2008-09-04 · via 博客园 - YFeng_Lee
  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);
        }


    }

}