lstd.net
当前位置:首页 >> hiBErnAtE 多对多 中间表不会更新? >>

hiBErnAtE 多对多 中间表不会更新?

多对多中间表一般不用这种处理方式,首先中间表是没有唯一的主键作为标识,更新信息的时候,hibernate可能出现错误更新或者异常.通常反向工程的时候不选择中间表,next以后勾选一个many-to-many的选项(让myeclimpse自动去嗅探多对多关系,然后分解成2个一对多的关系).生成的pojo类里面就会比原有的pojo类多一个集合.比如,user类里面会有一个role类的set集合,role类里面有一个user类的set集合.直接用hibernate获取到指定的user,程序里面foreach迭代一下set集合,ok.建议lz去补下hibernate里面有关级联的知识.

为什么要去手动更新这个表呢?一般你只需要关心他的具体数据对应关系,然后由hibernate去管理这个中间表

添加成功后,是不是没有提交事务,Transaction类实例调用commit()方法.

在配置文件里写,比如说:teacher 和 student 的关系 一个学生可以有多个老师,一个老师也可以有多个学生 配置文件内容 --student一方的配置文件-- //中间表与student 关联的列 与student中的主键关联 //teacher与中间表关联的列 与teacher主键关联 --teacher一方的配置文件-- //此处column值必须与上面处的column值一致 //此处column值必须与上面 的column值一致

hibernate 中判断两个对象是不是相同的,是根据主键(一般就是id)判断的,如果保存的对象里面本来就包含了id,并且id是数据库存在的,hibernate就会认为你是要修改对象而不是保存对象.如果要新建对象就要保证你的id在缓存,以及数据库中时没有的,也就是一条新的记录.希望帮到楼主.如果有问题可以再问我.

可以改成两个一对多的关系.这样两个单独的表应该就可以共同影响中间表了.

当用户点击 确定、保存之类的按钮,后,返回action处理很简单,既然你用了hibernate,需要处理那几张表,分别保存,然后返回一个true就行了,例如: 用户界面,录入了菜肴信息(表1),酒水信息(表2),提交到xxxaction!save.do,接下

在多对多关系中,中间关系表中的数据本身就是靠role和popedom来进行控制的.当添加role或popedom时,会自动根据多对多的set集合中的数据在对中间关系表的数据进行添加.删除时也一样,根据Set集合中的数据来对中间关系表进行删除.而当进行更新操作时,hibernate会自动先将中间关系表中的数据删除,再将现在Set集合中的数据添加到中间表中,以完成修改的目的.(先删除原有数据,再添加新的数据)如果不想这样自动修改,可以直接使用HQL进行修改,而不使用session.update()方法,这样可以防止这种关系表的级联操作.也可以通过配置inverse="true"来完成.关系表中的数据只能通过这种关联的方式来更新.

你的意思是一对多关联,操作一(主表)的一段,让多(从表)的一段清空?配置能让你操作主表时级联的增删改查从表,hibernate中你看看inverse和cascade这两个配置就知道了.cascade="delete-orphan"(删除“孤儿”模式,此时不被任何一个父对象引用的子对象会被删除), 否则子对象失掉父对象对其的引用时,什么事也不会发生. 如果有特殊需要,应用程序可通过显式调用delete()删除子对象.

你这里的一对多 inverse 不是true 也就是没有 关系维护上的反转或者说,是一对多的关系式一端来维护,在表上的表现就是,多出了一张中间表!!而且多端没有一端的外键!如果inverse为true则没有中间表由多端维护关系,多出一个一端的外键!

网站首页 | 网站地图
All rights reserved Powered by www.lstd.net
copyright ©right 2010-2021。
内容来自网络,如有侵犯请联系客服。zhit325@qq.com