使用hibernate 不级联更新中的多对多关系配置数据,但更新数据后,发现不能实时更新,是怎么一回事?

hibernate manytomany(多对多) 执行update更新操作时,关联表数据会被删除_百度知道11:48 提问
Hibernate 三张表关联 一对多对多 配置
当更新classA时,关联多方(classB)能自动更新,单与classB 关联的多方(Class C)却不能自动更新
classA对应的A表主键是B表的外键,ClassB对应的B表主键是C标的外键。现在情况是saveorupdate()A表的时候,B表能自动更新。
classA 对应A表
classB :b表
classC: c表
A表的主键Aid 是b表的外键,
b表的bid是c表的外键,这样他们之间就形成了A与B一对多,B与C一对多的关系。
按照上面的配置当我执行A表的更新时,与之对应的B表可以自动更新,但是,与B表象关联的C表却没有更新。
6898关注|699收录
其他相似问题您所在的位置: &
浅析Hibernate一对多数据关联的问题(一)
浅析Hibernate一对多数据关联的问题(一)
Hibernate一对多数据关联。指的是单向一对多数据关联一个用户有多个地址,在用户类TUser中包含地址类TAddress集合。
Hibernate一对多数据关联。指的是单向一对多数据关联一个用户有多个地址,在用户类TUser中包含地址类TAddress集合。
1.数据模型
2.表定义sqluse& &&DROP&TABLE&T_A &DROP&TABLE&T_U &&CREATE&TABLE&T_User&( &&&&&&&&id&INT&NOT&NULL&AUTO_INCREMENT &&&&&&,&name&VARCHAR(50) &&&&&&,&age&INT &&&&&&,&PRIMARY&KEY&(id) &); &&CREATE&TABLE&T_Address&( &&&&&&&&id&INT&NOT&NULL&AUTO_INCREMENT &&&&&&,&address&VARCHAR(200) &&&&&&,&zipcode&VARCHAR(10) &&&&&&,&tel&VARCHAR(20) &&&&&&,&type&VARCHAR(20) &&&&&&,&user_id&INT&NOT&NULL &&&&&&,&idx&INT &&&&&&,&PRIMARY&KEY&(id) &&&&&&,&INDEX&(user_id) &&&&&&,&CONSTRAINT&FK_T_Address_1&FOREIGN&KEY&(user_id) &&&&&&&&&&&&&&&&&&&REFERENCES&T_User&(id) &); &
POJO类TUser.javapackage&cn.blogjava. &&import&java.util.S &&public&class&TUser&&implements&java.io.Serializable&{ &&&&&//&Fields&&&& &&&&&&private&Integer& &&&&&&private&Integer& &&&&&&private&String& &&&&&&private&Set& &&&&&&&//&Constructors &&&&&&public&Integer&getAge()&{ &&&&&&&&&return& &&&&&} &&&&&&public&void&setAge(Integer&age)&{ &&&&&&&&&this.age&=& &&&&&} &&&&&&&public&Set&getAddress()&{ &&&&&&&&&return& &&&&&} &&&&&&public&void&setAddress(Set&address)&{ &&&&&&&&&this.address&=& &&&&&} &&&&&&/**&default&constructor&*/ &&&&&public&TUser()&{ &&&&&} &&&&& &&&&&/**&constructor&with&id&*/ &&&&&public&TUser(Integer&id)&{ &&&&&&&&&this.id&=& &&&&&} &&&&&&//&Property&accessors &&&&&&public&Integer&getId()&{ &&&&&&&&&return&this. &&&&&} &&&&& &&&&&public&void&setId(Integer&id)&{ &&&&&&&&&this.id&=& &&&&&} &&&&&&public&String&getName()&{ &&&&&&&&&return&this. &&&&&} &&&&& &&&&&public&void&setName(String&name)&{ &&&&&&&&&this.name&=& &&&&&} &}&
TAddress.javapackage&cn.blogjava. &&import&java.io.S &&public&class&TAddress&implements&Serializable&{ &&&&& &&&&&private&Integer& &&&&&private&String& &&&&&private&String& &&&&&private&String& &&&&&private&String& &&&&&private&Integer&userId; &&&&&private&Integer& &&&&& &&&&&public&Integer&getId()&{ &&&&&&&&&return& &&&&&} &&&&&public&void&setId(Integer&id)&{ &&&&&&&&&this.id&=& &&&&&} &&&&&public&String&getAddress()&{ &&&&&&&&&return& &&&&&} &&&&&public&void&setAddress(String&address)&{ &&&&&&&&&this.address&=& &&&&&} &&&&&public&Integer&getIdx()&{ &&&&&&&&&return& &&&&&} &&&&&public&void&setIdx(Integer&idx)&{ &&&&&&&&&this.idx&=& &&&&&} &&&&&public&String&getTel()&{ &&&&&&&&&return& &&&&&} &&&&&public&void&setTel(String&tel)&{ &&&&&&&&&this.tel&=& &&&&&} &&&&&public&String&getType()&{ &&&&&&&&&return& &&&&&} &&&&&public&void&setType(String&type)&{ &&&&&&&&&this.type&=& &&&&&} &&&&&public&Integer&getUserId()&{ &&&&&&&&&return&userId; &&&&&} &&&&&public&void&setUserId(Integer&userId)&{ &&&&&&&&&this.userId&=&userId; &&&&&} &&&&&public&String&getZipcode()&{ &&&&&&&&&return& &&&&&} &&&&&public&void&setZipcode(String&zipcode)&{ &&&&&&&&&this.zipcode&=& &&&&&} &&} &
3.配置文件TUser.hbm.xml&version="1.0"&"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"&&&&&&&name="cn.blogjava.start.TUser"&table="T_User"&catalog="sample"&&&&&&dynamic-update="true"&dynamic-insert="true"&&&&&&&&&&&&&&&name="id"&type="integer"&&&&&&&&&&&&&&name="id"&&&&&&&&&&&&&&&class="native"&&&&&&&&&&&&&&&&&&&&name="name"&type="string"&column="name"&&&&&&&&&&&name="age"&type="java.lang.Integer"&column="age"&&&&&&&&&&&&name="address"&table="t_address"&cascade="all"&order-by="zipcode&asc"&&&&&&&&&&&&&&column="user_id"&&&&&&&&&&&&&&&&&&&&&&&&&&&class="cn.blogjava.start.TAddress"&&&&&&&&&&&&&&&&&
TAddress.hbm.xml注意:没有配置user_id字段。&version="1.0"&"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"&&&&&&&name="cn.blogjava.start.TAddress"&table="T_Address"&catalog="sample"&&&&&&&&&&name="id"&type="integer"&&&&&&&&&&&&&&name="id"&&&&&&&&&&&&&&&class="native"&&&&&&&&&&&&&&&&&&&&name="address"&type="string"&column="address"&&&&&&&&&&&name="zipcode"&type="string"&column="zipcode"&&&&&&&&&&&name="tel"&type="string"&column="tel"&&&&&&&&&&&name="type"&type="string"&column="type"&&&&&&&&&&&name="idx"&type="java.lang.Integer"&column="idx"&&&&&&&&
4.测试代码package&cn.blogjava. &&import&java.util.HashS &import&java.util.I &import&java.util.L &&import&junit.framework.A &import&junit.framework.TestC &&import&org.hibernate.HibernateE &import&org.hibernate.S &import&org.hibernate.SessionF &import&org.hibernate.T &import&org.hibernate.cfg.C &&&public&class&HibernateTest&extends&TestCase&{ &&&&& &&&&&Session&session&=&null; &&&&&&protected&void&setUp()&{ &&&&&&&&&try&{ &&&&&&&&&&&&&Configuration&config&=&new&Configuration().configure(); &&&&&&&&&&&&&SessionFactory&sessionFactory&=&config.buildSessionFactory(); &&&&&&&&&&&&&session&=&sessionFactory.openSession(); &&&&&&&&&&&&& &&&&&&&&&}&catch&(HibernateException&e)&{ &&&&&&&&&&&&&e.printStackTrace(); &&&&&&&&&}&&&&&&&& &&&&&} &&&&&&protected&void&tearDown()&{ &&&&&&&&&try&{ &&&&&&&&&&&&&session.close();&&&&&&&& &&&&&&&&&}&catch&(HibernateException&e)&{ &&&&&&&&&&&&&e.printStackTrace(); &&&&&&&&&}&&&&&&&& &&&&&}&&&& &&&&& &&&&&/** &&&&&&*&对象持久化测试(Insert方法) &&&&&&*/&&&&&&&& &&&&&public&void&testInsert()&{ &&&&&&&&&Transaction&tran&=&null; &&&&&&&&&try&{ &&&&&&&&& &&&&&&&&&&&&&TUser&user&=&new&TUser(); &&&&&&&&&&&&&user.setName("byf"); &&&&&&&&&&&&&user.setAge(new&Integer(26)); &&&&&&&&&&&&& &&&&&&&&&&&&&TAddress&addr&=&new&TAddress(); &&&&&&&&&&&&&addr.setTel("1123"); &&&&&&&&&&&&&addr.setZipcode("233123"); &&&&&&&&&&&&&addr.setAddress("HongKong"); &&&&&&&&&&&&& &&&&&&&&&&&&&TAddress&addr2&=&new&TAddress(); &&&&&&&&&&&&&addr2.setTel("139"); &&&&&&&&&&&&&addr2.setZipcode("116001"); &&&&&&&&&&&&&addr2.setAddress("dalian");&&&&&&&&&&&& &&&&&&&&&&&&&&TAddress&addr3&=&new&TAddress(); &&&&&&&&&&&&&addr3.setTel("136"); &&&&&&&&&&&&&addr3.setZipcode("100080"); &&&&&&&&&&&&&addr3.setAddress("beijing"); &&&&&&&&&&&&& &&&&&&&&&&&&&//设置关联 &&&&&&&&&&&&&HashSet&set&=&new&HashSet(); &&&&&&&&&&&&&set.add(addr); &&&&&&&&&&&&&set.add(addr2); &&&&&&&&&&&&&set.add(addr3); &&&&&&&&&&&&&user.setAddress(set); &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &&&&&&&&&&&&&tran&=&session.beginTransaction();&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &&&&&&&&&&&&&//插入user信息 &&&&&&&&&&&&&session.save(user); &&&&&&&&&&&&&session.flush(); &&&&&&&&&&&&&mit(); &&&&&&&&&&&&&Assert.assertEquals(user.getId().intValue()0&,true); &&&&&&&&&}&catch&(HibernateException&e)&{ &&&&&&&&&&&&&e.printStackTrace(); &&&&&&&&&&&&&Assert.fail(e.getMessage()); &&&&&&&&&&&&&if(tran&!=&null)&{ &&&&&&&&&&&&&&&&&try&{ &&&&&&&&&&&&&&&&&&&&&tran.rollback(); &&&&&&&&&&&&&&&&&}&catch&(Exception&e1)&{ &&&&&&&&&&&&&&&&&&&&&e1.printStackTrace(); &&&&&&&&&&&&&&&&&} &&&&&&&&&&&&&} &&&&&&&&&} &&&&&} &&&&& &&&&&/** &&&&&&*&对象读取测试(Select方法) &&&&&&*/&&&&&&&&&&&& &&&&&public&void&testSelect(){ &&&&&&&&&String&hql&=&"&from&TUser&where&name='byf'"; &&&&&&&&&try&{ &&&&&&&&&&&&&List&userList&=&session.createQuery(hql).list(); &&&&&&&&&&&&&TUser&user&=&(TUser)userList.get(0); &&&&&&&&&&&&&System.out.println("user&name&is&"&+&user.getName()); &&&&&&&&&&&&& &&&&&&&&&&&&&for&(Iterator&iter&=&user.getAddress().iterator();&iter.hasNext();)&{ &&&&&&&&&&&&&&&&&TAddress&addr&=&(TAddress)&iter.next(); &&&&&&&&&&&&&&&&&System.out.println("user&address&is&"&+&addr.getAddress());&&&&&&&&&&&&&&&& &&&&&&&&&&&&&} &&&&&&&&&&&&&Assert.assertEquals(user.getName(),&"byf"); &&&&&&&&&}&catch&(Exception&e)&{ &&&&&&&&&&&&&e.printStackTrace(); &&&&&&&&&&&&&Assert.fail(e.getMessage()); &&&&&&&&&} &&&&&} &}&
说明:一个问题,由于是单向关联,为了保持关联关系,我们只能通过主控方对被动方进行级联更新。如果被关联方的字段为NOT NULL属性,当Hibernate一对多创建或者更新关联关系时,可能出现约束违例。
例子中T_Address表中的user_id 为NOT NULL,如果在TAddress.hbm.xml映射了全部字段时。创建一个用户并赋予她地址信息,对于T_Address表而言,Hibernate一对多会执行两条sql语句来保存地址信息。
要执行两条SQL语句,是因为关联是单向的,就是说对于TAddress对象而言,并不知道自己应该与那一个TUser对象关联,只能先将user_id设为一个空值。之后,根据配置文件&name="address"&table="t_address"&cascade="all"&order-by="zipcode&asc"&&&&&&&&&&&&&&column="user_id"&&&&&&&&&&&&&&&&&&&&&&&&&&&class="cn.blogjava.start.TAddress"&&&&&&&&&&&
Hibernate一对多数据关联是Hibernate中比较典型的问题,这里只是简单介绍。
【编辑推荐】
【责任编辑: TEL:(010)】
关于的更多文章
AngularJS是很多Web开发人员在打造单页面应用程序时的首选创建方
作为移动开发者,WOT2016移动互联网技术峰会,绝对有你不得不来的理由。
讲师: 4人学习过讲师: 7人学习过讲师: 66人学习过
很显然,Oracle已正在开发Java 9。Java 9主要的增强内
一个好的工具无论是对于开发者还是整个项目而言,都是
在此之前的几年时间里,已经有很多开发者陆续使用了HT
本书由浅入深地介绍Windows Forms编程的技巧和各种实用方法。本书先详细介绍了菜单、状态条、可复用类库、文件对话框、文本框、
51CTO旗下网站Hibernate一对多双向关系,取一端数据同时抓取多端到Set&E&中,如何避免重复
[问题点数:40分,结帖人zg2010]
Hibernate一对多双向关系,取一端数据同时抓取多端到Set&E&中,如何避免重复
[问题点数:40分,结帖人zg2010]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
本帖子已过去太久远了,不再提供回复功能。温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
一个热爱生活,对未来充满无限向往的,普通青年。。。
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
<div style="font-family: A word-wrap: break- word-break: break- visibility: visible !imp zoom: 1 !imp filter: color: rgb(77, 60, 50) !imp font-size: 12 line-height:"
><span style="font-family: Verdana, A word-wrap: break- word-break: break- visibility: visible !imp zoom: 1 !imp filter: color: rgb(77, 60, 50) !imp font-size: 12 line-height:"
>&悬赏分:200&-&<span style="font-family: Verdana, A word-wrap: break- word-break: break- visibility: visible !imp zoom: 1 !imp filter: color: rgb(77, 60, 50) !imp font-size: 12 line-height:"
>解决时间: 11:50<div style="font-family: A word-wrap: break- word-break: break- visibility: visible !imp zoom: 1 !imp filter: color: rgb(77, 60, 50) !imp font-size: 14 line-height:"
>插入和删除级联都没有问题主要是修改怎么实现,&郁闷中,映射配置已经搞定,比如一个parent表一个child表,child表和parent表同时有新数据,我是这样做的用一个parent表去getchild,Set child=parent.getchild();然后把set里面的child的记录拿出来用Iterator一个个重新set新数据,&Iterator it=childe.iterator();&while(it.hasnext())&{&Child child=(Child)it.next();&child.setName(新数据);&}&现在关键问题来了,要怎么把child记录再set回child集合中,然后parent.setchild(child(新的child集合));然后session.update(parent)实现级联更新&才能实现级联更新郁闷中。。大家帮个忙想想<div style="font-family: A word-wrap: break- word-break: break- visibility: visible !imp zoom: 1 !imp filter: color: rgb(77, 60, 50) !imp font-size: 14 line-height:"
><div align="right"
style="font-family: A word-wrap: break- word-break: break- visibility: visible !imp zoom: 1 !imp filter: color: rgb(77, 60, 50) !imp font-size: 12 line-height:"
>提问者:&smluyi&-&江湖少侠 六级<div style="font-family: A word-wrap: break- word-break: break- visibility: visible !imp zoom: 1 !imp filter: color: rgb(77, 60, 50) !imp font-size: 12 line-height:"
><div style="font-family: A word-wrap: break- word-break: break- visibility: visible !imp zoom: 1 !imp filter: color: rgb(77, 60, 50) !imp font-size: 12 line-height:"
><div style="font-family: A word-wrap: break- word-break: break- visibility: visible !imp zoom: 1 !imp filter: color: rgb(77, 60, 50) !imp font-size: 12 line-height:"
><div style="font-family: A word-wrap: break- word-break: break- visibility: visible !imp zoom: 1 !imp filter: color: rgb(77, 60, 50) !imp font-size: 12 line-height:"
><div style="font-family: A word-wrap: break- word-break: break- visibility: visible !imp zoom: 1 !imp filter: color: rgb(77, 60, 50) !imp font-size: 12 line-height:"
><div style="font-family: A word-wrap: break- word-break: break- visibility: visible !imp zoom: 1 !imp filter: color: rgb(77, 60, 50) !imp font-size: 12 line-height:"
><div style="font-family: A word-wrap: break- word-break: break- visibility: visible !imp zoom: 1 !imp filter: color: rgb(77, 60, 50) !imp font-size: 12 line-height:"
><div style="font-family: A word-wrap: break- word-break: break- visibility: visible !imp zoom: 1 !imp filter: color: rgb(77, 60, 50) !imp font-size: 12 line-height:"
><div style="font-family: A word-wrap: break- word-break: break- visibility: visible !imp zoom: 1 !imp filter: color: rgb(77, 60, 50) !imp font-size: 12 line-height:"
><div style="font-family: A word-wrap: break- word-break: break- visibility: visible !imp zoom: 1 !imp filter: color: rgb(77, 60, 50) !imp font-size: 12 line-height:"
><div style="font-family: A word-wrap: break- word-break: break- visibility: visible !imp zoom: 1 !imp filter: color: rgb(77, 60, 50) !imp font-size: 12 line-height:"
>最佳答案<div style="font-family: A word-wrap: break- word-break: break- visibility: visible !imp zoom: 1 !imp filter: color: rgb(77, 60, 50) !imp font-size: 12 line-height: padding-right: 0 padding-left: 0 padding-bottom: 5 padding-top: 5"
><div style="font-family: A word-wrap: break- word-break: break- visibility: visible !imp zoom: 1 !imp filter: color: rgb(77, 60, 50) !imp font-size: 12 line-height:"
><div style="font-family: A word-wrap: break- word-break: break- visibility: visible !imp zoom: 1 !imp filter: color: rgb(77, 60, 50) !imp font-size: 14 line-height:"
>??&可以这样&parent.setName("");&Iterator childs = parent.getChilds().&while(childs.hasNext()){&Child child = (Child)it.next();&child.setId();//记得set这个,要不不是级联更新&child.setName("");&set.add(child);&}&然后再parent.setChild(set);&如果你配置文件里的级联更新是开启的话,这样应该就可以了.如果还不行,笨点的方法就是拆开了一个一个更新也行 .
阅读(2170)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
loftPermalink:'',
id:'fks_',
blogTitle:'hibernate
一对多,多对多的级联修改',
blogAbstract:'<tr style=\"font-family: Verdana, A word-wrap: break- word-break: break- visibility: visible !imp zoom: 1 !imp filter: color: rgb(77, 60, 50) !imp font-size: 12\"
\><td style=\"font-family: A word-wrap: break- word-break: break- visibility: visible !imp zoom: 1 !imp filter: color: rgb(77, 60, 50) !imp font-size: 12 line-height: 18\"
style=\"font-family: A word-wrap: break- word-break: break- visibility: visible !imp zoom: 1 !imp filter: color: rgb(77, 60, 50) !imp\"\>',
blogTag:'hibernate,多对多级联修改,一对多级联修改',
blogUrl:'blog/static/',
isPublished:1,
istop:false,
modifyTime:0,
publishTime:5,
permalink:'blog/static/',
commentCount:1,
mainCommentCount:1,
recommendCount:0,
bsrk:-100,
publisherId:0,
recomBlogHome:false,
currentRecomBlog:false,
attachmentsFileIds:[],
groupInfo:{},
friendstatus:'none',
followstatus:'unFollow',
pubSucc:'',
visitorProvince:'',
visitorCity:'',
visitorNewUser:false,
postAddInfo:{},
mset:'000',
remindgoodnightblog:false,
isBlackVisitor:false,
isShowYodaoAd:false,
hostIntro:'一个热爱生活,对未来充满无限向往的,普通青年。。。',
hmcon:'0',
selfRecomBlogCount:'0',
lofter_single:''
{list a as x}
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}}

我要回帖

更多关于 hibernate 更新语句 的文章

更多推荐

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

点击添加站长微信