多对多的职务与级别对应关系表表怎能插入数据?

Hibernate表关系&多对多以及一对一
Hibernate表关系之一对多(inverse详解)
在映射一对多表关系的时候存在一个inverse的问题,一直以来对inverse不怎么了解,今天用到它想要弄明白,在网上看了无数个帖子还是不懂,最后终于看到一位高人的一篇帖子,解释得很透彻,终于彻底了解inverse的含义了,下面说说一对多表关系的应用和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 P & &
//属于哪个父亲
public class Parent {
private Set childs = new HashSet(0); &
& //包含孩子的集合
关键仍然是两个映射文件:
Child.hbm.xml:
&hibernate-mapping&
&&class name="com.pojo.Child"
table="child" catalog="test"&
& &&id name="cid"
type="java.lang.Integer"&
&&column name="cid"
&&generator class="native"
& //多对一的属性为parent,对应数据库中的字段为pid,级联更新为all
& &many-to-one name="parent"
class="com.pojo.Parent" fetch="select"
cascade="all"&
&&column name="pid"
&&/many-to-one&
& &&property
name="cname" type="java.lang.String"&
&&column name="cname" length="20"
not-null="true" /&
&&/property&
&/hibernate-mapping&
Parent.hbm.xml:
&hibernate-mapping&
&&class name="com.pojo.Parent"
table="parent" catalog="test"&
& &&id name="pid"
type="java.lang.Integer"&
&&column name="pid"
&&generator class="native"
& &&property
name="pname" type="java.lang.String"&
&&column name="pname" length="20"
not-null="true" /&
&&/property&
&&set name="childs" inverse="true"
cascade="all"& &
//描述孩子集合,把控制权交给孩子
&&column name="pid" not-null="true"
/& & //以Pid来分辨哪个孩子是属于这个父亲的
&&one-to-many
class="com.pojo.Child" /&
&/hibernate-mapping&
Parent p=new Parent();
Child c1=new Child();
Child c2=new Child();
p.setPname("xpc5");
c1.setCname("cloud");
c1.setParent(p); & &
//设置孩子1的父亲为p
c2.setCname("cloud1");
c2.setParent(p); & &
//设置孩子2的父亲为p
p.getChilds().add(c1); & &
//为父亲添加孩子1
p.getChilds().add(c2); & &
//为父亲添加孩子2
session.save(p);
运行后在插入一个父亲记录的同时,两个孩子记录被自动插入
下面详细说明一下inverse的作用:
inverse是反转的意思,在Hibernate中inverse决定谁掌有控制权,即表之间的关系谁来维护,那么当inverse="true"表示交出控制权,inverse="false"表示不交出控制权,这样理解有些难度,网上大多对此块讲解不清楚,下面以我自己的理解说明,首先来看实例,还以上面为例,在Parent.hbm.xml中有这样的描述:
&set name="childs" inverse="true"
cascade="all"&&
首先说明这个映射文件是描述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负责维护关系的时候,由于它包含一个孩子集合,它无法知道哪些孩子已经指向自己了,所以为了确保正确性,它要更新所有孩子的pid,让它指向自己,这样就引出了效率问题,若存在100个孩子,那么就无形中多做了100个update,所以显然,这个父子关系由孩子来维护比较省力.减轻了数据库的负担。
《inverse的作用:在hibernate中是通过inverse的设置来决定是有谁来维护表和表之间的关系的。
我们说inverse设立不当会导致性能低下,其实是说inverse设立不当,会产生多余重复的SQL语句甚至致使JDBC
exception的throw。这是我们在建立实体类关系时必须需要关注的地方。一般来说,inverse=true是推荐使用,双向关联中双方都设置
inverse=false的话,必会导致双方都重复更新同一个关系。但是如果双方都设立inverse=true的话,双方都不维护关系的更新,这也是
不行的,好在一对多中的一端:many-to-one默认是inverse=false,避免了这种错误的产生。但是多对多就没有这个默认设置了,所以很
多人经常在多对多的两端都使用inverse=true,结果导致连接表的数据根本没有记录,就是因为他们双分都没有责任维护关系。所以说,双向关联中最
好的设置是一端为inverse=true,一端为inverse=false。一般inverse=false会放在多的一端,那么有人提问了,
many-to-many两边都是多的,inverse到底放在哪儿?其实hibernate建立多对多关系也是将他们分离成两个一对多关系,中间连接一个连接表。所以通用存在一对多的关系,也可以这样说:一对多是多对多的基本组成部分。》
------感谢frankensteinlin网友的强帖
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。Access中定义表之间的关系
  &关系&简介
  在Access数据库中,不同表中的数据之间都存在一种关系,这种关系将数据库里各张表中的每条数据记录都和数据库中唯一的主题相联系,使得对一个数据的操作都成为数据库的整体操作,正所谓&牵一发而动全身&。
  就拿上几课建立的表来说吧,&客户信息表&中的&公司名称&和&订单信息表&中的&订货单位&所包含的值有很多是相同的。因为签了订单的&订货单位&肯定已经是公司的客户了,这些客户的名称也被记载在&客户信息表&的&公司名称&字段中。当我们已知一个客户的名称时,既可以通过&客户信息表&知道它的&客户信息&,也可以通过&订单信息表&了解它所签订的&订单信息&,所以说&公司名称&作为纽带将&客户资料表&和&订单信息表&中的相应字段信息连接在了一起,为了把数据库中表之间的这种数据关系体现出来,Access提供一种建立表与表之间&关系&的方法。用这种方法建立了关系的数据只需要通过一个主题就可以调出来使用,非常方便。
  当我们在&客户信息表&和&订单信息表&中建立这样的关系以后,只需要看看&客户信息表&,在不增加表内容的情况下,就可以看到所有客户的信息及其所有&订单&的情况,使这些数据一目了然。
  表之间的三种关系
  在建立表之间的关系前,我们还是要提一下&关系&的三种类型&一对一&、&一对多&和&多对多&。在Access中,可以在两个表之间直接建立&一对一&和&一对多&关系,而&多对多&关系则要通过&一对多&关系来实现。我们分别来说说这三种&关系&。
  首先是&一对一&关系,比如下面的两个表:某学校学生月副食补助:
  和某学校学生月助学金:
  我们降这两个表中的数据进行汇总生成新的表:&某学校学生月实发金额汇总&:
  由于姓名字段可能会出现重复的情况,所以只有通过不可能出现重复的值的字段&学号&,才能将这两个表唯一地联系起来,保证&副食补贴&和&助学金&不至于错误地发放,这样&月副食补助表&中的一个学号就只对应&月助学金&中的一个学号,绝对不会弄错。这样两个表的关系很明显就是&一对一&了。
  下面来看看&一对多&关系。在&客户信息表&和&订单信息表&中,&订单信息表&中的&订货单位&字段和&客户信息表&中的&公司名称&字段中的值都是一样的。其实只有那些订货了的单位才是公司的客户,所以这两个表之间是靠客户公司的名字联系在一起的。但是每个客户都可以订很多份订单。所以在&客户信息表&中的一个&公司名称&就能对应&订单信息表&中的几份&订单&。这样的关系就是&一对多&。
  最后使&多对多&关系,我们知道,书店中有很多书,同时一种书也可以在很多书店里找到。这时&书&和&书店&的关系就是&多对多&关系了。
  怎样在表之间建立关系
  现在我们就开始在表之间建立&关系&,首先单击&工具&菜单下的&关系&命令,弹出&关系&对话框,上面还有一个&显示表&对话框如下图,通过&显示表&对话框可以把需要建立关系的&表&或&查询&加到&关系&对话框中去。
  将两个表&客户信息表&和&订单信息表&都选中,单击&添加&按钮把它们都添加到&关系&对话框上,单击&关闭&按钮把&显示表&对话框关闭。以后再需要打开它时,只要在&关系&对话框上单击鼠标右键,选择&显示表&命令就可以了。
  在&关系&对话框中只有&客户信息表&和&订单信息表&的字段列表。怎么建立关系呢?其实表都是由字段构成的,表之间的关系也由字段来联系。让不同表中的两个字段建立联系以后,表中的其他字段自然也就可以通过这两个字段之间的关系联系在一起了。也就是说在&客户信息表&中的&公司名称&和&订单信息表&中的&订货单位&两个字段之间建立关系就可以了。先在&客户信息表&字段列表中选中&公司名称&项,然后按住鼠标左键并拖动鼠标到&订单信息表&中的&订货单位&项上,松开鼠标左键,这时在屏幕上出现&编辑关系&对话框。
  这个对话框可以帮助我们编辑所建立的关系,通过左面的列表框可以改变建立关系的两个字段的来源。可以单击&新建...&按钮创建新的关系,或者单击&联接类型&为联接选择一种联接类型。单击&联接类型&按钮,在弹出的新对话框中选择第三项,然后单击&确定&按钮就可以了。回到&编辑关系&对话框后单击&创建&按钮。
  现在在两个列表框间就出现了一条&折线&,将&订货公司&和&公司名称&两个选项联接在一起。关闭&关系&对话框,并保存对&关系&布局的修改。在表间建立关系就是这样的。
  &关系&与&子数据表&
  打开&客户信息表&,你会发现这个表中增加了一些新的表,它们是&客户信息表&的子表,也就是&订单信息表&。
  在这种&一对多&的情况下,完全可以通过&客户信息表&中的&公司名称&信息将这两个表的内容都串起来。在主表中的每一个记录下面都会带着一个甚至几个子表中的&订单&记录。具有&一对一&关系的两个表之间互为对方的&子表&。
  通常在建立表之间的关系以后,Access会自动在主表中插入子表。但这些子表一开始都是不显示出来的。在Access中,让子表显示出来叫做&展开&子数据表,让子表隐藏叫做将子数据表&折叠&。展开的时候方便查阅订单信息,而折叠起来以后有可以比较方便的管理&客户信息表&。
  要&展开&子数据表,只要用鼠标单击主表第一个字段前面一格,对应记录的子记录就&展开&了,并且格中的小方框内&加号&变成了&减号&。如果再单击一次,就可以把这一格的子记录&折叠&起来了,小方框内的&减号&也变回&加号&。如果主表很大的话,这样一个一个地&展开&和&折叠&子数据表就显得太麻烦了,Access为我们提供了一种操作方式,它可以一下子&展开&或&折叠&当前数据表的所有子数据表。打开一个带有子数据表的表时,在&格式&菜单&子数据表&项的子菜单中,有三个命令&全部展开&、&全部折叠&和&删除&,&全部展开&命令可以将主表中的所有子数据表都&展开&,&全部折叠&命令可以将主表中的所有子数据表都&折叠&起来。不需要在主表中显示子数据表的这种方式来反映两个表之间的&关系&时,就可以使用&删除&命令来把这种用子数据表显示的方法删除。但这时两个表的&关系&并没有被删除。如果想恢复在主表上显示&子数据表&的形式,可以先打开主表,比如&客户信息表&,单击&插入&菜单下的&子数据表&命令,弹出&插入子数据表&对话框如下图:
  在列表框中选取&表&----&订单信息表&,然后在&链接子字段&组合框中选取&订货单位&字段,并在&链接主字段&组合框中选取&公司名称&字段,单击&确定&按钮就可以在主数据表&客户信息表&中重新插入子数据表&订单信息表&了。必须要注意的是在任何一个数据表中插入子数据表都需要在两个表之间建立&关系&,如果这两个表的&主链接字段&和&子链接字段&之间还没有建立联结的话,在单击&确定&按钮插入&子数据表&的时候就会询问是否要在这两个表之间建立相应的&关系&,只有建立&关系&以后,才能完成&插入子数据表&过程。用这样的方式在表之间建立&关系&不像在&关系&对话框中建立的&关系&那样直观。所以我们提倡在关系对话框中建立好表与表之间的&关系&,由Access自动地创建子数据表。
  这一课通过&客户信息表&和&订单信息表&将表与表之间的&关系&展现在我们面前,如果你已经掌握了表的操作,那就开始看下一课;如果你还没有完全掌握&表&,就将这四课再好好看一看,因为表是数据库中最重要的一个部分了。
  实施参照完整性
  在我们建立表之间的关系时,窗口上有一个复选框&实施参照完整性&,单击它之后,&级联更新相关字段&和&级联删除相关字段&两个复选框就可以用了。
  如果选定&级联更新相关字段&复选框,则当更新父行(一对一、一对多关系中&左&表中的相关行)时,Access就会自动更新子行(一对一、一对多关系中的&右&表中的相关行),选定&级联删除相关字段&后,当删除父行时,子行也会跟着被删除。而且当选择&实施参照完整性&后,在原来折线的两端会出现&1&或&OO&符号,在一对一关系中&1&符号在折线靠近两个表端都会出现,而当一对多关系时&OO&符号则会出现在关系中的右表对应折线的一端上。
  设置了实施参照完整性就可以使我们在表中修改了一个记录的时候,不会影响到查询的操作。特别是在有很多表,而且各个表之间都有关系联接时,&实施参照完整性&会带来更多的方便。
顶一下(0) 踩一下(0)
热门标签:access基础教程
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
第八章 定义表之间的关系
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='/DocinViewer-4.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口10:37:09【 转载互联网】 作者: &&|&责编:李强
&&& &为了解决用户可能碰到关于"hibernate manytomany删除某张表中的数据的时候其余关联表中的数据会不会也一起删除"相关的问题,突袭网经过收集整理为用户提供相关的解决办法,请注意,解决办法仅供参考,不代表本网同意其意见,如有任何问题请与本网联系。"hibernate manytomany删除某张表中的数据的时候其余关联表中的数据会不会也一起删除"相关的详细问题如下: hibernate manytomany删除某张表中的数据的时候其余关联表中的数据会不会也一起删除 ===========突袭网收集的解决方案如下===========
解决方案1: 多对多里有个级联属性,叫什么casecade=“delete”的,配置了就可以了
================可能对您有帮助================
问:弄了一下午。。。 hibernate自动生成的表,User和Role是多对多的关系。...答:你配置反了吧, @ManyToMany(mappedBy = "roles") @JoinTable(name = "userrole", joinColumns = { @JoinColumn(name = "roleid") }, inverseJoinColumns = { @JoinColumn(name = "userid") }) public Set getUsers() { } public ...===========================================问:最好详细说明,感觉都差不多答:many-to-many 多对多 比如一个用户可以有多种角色 一种角色可以对用多个不同的用户 所以角色和用户之间的关系是多对多的关系 一般要用第三张表来出来两者对应的关系 one-to-many 一对多 比如一个老师可以对应很多个学生 many-to-one 相反的是多...===========================================问:创建表 双向多对多关系 想把所有table怎么把它们删除 drop table xxx用...答:比如A,B是实体表,C是第三方多对多表,那么应该先删除C表再删除A,B表===========================================问:Role(角色) 与 Purview (权限点) 是多对多的关系, Purview的多少是固定...答:给你参考role和FunctionAuthority 也是多对多,这里在数据库建了一张中间表T_ROLE_AUTHORITY。希望对你有帮助。 FunctionAuthority.hbm.xml Role.hbm.xml ===========================================问:我确实有这个业务需求怎么办?答:你说得很模糊, 如果是多对多,已经建立关系,想保持对中间进行维护,当然只有你在代码中控制了 比如你删除一方,记得在对方的set中去掉你删除对象。===========================================问:我确实有这个业务需求怎么办?答:大家不要误导人。 多对一和一对多就是一回事情,哪有那么复杂?! 对于“多”的一方来看,就是多对一;对于“一”的一方来看,就是一对多。 仅仅是同一事物的不同看待角度。 我再多说两句:Hibernate中的所有关系,从本质上来看都是一对多的关系。 ...===========================================问:现在有俩个表单:user:id(主键),userName,password,ageentry:id(主键),t...答:你发了两条帖子啊,我看了第一个,我感觉你映射关系没搞明白,user表里的Id对应entry表的author,从名字上不正确啊,按理映射user中的name吧,先给你提示到这里,你说是不是你写错了,然后再跟你说你的配置文件中的多对一映射有错误才导致空指针===========================================问:现在有俩个表单:user:id(主键),userName,password,ageentry:id(主键),t...答:在hnm.xml 中有on to many的 代码片段 还有就是在代码中加注解===========================================问:&many-to-one&中的cascade属性是控制级联操作的,但是开发中遇到一个很...答:如果你删除many的一方,会被删除所有的,你在删除的时候要先删除many中的 one对象,并且set为null,然后delete,将不会级联删除,总体意思就是解除他们两个之间的关系,如果不懂,就贴代码我看看,继续追问=========================================== 你说得很模糊,
如果是多对多,已经建立关系,想保持对中间进行维护,当然只有你在代码中控制了
比如你删除一方,记得在对方的set中去掉你删除对象。===========================================一对一 @onetoone一对多 @onttomany多对多 @manytomany这些注解是JPA的,hibernate会支持,和springmvc没有关系=========================================== 删除中间表? 还是表中记录?cascade="delete"===========================================写JoinTable需要指定mappedBy, Role#pers需要指定mappedBy.
mappedBy作用告诉hibernateRole#roles属性找本@ManyToMany映射关系. 实际已经配置映射间表. 所木用.===========================================
@ManyToOne(joinColumns=@JoinColumn(name="cid")
a.getCountry();
Movie类(m)
@Id(Name=mid)
@GenericValue
m.getId();
@ManyToMany(j...===========================================这种情况不能直接用ManyToMany多对多。
ManyToMany只适合于两者只有基本的外键对应关系,也就是两者的中间关系表没有额外的有效数据。
你这个有额外的isReaded数...===========================================种情况能直接用ManyToMany多对多
ManyToMany只适合于两者只有基本外键对应关系也两者间关系表没有额外有效数据
有额外isReaded数据
字段应该要放User和Messa...===========================================@OneToMany @ManyToOne @OneToOne @ManyToMany
具体用哪个还得看你这俩model的业务关系是怎么样的===========================================这是Hibernate的一个工作机制 你应该知道Hibernate先进行查询 如果有就更新 没有就 插入=========================================== OpenSessionViewFilter 这个应该可以解决你的问题。可能你的Session 还是在不该关的地方关了。那个Session是在Filter 里面开启,并且在 chain();方法的后面关闭,这样在页...===========================================
12345678910}

我要回帖

更多关于 一对多关系表设计 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信