Hibernate一对多关联关系保存时的探究

        在以前使用hibernate时,经常对保存存在关联关系的对象时,不确定是否能保存成功。
    因此,特意对一对多关系的2个对象进行实践。

一、pojo类和配置文件的准备

        这里有一点提前说一下, 外键列在数据库中 没有设置为不为null。因此可以出现外键为空的情况。
(1)pojo类
          1222688-20170819183831365-1979593439.png     1222688-20170819183831787-1854680734.png
 (2)映射文件
          1222688-20170819183832896-1592247202.png      1222688-20170819183833787-588410349.png
(3)测试类中方法的准备
          1222688-20170819183834662-286262082.png
 

二、双方都维护关联关系且双向关联

        注意:这里的双向关联是指双向都建立关系
    (1)1方和多方都保存,且建立了双向关联的关系。这样是肯定可以 保存成功的。
             1222688-20170819183835287-360414271.png 1222688-20170819183836006-517867361.png

(2)1方或多方中,有一方没有保存。那么会 保存失败,因为保存时分类是瞬时态对象,所以失败。
             1222688-20170819183836678-1046829890.png1222688-20170819183837490-60648165.png
 

(3)在(2)的代码的基础上,给product的映射文件中配置一个级联保存。这样在保存产品时就会级联保存分类,这样 分类不是瞬时态对象了, 保存成功

               1222688-20170819183838068-1751536169.png
              1222688-20170819183838568-19638028.png


三、双向维护外键,但只建立单向关联关系

 (1)产品中没有分类,由于外键可以为null;因此可以 保存成功
           1222688-20170819183839225-44852186.png1222688-20170819183839693-1732965823.png

(2)产品中没有分类,分类中有产品。产品和分类都执行保存,保存成功
               1222688-20170819183840412-1212003128.png    
             1222688-20170819183840975-1377628370.png
(3)产品中没有分类,分类中有产品,只保存分类。这里肯定保存失败,因为分类也会维护外键。
          当分类维护外键时,发现集合里面的产品是瞬时态对象。所以肯定 保存失败了
          1222688-20170819183841818-2047787659.png

四、外键只靠多方维护

    先把一方维护外键的功能取消,只需要在分类的映射文件中,配置inverse为true
       1222688-20170819183842303-1121103530.png
(1)产品中有分类,只保存产品。这样由于保存产品时,会去维护外键,而用来维护外键的分类对象为瞬时态对象,所以一定 保存失败
        1222688-20170819183843428-1178692908.png
 
(2)针对(1)我们在保存产品后面添加保存分类。这样保存产品时,用于维护外键用的对象就是持久态对象了。这样就 保存成功
        1222688-20170819183844615-1969193890.png
(3)产品中有分类,分类中有产品,只保存分类。 保存成功。因为分类不会维护外键,所以不管集合里面装什么状态的对象都不影响。
 
       1222688-20170819183846271-1047966291.png
(4)产品中有分类,只保存分类。一定 保存成功,因为分类不维护外键,且用于维护外键的对象也没有。道理同(3)。
       1222688-20170819183847365-391899951.png

五、总结

       看了这么多实例,发现保存失败的原因都是一样的。就是拿来去更新外键的对象(这个描述可能有点绕口)不能是瞬时态。
       比如,产品这一方维护外键的话,那么他的用来更新外键的对象就是他里面的那个分类。如果这个分类是瞬时态对象,肯定保存失败。
  
 

 

 

 
 
 
 


 
 

 

 

转载于:https://www.cnblogs.com/zeng1994/p/7397550.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值