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


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

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

            这里有一点提前说一下,外键列在数据库中没有设置为不为null。因此可以出现外键为空的情况。
    (1)pojo类
               
     (2)映射文件
                
    (3)测试类中方法的准备
            
     

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

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

    (2)1方或多方中,有一方没有保存。那么会保存失败,因为保存时分类是瞬时态对象,所以失败。
                
     

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

                
                 


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

     (1)产品中没有分类,由于外键可以为null;因此可以保存成功
              

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

    四、外键只靠多方维护

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

    五、总结

           看了这么多实例,发现保存失败的原因都是一样的。就是拿来去更新外键的对象(这个描述可能有点绕口)不能是瞬时态。
           比如,产品这一方维护外键的话,那么他的用来更新外键的对象就是他里面的那个分类。如果这个分类是瞬时态对象,肯定保存失败。
     
  • 相关阅读:
    复习事件委托
    模式学习⑧--观察者模式
    模式学习⑦ --中介者模式
    模式学习(六)--- 策略模式
    模式学习(五)--装饰者模式
    模式学习(四)-迭代器
    模式学习(三)- 工厂模式
    模式学习(二)
    linux rpm包解压
    linux patch中的p0和p1的区别
  • 原文地址:https://www.cnblogs.com/xiang--liu/p/9710285.html
Copyright © 2020-2023  润新知