ImageVerifierCode 换一换
格式:DOCX , 页数:8 ,大小:19.75KB ,
资源ID:16314449      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/16314449.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(hibernate 中inverse cascade属性转Word文档下载推荐.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

hibernate 中inverse cascade属性转Word文档下载推荐.docx

1、Category与Item是一对多的关系,也就是说Category类中有个Set类型的变量items.举个例子,现items中存两个Item, item1,item2,如果定义关系为all-delete-orphan当items中删除掉一个item(比如用remove()方法删除item1),那么被删除的Item类实例将变成孤儿节点,当执行category.update(),或session.flush()时hibernate同步缓存和数据库,会把数据库中item1对应的记录删掉测试Hibernate中的三个属性:lazy,inverse,cascade【测试环境】一对多关系的两张表:boy、

2、girl(一个男孩可以多个女朋友)boy表结构Field Type- -name varchar(50) pkagegirl表结构bf fkER图【保存时:Inverse与cascade】创建三个girl对象和一个boy对象,让这是三个girl都是boy的女朋友 -创建对象的代码片段-Boy boy = new Boy(tom,23, null);Set girls = new HashSet();Girl g = new Girl new Girl(Alice1, boy),Alice2Alice3, boy);girls.add(g0);girls.add(g1);girls.add(g2

3、);boy.setGirls(girls);在Boy.hbm.xml中设置,然后对boy对象进行保存。1.Inverse = true,不指定cascade cascade的默认值为none, 当对boy进行保存操作时,girl什么都不做. 所以只保存了boy对象, 没有保存girl对象2.Inverse = true,cascade=all boy与girl对象,包扩外键都成功保存。 (生成3条SELECT语句和4条INSERT语句,一下简称SELECT 3, INSERT 4)3.Inverse = false,不指定cascade 报错。因为boy为主控方,负责维护关系,所以在插入boy

4、对象后,会尝试修改并不存在的girl对象。4.Inverse = false,cascade=all (SELECT 4, INSERT 4, UPDATE 3) 分析:除了4条INSERT语句之外,其他的6条语句是我们为了图方便付出的代价:3条SELECT语句用来判断girl对象是否在数据表中已经存在,3条UPDATE语句是为了维护外键关系高效率的做法:在Boy.hbm.xml中设置Inverse=true,在Girl.hbm.xml中设置Inverse=false, cascade=all,然后保存三个girl对象(SELECT 1, INSERT 4) 高效率的代价就是保存的时候比较麻烦

5、【删除时:希望通过删除boy,也将3个girl对象删除。程序中先查出boy对象,然后进行删除-Boy boy = (Boy) s.get(Boy.class, );s.delete(boy);同样在Boy.hbm.xml中进行设置1.Inverse = true 可以猜到结果是出错。原因:外键约束错误2.Inverse = false boy删除,girl表中外键变为null,没有删除记录 ;(UPDATE 1, DELETE 1)3.Inverse = false, cascade = all 全部删除在删除有外键的从表时,先把从表外键置为null,然后删除主表记录,最后根据从表主键删除所有

6、相关从表记录 (UPDATE 1, DELETE 4)4.Inverse = true, cascade = all 全部删除 (DELETE 4)Inverse是hibernate双向关系中的基本概念,当然对于多数实体,我们并不需要双向关联,更多的可能会选择单向关联,况且我们大多数人一般采用一对多关系,而一对多双向关联的另一端:多对一的inverse属性是不存在,其实它默认就是inverse=false.从而防止了在一对多端胡乱设置inverse也不至于出错。但是inverse设置不当确实会带来很大的性能影响,这点是我们必须关注的。这篇文章已经详细分析了inverse设置不当带来的影响:ht

7、tp:/www.hibernate.org/155.html看了这篇文章,还是很有必要再写下一些总结的:1)inverse中提及的side其实是指一个类或者表的概念,双向关联其实是指双方都可以取得对方的应用。2)维护关系这个名词还是稍显模糊或者晦涩。我们一般说A类或者A表(这里的表的是指多对多的连接表)有责任维护关系,其实这里的意思是说,我在应用在更新,创建,删除(读就不用说了,双向引用正是为了方便读而出现)A类或者A表时,此时创建的SQL语句必须有责任保证关系的正确修改。3)inverse=false的side(side其实是指inversefalse所位于的class元素)端有责任维护关系

8、,而inversetrue端无须维护这些关系。4)我们说inverse设立不当会导致性能低下,其实是说inverse设立不当,会产生多余重复的SQL语句甚至致使JDBC exception的throw。这是我们在建立实体类关系时必须需要关注的地方。一般来说,inversetrue是推荐使用,双向关联中双方都设置inversefalse的话,必会导致双方都重复更新同一个关系。但是如果双方都设立inversetrue的话,双方都不维护关系的更新,这也是不行的,好在一对多中的一端:many-to-one默认是inversefalse,避免了这种错误的产生。但是对多对就没有这个默认设置了,所以很多人经

9、常在多对多的两端都使用inversetrue,结果导致连接表的数据根本没有记录,就是因为他们双分都没有责任维护关系。所以说,双向关联中最好的设置是一端为inversetrue,一端为inversefalse。一般inversefalse会放在多的一端,那么有人提问了,manytomany两边都是多的,inverse到底放在哪儿?其实hibernate建立多对多关系也是将他们分离成两个一对多关系,中间连接一个连接表。所以通用存在一对多的关系,也可以这样说:一对多是多对多的基本组成部分。看下面的多对多的定义大家更会清楚”多对多“与“一对多”的关系:其中我们注意标签的特点就知道,它是定义了一个多对多

10、关系,而不是。!DOCTYPE hibernate-mapping PUBLIC -/Hibernate/Hibernate Mapping DTD 2.0/ENhibernate-mapping package=org.hibernate.auctionclass name=TestA table=dynamic-update=true dynamic-insert= id name=id column= type=int unsaved-value=anygenerator class=assigned/generator/idproperty name=namejava.lang.Str

11、ingupdate= insert= /set name=testBsTestA_TestB inverse=false cascade=allkey column=testA/many-to-many column=testB class=TestB/set/class update=insert=testAs/hibernate-mapping在对多对中,因为一端维护关系另一端不维护关系的原因,我们必须注意避免在应用中用不维护关系的类建立关系,因为这样建立的关系是不会在数据库中存储的。基于上面的映射文件代码给出一个例子:package org.hibernate.auction;impor

12、t java.util.*;/* author Administrator* To change the template for this generated type comment go to* Window>Preferences&Java&Code Generation&Code and Comments*/public class TestA int id;String name;Set testBs=new HashSet();public TestA()public TestA(int id)setId(id);public int getId()return id;pu

13、blic void setId(int id)this.id=id;public String getName()return name;public void setName(String name)this.name=name;public Set getTestBs()return testBs;public void setTestBs(Set s)testBs=s;public void addTestB(TestB tb)testBs.add(tb);public static void main(String args) public class TestB Set testAs

14、=new HashSet();public TestB()public TestB(int id)public Set getTestAs()return testAs;public void setTestAs(Set s)testAs=s;public void addTestA(TestA ta)testAs.add(ta);测试代码:public void doTest() throws ExceptionTestA a1=new TestA(1);TestA a2=new TestA(2);TestA a3=new TestA(3);TestB b1=new TestB(1);Tes

15、tB b2=new TestB(2);TestB b3=new TestB(3);a1.addTestB(b1);a1.addTestB(b2);a1.addTestB(b3);b2.addTestA(a1);b2.addTestA(a2);Session s = factory.openSession();s = factory.openSession();Session session = factory.openSession(); session.save(a1); session.flush(); session.close();测试后连接表的数据为:testa testb1 1 2 3根据inverse规则,对这些代码: 建立的关系,数据库并没有存储下来,因为TestB没有责任维护这些关系,所以产生的sql语句自然不会有针对Testa_testB表的操作了。假设应用中真的需要这些方法,那么我们可以修改TestB的方法,让他们注意在维护端类中执行相应的操作以使得关系能够在数据库中保存下来,更改TestB如下:/* Created on 2004-7-25* To change the template for this generated file go tota.addTestB(this);那么测试执行后连接表的数据为:2

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1