hibernate 一对多映射关系

1.   单项多对一映射

      custom(顾客)与order(订单) :一个顾客可以有多个订单,一个订单只能有一个顾客

      配置方法:在多的一端配置<many -to one>

      执行save操作时,1 先插入1的一端,再插入n的一端,只有insert语句

                              2 先插入n的一端,再插入1的一端,会多出update语句(因为在插入n的一端时,无法确定1的一端的外键值,

                                所以只能等1的一端插入后在额外发送 update语句)

                               所以推荐先插入1的一端,再插入n的一端;

      执行查询操作时:1 若查找多的一端的一个对象,默认情况下,只查询了多的一端的对象,而没有查询关联的一端的对象

                             2 在使用到关联的对象时,才会发送对应的SQL语句

                             3 在查询custom对象时,由多的一端导航到1的一端时,若Sesssion已关闭,则默认情况下,会发生懒加载异常

                             4 获取order对象时,默认情况下,其关联的custom对象是个代理对象

 

      执行delete操作时:1 在不设定级联关系的情况下,且1的一端的对象有多的对象在引用,则不能删除1 的一端的对象

 

2.  双向1对n(双向n对1)

      custom(顾客)与order(订单) 

      order 中 

      custom 中 private Set<order> orders =new HashSet<>();

                       <set name="orders" table="order" inverse="true" cascade="delete" >

                              <key column="custom_id"></key>

                              <one-to-many class="order" />

                        </set>

          table:Set中的元素对应的记录放在哪一个数据表中,该值需要和多对一的多的表名一致

          inverse:指定由哪一方来维护关联关系,通常设置为true,以指定由多的一端来维护关联关系

          cascade: 设定级联操作,开发时不建议设定该属性,建议以手工的方式来处理

          order-by:在查询时对集合中的元素进行排序,order-by使用的是表的字段名,而不是持久化类的属性名

 

     查询操作:1 对多的一端的集合采用延迟加载,

                   2 返回的多的一端的集合是Hibernate内置的集合类型,该类型具有延迟加载和存放代理对象的功能

                   3 可能会抛出懒加载的异常

                   4 在使用集合中的元素的时候进行初始化

 

                                 

                            

   

posted @ 2016-06-14 16:17  hellolcc  阅读(125)  评论(0编辑  收藏