Hibernate一对多一次提交如何处理?

最近使用Hibernate做一个POC项目,其中关于一对多新增、修改功能时碰到了一些疑惑。因为以前没怎么用过Hibernate,所以请大家帮忙看看:
1、一对多修改时,一次提交上来的子表集合的处理。我看了很多Hibernate的介绍,提到的都是一对多级联更新、级联删除等,但是在实际应用中,一个可能的情况是:在一次一对多的修改中,即有对子表的新增、又有对子表的修改和删除这三个操作。举个简单的例子:一个客户Customer有多个的关联地址Address。那么在修改客户信息的页面中,存在着一个所有关联地址的列表,在该列表中可以新增一个地址,也可以修改某个地址,又或者是删除某个地址。当整个修改工作结束后,才会点击提交。这时后台的代码接收到的Customer对象中的地址就包括了新增和修改的记录,同时没有被删除的记录。
对于这种情况,Hibernate能够处理吗?或者说这已经不是Hibernate要解决的问题,应该由应用自己处理不同的情况?我用过merge和saveOrUpdate都不行。

2、第二个问题与Hibernate没有关系,但也是在一对多关系中比较常见的一个问题:一对多在新增时,采用分次提交的方式,即主表和子表的每条记录都是各自提交的方式。现在有个需求是子表的列表需要在主表的新增页面中出现,即当新增主表时,新增页面中有个空的子表的列表,在子表列表中可以新增、修改、删除。这时候就存在着一个问题:主表还没有新增,那么子表新增时就会存在着外键约束的问题。以前我们采取的方式是在进入新增页面时先有个简单的向导页面,产生一条主表的记录,其中大部分字段的值为null,但是这种方式要求主表的绝大部分字段必须为可空的才行。不知道大家有没有什么其它的处理方式?

[b]问题补充:[/b]
关于第一个问题,我们以前的做法是:如果只是两层关联关系,那么通常是先将子表的所有数据全部删除,然后再插入从页面提交的列表记录,而不需要区分新增不是修改。而如果层次超过两层,则只能采取遍历的方式,即先查询出子表的所有关联的记录,然后判断是否在页面提交的列表中,如果没有则删除,除此之外就是区分页面提交的列表记录中哪些是新增、哪些是修改的。
现在有了Hibernate之后,我就想是不是可以直接merge主表对象就能达到这种目的,或者是先查询出主表对象,然后采用Customer.getAddresses().clear()将所有子表删除,然后再merge主表。但是好像都不行,所以就不知道在Hibernate所推荐的开发方式中,如何处理好上面那两种情况?

3个回答

merge只是对你选中的进行检查,如果有就进行修改没有则进行增加至于你以前先的有而后来取消的就不做任何操作了 所以只有你自己对他进行操作 就 像你以前的做法先删除在增加

1 级联更新能做到新增和修改, 级联删除是把主表和子表的关联记录都删了,至于你想做的只是单独删子表的记录就用不到级联删除了 只需要对子表进行删除操作了

2两个数据不是一起提交吗?
如果不是也可 先在主表 让除了主键之外的所有列允许为空,然后在先插入子表时先对主表进行一次只有主键插入的记录在插入子表记录 然后把主表ID传到主表保存页面把数据填写上对那条记录进行更新操作

不知你看懂没有

是不是你代码里没设置好关联关系,

hibernate是可以做到的,不过代码里你最好是设置双向关联

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问