Nhibernate3循序渐进(三): 一对多映射和级联保存

简介: 我们知道, 对于数据库中的一对多关系, 我们在建表的时候, 应该在多表这里建立外键 我们准备这样一个场景, 大学里的系和学生, 一个系有多个学生 Department类和Xml如下: Department.

我们知道, 对于数据库中的一对多关系, 我们在建表的时候, 应该在多表这里建立外键

 

我们准备这样一个场景, 大学里的系和学生, 一个系有多个学生

 

Department类和Xml如下:

 

Department.cs

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

namespace NHibernate3.Domain
{
     public  class Department
    {
         public  virtual  int? ID {  getset; }

         public  virtual  string Name {  getset; }
    }
}

 

Department..hbm.xml

<? xml version="1.0" encoding="utf-8"  ?>

< hibernate-mapping  xmlns ="urn:nhibernate-mapping-2.2"  assembly ="NHibernate3.Domain"  namespace ="NHibernate3.Domain" >
   < class  name ="Department"  table ="T_Department"  lazy ="true"   >
     < id  name ="ID"  type ="int"  column ="DepartmentID" >
       < generator  class ="native" />
     </ id >
  
     < property  name ="Name"  type ="string" >
       < column  name ="Name"  length ="50" />
     </ property >

   </ class >
</ hibernate-mapping >

 

 

Student类和Xml如下:

 

Student.cs

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

namespace NHibernate3.Domain
{
     public  class Student
    {
         public  virtual  int? ID {  getset; }

         public  virtual  string Name {  getset; }

         public  virtual Department Dept {  getset; }
    }
}

 

 

 

Student.hbm.xml

<? xml version="1.0" encoding="utf-8"  ?>

< hibernate-mapping  xmlns ="urn:nhibernate-mapping-2.2"  assembly ="NHibernate3.Domain"  namespace ="NHibernate3.Domain" >
   < class  name ="Student"  table ="T_Student"  lazy ="true"   >
     < id  name ="ID"  type ="int"  column ="StudentID" >
       < generator  class ="native" />
     </ id >

     < property  name ="Name"  type ="string" >
       < column  name ="Name"  length ="50" />
     </ property >

     < many-to-one  name ="Dept"  column ="DepartmentID"  cascade ="all" />

   </ class >
</ hibernate-mapping >

 

 

保存和查询代码

 

ScSession.cs

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

using NHibernate;
using NHibernate.Cfg;
using NHibernate3.Domain;

namespace NHibernate3.DAL
{
     public  class ScSession
    {
         private ISessionFactory sessionFactory;

         public ScSession()
        {
             var cfg =  new NHibernate.Cfg.Configuration().Configure( " Config/hibernate.cfg.xml ");
            sessionFactory = cfg.BuildSessionFactory();
        }

         public  void Save()
        {
             using (ISession session =  this.sessionFactory.OpenSession())
            {
                 var dept =  new Department { Name =  " 计算机系 " };

                 var student1 =  new Student { Name =  " 李四 ", Dept = dept };
                 var student2 =  new Student { Name =  " 张三 ", Dept = dept };

                ITransaction tran = session.BeginTransaction();
                 try
                {
                     // 持久化Department类

                    session.Save(student1);
                    session.Save(student2);

                    tran.Commit();
                }
                 catch (Exception ex)
                {
                    tran.Rollback();
                     throw ex;
                }
            }
        }

         public  void GetAll()
        {
             using (ISession session =  this.sessionFactory.OpenSession())
            {
                 var students = session.CreateQuery( "  from Student ").List<Student>();

                Console.WriteLine();
                Console.WriteLine( " ******* 学生信息 ******* ");
                 foreach (Student student  in students)
                {
                    Console.WriteLine( " 学生:{0} ", student.Name);

                    Console.WriteLine( " 系:{0} ", student.Dept.Name);
                }
            }
        }
    }
}

 

运行结果:

记录保存成功!

******* 学生信息 *******
学生:李四
系:计算机系
学生:张三
系:计算机系

 

 

 

 

目录
相关文章
kde
|
14天前
|
JSON Linux 数据格式
Docker镜像加速指南:手把手教你配置国内镜像源
配置国内镜像源可大幅提升 Docker 拉取速度,解决访问 Docker Hub 缓慢问题。本文详解 Linux、Docker Desktop 配置方法,并提供测速对比与常见问题解答,附最新可用镜像源列表,助力高效开发部署。
kde
9030 53
|
11天前
typora免费版,激活方法,Typora使用教程
Typora是一款简洁高效的Markdown编辑器,支持即时渲染。本教程涵盖安装方法、文件操作、视图控制、格式排版、字体样式及Markdown语法,助你快速上手使用Typora进行高效写作。
2365 4
|
4天前
|
云安全 人工智能 安全
|
17天前
|
人工智能 定位技术 API
Dify MCP 保姆级教程来了!
大语言模型,例如 DeepSeek,如果不能联网、不能操作外部工具,只能是聊天机器人。除了聊天没什么可做的。
2230 33
|
5天前
|
Ubuntu JavaScript Linux
Windows安装Claude Code
Claude Code 是 Anthropic 推出的代码助手,支持在 Windows 通过 WSL(Windows Subsystem for Linux)运行。本文介绍如何在 Windows 系统中启用 WSL、安装 Ubuntu 子系统、配置 Python 与 Node.js 环境,并最终安装和运行 Claude Code。内容涵盖 WSL 设置、开发工具安装、依赖配置及常见问题解决方法,助你顺利在本地环境中使用 Claude Code 提升编码效率。
577 1
Windows安装Claude Code
|
14天前
|
JavaScript Ubuntu IDE
国内如何安装和使用 Claude Code镜像教程 - Windows 用户篇
国内如何安装和使用 Claude Code镜像教程 - Windows 用户篇
1234 6
|
12天前
|
人工智能 Java Spring
【保姆级图文详解】大模型、Spring AI编程调用大模型
【保姆级图文详解】大模型、Spring AI编程调用大模型
861 11
【保姆级图文详解】大模型、Spring AI编程调用大模型
|
4天前
|
人工智能 Java API
让复杂 AI 应用构建就像搭积木:Spring AI Alibaba Graph 使用指南与源码解读
通过指南和完整的示例项目,你可以快速掌握 Spring AI Alibaba Graph 的使用方法,并在实际项目中高效地构建智能化应用。
331 14