hibernate 多层次的级联保存有问题
有以下几个对象:
1 托运单
2 运费单
3 货款单
4 回扣单
5 结算单
6 支票
他们的级联分为3层进行
第一层:
@ 托运单 一对一级联 运费单
@ 托运单 一对一级联 货款单
@ 托运单 一对一级联 回扣单
第二层:
@ 运费单 一对多级联 结算单(一张运费单可能多次结算)
@ 货款单 一对多级联 结算单
@ 回扣单 一对多级联 结算单
第三层:
@ 结算单 一对多级联 支票(本次结算可能采用多张支票来支付)
这样,保存托运单的时候就意味着保存运费单,货款单,回扣单,而保存运费单,货款单,回扣单又意味着保存结算单,而保存结算单又意味着保存支票信息.
现在,我把所有这些对象的数据都备齐,按照级联关系组织为托运单,使用 hibernate 的 session.save(托运单) ,然后到数据库中查看数据的保存情况,发现有以下问题:
1 托运单的数据,运费单,货款单,回扣单的数据,运费单级联的结算单数据,结算单级联的支票数据,都已经正确的保存到数据表中,但是,货款单级联的结算单数据,回扣单级联的结算单数据,都没有保存到数据表中.
2 运费单级联的结算单数据虽然可以保存到数据表中,但是运费单和结算单的级联关系并没有保存下来,因为用来维护级联关系的数据表字段为null,当我们查询运费单的时候,对应的结算单的数据无法查询.
我的问题是:
1 像这样将多个对象组织为一个对象,然后进行保存可行吗?
2 上面几个对象的级联关系设计是不是有问题?如何正确设计他们之间的级联关系?
3 如果第1个问题是可行的,第2个问题的级联设置也是正确的,那么保存到数据库中出现的2个问题大概是什么原因引起?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
我自己提出的3个问题中,现在做出如下回答:
1 将多个对象组织为一个对象,然后进行保存可行吗?
当然可行.
2 上面几个对象的级联关系设计是不是有问题?如何正确设计他们之间的级联关系?
这个问题我自己都不好回答,因为提出这个问题的目的是想让别人来提醒自己可能有其他更好的设计方式。
或者指出自己的设计思路存在什么问题,@岸上的风景 提出的建议不错,不过我不打算使用他的方法.
3 出现的2个问题大概是什么原因引起?
准确的讲,是我自己对 hibernate 不了解引起的.
在我的理解当中,托运单一对一级联运费单,运费单一对多级联结算单,这样我就可以使用下面的2条语句来组织为 托运单 这个对象了
(假设托运单的名称为tyd,运费单的名称为yfd,结算单的名称为jsd)
A yfd.setJsd( jsd )
B tyd.setYfd( yfd )
这样做确实可以组织为 托运单 这个对象了,但是由于 运费单 是一对多级联 结算单 ,一对多进行级联的时候,保存级联关系的外键是在 结算单(多的一方) 这个数据表里面的,试想一下,上面的2条语句中的 A 语句,确定了结算单这个数据表中的外键字段的值了吗?我总是想当然的认为hibernate应该自动确定这个外键的值,但是,由于A语句设置的数据是集合,要设置集合中每个对象(多的一方)的外键的值还是蛮费力的,因此,级联关系没有保存下来,甚至结算单没有保存下来是应该的.
再加上下面的语句就可以了:
C jsd.setYfd ( yfd )(在多的一方设置一的值,就设置了数据表中外键的值)
可能每个人的编程习惯不一样,我在项目中用到级联操作比较少,需要关系保存的,我一般会放到一个事务里面,手动做保存。
这样的好处我认为
1、可以更加清晰的处理个级别关系
2、方便调试以及关系修改
3、有时候自己写一些代码可能会安心一点
非常感谢,解决了我的问题~~~~