求hibernate3 注解的多对一级联操作详解。我的增加时候,会影响上级对象。

解决方案 »

  1.   

    一对多关系通过外键关系连接两个表,而没有中间的表。首先先引用一段对集合的释义: Bag:对象集合,每个元素可以重复。例如{1,2,2,6,0,0},在.Net中相当于IList或者IList<T>实现。Set:对象集合,每个元素必须唯一。例如{1,2,5,6},在.Net中相当于ISet或者ISet<T>实现,Iesi.Collections.dll程序集提供ISet集合。List:整数索引对象集合,每个元素可以重复。例如{{1,"YJingLee"},{2,"CnBlogs"},{3,"LiYongJing"}},在.Net中相当于ArraryList或者List<T>实现。Map:键值对集合。例如{{"YJingLee",5},{"CnBlogs",7},{"LiYongJing",6}},在.Net中相当于HashTable或者IDictionary<Tkey,TValue>实现。 持久类:(一)Customerpublic class Customer{public virtual int Unid { get; set; }public virtual FllName Name { get; set; }public virtual DateTime CreateTime { get; set; }public virtual string Address { get; set; }public virtual int Version { get; set; } private IList<Call> _list = new List<Call>();public virtual IList<Call> Phones { get { return _list; } set { _list = value; } }} public class FllName{public string FirstName { get; set; }public string LastName { get; set; }public string Names{        get {return (FirstName+"·"+LastName);} }}这个类我要用于component,和一对多关系应用,所以多了个FullName复合属性。(二)Callpublic class Call{public virtual int Unid { get; set; }public virtual string Phone { get; set; } public virtual Customer Customer { get; set; }}这个类就是onetomany中的many一方(三)Customer mapping<bag name="Phones" table="Calls" cascade="all" inverse="true">      <key column="CustomerId"></key>      <one-to-many class="Domain.Entities.Call,Domain"/></bag>(四)Call mapping   <many-to-one name="Customer" column="CustomerId" class="Domain.Entities.Customer,Domain" not-null="true"/> 说明一下:·对于数据库表之间的关联关系,nhibernate也是mapping过来了(自己理解),所以不必在数据库中为数据表人为的建立关系,如果那样的话,nhibernate中就不必建立一对多关系了(这个我还没有测试)。·对于一对多关系中的两方:一的一方带一个集合属性,而这个集合是多的那一方的集合;而多的一方带有一个一方的类型的属性,可以这样描述:一个父亲带有一群孩子,而一个孩子心中(现实也是)也有一个父亲。而对于对象的nhb,数据库中的外键由对象来描述。 其实在这里,关系已经建立起来了,要做的就是进行curd了。(一)查询[Test]public void TestGetOne(){    Customer cc = hh.GetElementById(38);       foreach (Call call in cc.Phones)    {Console.WriteLine(call.Phone);    }}其中的GetElementById方法就是查询一个Customer持久数据而已,但因为关系的建立,使得它的Phones属性得以填充。查看它的sql语句为:SELECT customer0_.Unid as Unid0_0_, customer0_.Version as Version0_0_, customer0_.FirstName as FirstName0_0_, customer0_.LastName as LastName0_0_, customer0_.CreateTime as CreateTime0_0_, customer0_.Address as Address0_0_ FROM Customer customer0_ WHERE customer0_.Unid=@p0;@p0 = 38SELECT phones0_.CustomerId as CustomerId1_, phones0_.Unid as Unid1_, phones0_.Unid as Unid1_0_, phones0_.Phone as Phone1_0_, phones0_.CustomerId as CustomerId1_0_ FROM Calls phones0_ WHERE phones0_.CustomerId=@p0;@p0 = 38分别查询两个表中的数据(二)添加public void TestAdd(){    Customer c = new Customer    {Name = new FllName { FirstName = "张", LastName = "清" },Address = "清河县1"    };     Call phones = new Call { Phone = "7777778" };    Call phones1 = new Call { Phone = "9999978" };    phones.Customer = c;    phones1.Customer = c;    try    {c.Phones.Add(phones);c.Phones.Add(phones1);    }    catch    { }     hh.AddUpdateDelete(Domain.Enums.eOperation.Add, c);}这里的Customer的Phones是一个Call的集合。(三)删除public void TestDelete(){    Customer c = new Customer {Unid=38};    hh.AddUpdateDelete(Domain.Enums.eOperation.Delete, c);}直接删除就行了。(四)更新public void TestUpdate(){    Customer c;    c = hh.GetElementById(40);    c.Phones[0].Phone = "55555555";        hh.AddUpdateDelete(Domain.Enums.eOperation.Update, c);}
      

  2.   


    是的呢,我的表是日志表 和日志留言表,两边都要查,和crud的,我在增加留言的时候,把日志的表的id设置了,结果保存留言后,留言保存成功,但是日志表却都空了,只有一个id了。而且我留言多个后,只会保存最后一个。关联的id被修改了。怎么解决呢?