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

推荐订阅源

V
Vulnerabilities – Threatpost
月光博客
月光博客
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
美团技术团队
Last Week in AI
Last Week in AI
Jina AI
Jina AI
P
Privacy International News Feed
有赞技术团队
有赞技术团队
WordPress大学
WordPress大学
宝玉的分享
宝玉的分享
T
Tenable Blog
阮一峰的网络日志
阮一峰的网络日志
P
Proofpoint News Feed
T
Tailwind CSS Blog
Apple Machine Learning Research
Apple Machine Learning Research
P
Privacy & Cybersecurity Law Blog
人人都是产品经理
人人都是产品经理
S
Schneier on Security
Google DeepMind News
Google DeepMind News
爱范儿
爱范儿
C
Cisco Blogs
K
Kaspersky official blog
C
Cybersecurity and Infrastructure Security Agency CISA
Hugging Face - Blog
Hugging Face - Blog
博客园_首页
O
OpenAI News
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
IT之家
IT之家
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
酷 壳 – CoolShell
酷 壳 – CoolShell
T
Tor Project blog
博客园 - 【当耐特】
腾讯CDC
V
V2EX
A
Arctic Wolf
Webroot Blog
Webroot Blog
S
Securelist
小众软件
小众软件
大猫的无限游戏
大猫的无限游戏
D
Darknet – Hacking Tools, Hacker News & Cyber Security
博客园 - 三生石上(FineUI控件)
The GitHub Blog
The GitHub Blog
量子位
J
Java Code Geeks
博客园 - 叶小钗
S
SegmentFault 最新的问题
Project Zero
Project Zero
www.infosecurity-magazine.com
www.infosecurity-magazine.com
Scott Helme
Scott Helme
Cyberwarzone
Cyberwarzone

博客园 - 涤生

Enterprise Library Caching Application Block(CAB)源代码研究之缓存条目清理后台线程篇 了解ASP.NET底层架构(网络上的翻译) EditPlus中的正则表达式使用--如何使用查找到的原字符 Spring.Net学习笔记一——入门、第一个例子 CodeSmith4.0.2连接SqlServer2005――不允许远程连接 Nhibernate继承类的写法 One2One主键关联的实现 NHibernate基础学习时遇到的问题 NHibernate学习之一:Many2One遇到的问题 自动提取网页的信息 ,并分析之 权限学习--BlueDavy之技术Blog漫谈权限系统之结尾篇(开源产品、个人观点、知识体系) 权限学习--BlueDavy之技术Blog漫谈权限系统之基于ACL的实现 权限设计学习篇--BlueDavy之技术Blog - 漫谈权限系统之技术策略以及基于RBAC ... 权限设计-之学习篇--来源于BlueDavy之技术Blog Oracle数据库发生Ora-12162错误 Linux下Oracle文件的自动备份与ftp自动上传 BugFree安装手记 CodeSmith3.0x中Oracle的访问 Asp.Net StartKits之Asp.Net Issue Tracker Starter Kit-数据库
many2many的写法与注意点
涤生 · 2007-07-19 · via 博客园 - 涤生

所谓many2many就是多对多关系,如人员与权限;人员与部门等。

多对多可以将关联表作为一个实体,相关系的表均采用One2Many方法引用这个关联实体。另外一种就是采用真正的Many2Many方式,如下:

在这种情况下,多对多操纵的是三张表,但只有两个实体类。中间的关系表在Nhibernate中是不当作实体来处理的。

示例代码用的是人员与部门。两个类的写法相同,本文以User与Department为例子。

Department.Hbm.xml

<bag name="Users" table="TBL_USER_DEP" lazy="true">

      
<key column="DEPARTMENT_ID"/>

      
<many-to-many column="USER_ID" class="NHibernateStudy.Domain.User, NHibernateStudy.Domain"/>

</bag>

注意:name 属性为在Department类中引用的User数据的名称;

      Table属性:为关联表的名称;lazy属性为延迟加载

严重注意:此处不能加入Inverse=true,刚开始加入这个,导致关系表数据插入不进去。仔细思考一下可知,此时关联表对应的无实体类,而将inverse=true实际上是将关系交给many即关联表对应的实体类,而关联表压根没有实体类,所以也就不可能插入。

       Key column属性指定当前类在关联表中的列的名称,即关联表与该表连接的外键名称

       Many-to-many属性 column:指定,对应的那个类在关联表中的字段,对于Deparment来说就是User类对应的表在关联表中的列。即关联表与User类对应表连接的外键名称。

Cs

private IList<User> users = new List<User>();

public virtual IList<User> Users

        
{

            
get return users; }

            
set { users = value; }

        }


注意: 在变量声明时即生成数组实例。也可以在构造函数中完成此操作。

编译与调用



protected void Button4_Click(object sender, EventArgs e)

    
{

        NHibernateStudy.Domain.User newUser 
= new NHibernateStudy.Domain.User();

        

        newUser.UserName 
= "zhyuque";

        newUser.Password 
= "abc1231";

        newUser.EmailAddress 
= "zhyuque@cool.com1";

        newUser.LastLogon 
= DateTime.Now;

 

        Deparment newDep 
= new Deparment();

        newDep.Name 
= "新员工培训部";

 

       Deparment newDep1 
= new Deparment();

        newDep1.Name 
= "人事部";

 

        newUser.Deparments.Add(newDep);

        newUser.Deparments.Add(newDep1);

        
//newDep.Users.Add(newUser);  加入此句话,导致关联表主键重复

        
//newDep1.Users.Add(newUser); 加入此句话,导致关联表主键重复

 

 

        
string sTmp = "Congratulate, We are succeed!";

        ISession session 
= Sessions.GetSession();

        ITransaction trans 
= session.BeginTransaction();

 

        
try

        
{

            session.Save(newDep);

            session.Save(newDep1);

            session.Save(newUser);

           

            trans.Commit();

        }


        
catch

        
{

            trans.Rollback();

            sTmp 
= "Sorry, Please try again!";

        }


        
finally

        
{

            session.Close();

        }


 

        
this.TbxHello.Text = sTmp;

        

}


在调用与编译中一共出现两个问题

1) 关联表数据无法插入,问题解决见上文inverse=true;

2) 插入数据报异常。关键问题就是

        newUser.Deparments.Add(newDep);

        newUser.Deparments.Add(newDep1);

        
//newDep.Users.Add(newUser);  加入此句话,导致关联表主键重复

        
//newDep1.Users.Add(newUser); 加入此句话,导致关联表主键重复

如果互相加入,会导致主键重复,所以只需要有一方操作关联表即可