Hibernate表关系之一对多中的inverse.doc_第1页
Hibernate表关系之一对多中的inverse.doc_第2页
Hibernate表关系之一对多中的inverse.doc_第3页
Hibernate表关系之一对多中的inverse.doc_第4页
Hibernate表关系之一对多中的inverse.doc_第5页
免费预览已结束,剩余1页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Hibernate表关系之一对多(inverse详解)在映射一对多表关系的时候存在一个inverse的问题,一直以来对inverse不怎么了解,今天学到它想要弄明白,在网上看了无数个帖子还是不懂,最后终于看到一位高人的一篇帖子,解释得很透彻,终于彻底了解inverse的含义了,历时5个小时!现在若不是在喜悦的掩盖下我早已吐血了。下面说说一对多表关系的应用和inverse详解:以父与子关系为例:父亲可以有多个孩子,而孩子只能有一个父亲。那么反映到数据表是这样实现的:create table parent(pid int auto_increment primary key,pname varchar(20) not null)create table child(cid int auto_increment primary key,pid int not null, /在孩子表中添加父亲表的外键,实现一对多cname varchar(20) not null)用Hibernate自动生成的两个映射类,以Set集合方式表示一对多,以一个父亲对象方式表示多对一:public class Child private Integer cid;private Parent parent; /属于哪个父亲private String cname;.public class Parent private Integer pid;private String pname;private Set childs = new HashSet(0); /包含孩子的集合.关键仍然是两个映射文件:Child.hbm.xml: /多对一的属性为parent,对应数据库中的字段为pid,级联更新为all Parent.hbm.xml: /描述孩子集合,把控制权交给孩子 /以Pid来分辨哪个孩子是属于这个父亲的 测试类:Parent p=new Parent();Child c1=new Child();Child c2=new Child();p.setPname(xpc5);c1.setCname(cloud);c1.setParent(p); /设置孩子1的父亲为pc2.setCname(cloud1);c2.setParent(p); /设置孩子2的父亲为pp.getChilds().add(c1); /为父亲添加孩子1p.getChilds().add(c2); /为父亲添加孩子2session.save(p);运行后在插入一个父亲记录的同时,两个孩子记录被自动插入下面详细说明一下inverse的作用:inverse是反转的意思,在Hibernate中inverse决定谁掌有控制权,即表之间的关系谁来维护,那么当inverse=true表示交出控制权,inverse=false表示不交出控制权,这样理解有些难度,网上大多对此块讲解不清楚,下面以我自己的理解说明,首先来看实例,还以上面为例,在Parent.hbm.xml中有这样的描述: .首先说明这个映射文件是描述Parent类的,那么set描述的是Child集合,inverse=true意为交出控制权,整体意思就是Parent把控制权交给了Child,也就是说由Child来维护表关系。如果inverse=false表示不交出控制权,那么当然由Parent自己来维护表关系了,值得提到的是在Child映射文件中没有提到由谁来控权,默认的是inverse=false,就是由自己控权,即Child,进一步说当Parent那边inverse=false不交控权的时候,实际上是两个类都有责任来维护表关系。说到这里可能会问到底控权维护表关系是什么意思呢?下面来看测试类代码:Parent p=new Parent();Child c1=new Child();p.setPname(xpc5);c1.setCname(cloud);c1.setParent(p); p.getChilds().add(c1); session.save(p);这样写无论谁负责维护数据插入都没问题,那么我们改动一下试试,现在由Child负责维护,c1.setParent(p)是Child类与Parent类关联的关键,那么把句注释掉再试试,运行后执行语句是一样的,但是查看表记录你会发现Parent表能正确插入记录,而Child表中pid字段为空,这正是因为c1.setParent(p)这句是Child与Parent关联的关键而你又把它注释了,做为控权的Child没有设置与Parent关联,那么这两表之间的联系就消失了,即便有p.getChilds().add(c1)这句也无法实现关联,因为p不是控权。而当你修改Parent映射文件中的inverse=false的时候,父亲和孩子都负责维护,那么什么都不动再试上面的程序,执行后的结果双方都可正确被插入,因为此时有p.getChilds().add(c1)这句存在就可以了,因为Parent也有控权。那么为什么要使用inverse呢,让双方都有控权不好吗?下面来看,当Parent负责维护关系的时候,由于它包含一个孩子集合,它无法知道哪

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论