远程服务器怎么建设自己的网站,网站建设欲网站维护,德州市建设街小学网站首页,传奇源码下载上一篇#xff1a;NHibernate学习笔记#xff08;一#xff09;#xff1a;初识NHibernate本文的内容#xff1a;#xff11;#xff0e;介绍NH如何处理对象间one-to-ont的映射关系#xff1b;经验教训#xff1a;#xff11;#xff0e;操作一对一关联关系中的一个…上一篇NHibernate学习笔记一初识NHibernate本文的内容介绍NH如何处理对象间one-to-ont的映射关系经验教训操作一对一关联关系中的一个对象时得在程序中指定如何与另一个对象关联如在Student类中写this.NativePlace.Student this在为类写映射文件时必须指定类的具体的名称空间若则运行时会出现找不到映射文件的问题 这两点都困扰了我好长一段时间应该要引起注意点击下载本文相关代码可在上篇代码的基础上做修改one-to-oneNH中处理一对一关联的方式有两种主键关联惟一外键关联本文使用主键关联处理一对一的关系。 主键关联不需要额外的表字段两行是通过这种一对一关系相关联的那么这两行就共享同样的主关键字值。所以如果你希望两个对象通过主键一对一关联你必须确认它们被赋予同样的标识值 持久化对象之间一对一的关联关系是通过one-to-one元素定义的。 one-to-one namepropertyName(1) classClassName(2) cascadeall|none|save-update|delete(3) constrainedtrue|false(4) outer-jointrue|false|auto(5) property-refpropertyNameFromAssociatedClass (6) accessfield|property|ClassName(7)/ 以下是对one-to-one元素各属性的说明 name属性的名字 class(可选 - 默认是通过反射得到的属性类型): 被关联的类的名字 cascade(可选) 表明操作是否从父对象级联到被关联的对象 constrained(可选) 表明该类对应的表对应的数据库表和被关联的对象所对应的数据库表之间通过一个外键引用对主键进行约束。这个选项影响Save()和Delete()在级联执行时的先后顺序也在schema export tool中被使用 outer-join(可选 - 默认为 auto):当设置hibernate.use_outer_join的时候对这个关联允许外连接抓取 property-ref(可选): 指定关联类的一个属性这个属性将会和本外键相对应。如果没有指定会使用对方关联类的主键 access(可选 - defaults to property): NHibernate 用来访问属性的策略本文所涉及的类说明其中BizObject、User、ObjectBroker、Sessions等四个类就是NHibernate学习笔记一初识NHibernate这篇文章定义的。Student类和NativePlace类是一对一的双向关联关系类Student通过属性NativePlace关联类NativePlace;类NativePlace通过属性Student关联类Student。类Student的代码如下 using System;using System.Collections.Generic;using System.Text;namespace NHibernateTest{ public class Student : User { fields#region fields private NativePlace objNativePlace; #endregion constructors#region constructors public Student() { objNativePlace new NativePlace(); } public Student(int StudentID) : base(StudentID) { } #endregion properties#region properties public NativePlace NativePlace { get { return objNativePlace; } set { objNativePlace value; } } #endregion methors#region methors public bool addNewStudent() { try { this.NativePlace.Student this; this.Create(); return true; } catch (Exception e) { return false; } } public bool deleteStudent() { try { this.NativePlace.Student this; this.Delete(); return true; } catch (Exception e) { return false; } } public bool updateStudent() { try { this.NativePlace.Student this; this.Update(); return true; } catch (Exception e) { return false; } } #endregion }} 在每次操作Student对象时都得指定NativePlace.Student如this.NativePlace.Student this;如果没写这一行运行时会出现“could not find class:NativePlace”我就在写卡了好久类NativePlace的代码如下 using System;using System.Collections.Generic;using System.Text;namespace NHibernateTest{ public class NativePlace : BizObject { fields#region fields private int intNPID; private string strCity; private string strProvince; private Student objStudent; #endregion properties#region properties public int NPID { get { return intNPID; } set { intNPID value; } } public Student Student { get { return objStudent; } set { objStudent value; } } public string Province { get { return strProvince; } set { strProvince value; } } public string City { get { return strCity; } set { strCity value; } } #endregion }} 这两个类的定义相对于User类没有什么太大的区别接下来介绍两个类的配置文件。 从来看类NativePlace与类User之间是集合构成关系即类NativePlace属于类Student的一部分但不能独立存在也就是说类NativePlace是依赖于类User的。数据库脚本 --表Users用于保存Student对象Create Table [Users]( [ID] int identity(1,1) constraint PK_UserID1 Primary Key, [UserName] varchar(20) not null, [Password] varchar(20) not null)--表NativePlace用于保存NativePlace对象Create Table NativePlace( --表NativePlace与表Users通过主键关联则需保证两表的主键名一致 ID int Constraint PK_NativePlaceID Primary Key, Province varchar(50), City varchar(50)) 类Student的映射文件 ?xml version1.0 encodingutf-8 ?hibernate-mapping xmlnsurn:nhibernate-mapping-2.0 class nameNHibernateTest.Student,NHibernateTest tableUsers id nameUserID columnID typeInt32 unsaved-value0 generator classidentity/ /id property nameUserName columnUserName typeString length20/ property namePassword columnPassword typeString length20/ one-to-one nameNativePlace classNHibernateTest.NativePlace,NHibernateTest cascadeall / /class/hibernate-mapping 类NativePlace的映射文件 ?xml version1.0 encodingutf-8 ?hibernate-mapping xmlnsurn:nhibernate-mapping-2.0 class nameNHibernateTest.NativePlace,NHibernateTest tableNativePlace id nameNPID columnID typeInt32 unsaved-value0 generator classforeign param namepropertyStudent/param /generator /id property nameProvince columnProvince typeString length50/ property nameCity columnCity typeString length50/ one-to-one nameStudent classNHibernateTest.Student,NHibernateTest cascadeall constrainedtrue/one-to-one /class/hibernate-mapping 注意如果采用hibernate-mapping xmlnsurn:nhibernate-mapping-2.0这种声明的话请在之后指写相关联类的名字时请指出完整的类名名称空间类名和程序集名如class nameNHibernateTest.NativePlace,NHibernateTest tableNativePlace和one-to-one nameStudent classNHibernateTest.Student,NHibernateTest cascadeall constrainedtrue/one-to-one接下来是测试类 using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Text;using System.Windows.Forms;namespace NHibernateTest{ public partial class frmStudent : Form { public frmStudent() { InitializeComponent(); } Student objStudent; //Add New Student private void button1_Click(object sender, EventArgs e) { objStudent new Student(); objStudent.UserName jailu; objStudent.Password 123; objStudent.NativePlace.Province FuJian; objStudent.NativePlace.City LongYan; if (objStudent.addNewStudent()) { MessageBox.Show(Success); } else { MessageBox.Show(UnSuccess); } } //Update private void btnUpdate_Click(object sender, EventArgs e) { objStudent.UserName Update UserName; objStudent.NativePlace.Province Update Province; if (objStudent.updateStudent()) { MessageBox.Show(Success); } else { MessageBox.Show(UnSuccess); } } //Delete private void btnDelete_Click(object sender, EventArgs e) { if (objStudent.deleteStudent()) { MessageBox.Show(Success); } else { MessageBox.Show(UnSuccess); } } }} 所有的类和映射文件都写好了运行成功 转载于:https://www.cnblogs.com/jailu/archive/2006/06/29/438463.html