日期:2014-05-18  浏览次数:20589 次

有一个主表A, 它有一个子表B. 现在要对主表A做更新操作.
有点长, 慢慢打字的. 我在做一个java web应用
有一个主表A,  它有一个子表B. 现在要对主表A做更新操作.
假定 a是主表A的一行记录, b1,b2,b3....bN是子表B的记录, 并且b1,b2,b3....bN 的外键指向a.
现在更新记录a, 
用一个页面展示a的相关字段, 并且同时展示a的子表(即记录b1,b2,b3....bN)
现在a的子表有可能被删除,更新,增加.
那么在后台(java hibernate)保存时, 如何来处理这个问题.
我的做法是
方法1 : 先把a下面的子表全部删除, 然后再全部把页面提交过来的子表数据保存
方法2 : 在保存前先用一个变量(List类型, 数组类型都好, 记做变量K)保存原来数据库中子表的id, 页面提交数据后, 如果页面提交的数据是没有id的, 那么这条记录是需要保存的; 如果页面提交的数据有id, 这个id也在变量K里面, 那么是需要更新的; 如果一个id在变量K里面, 而没有出现在页面提交的数据中, 那么是需要删除的; 当然正常情况下不会出现, 在页面提交的id没有在变量K里面.

上面2个方法都感觉不大好, 望望各位同仁有什么好方法, 谢谢.
hibernate的merge用来做什么用的

------解决方案--------------------
你这个是一对多操作啊,映射文件里面配置好set,hibernate会自动更新A,B关联的记录
merge合并不同的session
------解决方案--------------------
首先标题是对主表a操作,正文又说对字表进行更新、删除操作,你的意思是对子表进行更新、删除操作后,子表的外键和主表的对应关系的怎么处理,好在页面显示?对吗
1.更新肯定是一个一个操作的吧,来一个更新一个呗,持久化对象里肯定有这个对象的直接更新就行了,外键关系也没变化啊,只是更新类容吧。
2.删除可能与批量操作,删除就删除,就直接没有了这个关系。
3.添加操作,才是从没有到有关联关系的操作,添加只是记住主表的主键,在添加子表的时候直接将主表ID插入进去不就OK了嘛,分开思考。
------解决方案--------------------
对于这个也没有什么好的方法,我认为楼主的第一种和第二种方法就可以。

目前一些前端UI组件的做法是:对子表信息进行判断(新增的,修改的,删除的),后台取出数据
做相应的操作。