今天放假,但基于,现在的状况根本不是放假的时机,所以,放假是别人的假期,与我无缘,谁叫我老大不小,天智不慧呢!努力是我求知路上相信的唯一真理。 重新做了一遍一对多,多对一双向的关联的练习,以求在其中能发现点什么理解的规律,果不其然,总是有收获得。他仅仅是将多对一和一对多的组合。首先,要清楚的是,他们在表中的联系仅仅就是一个外键。具体的实现方法在JAVA类中以及配置文件中。一方有多方的集合,多方有一方的对向,就OK。然后配置文件中配置时需要注意是的: 一方: <set name="set" cascade="save-update" inverse><!--inverse是否有权影维护操作中关联关系的权利,外键--> <key column="fff"/><!-- 这个名字在表中显示的名字 --> <one-to-many class="Orders"/> </set> 多方: <many-to-one name="customer" class="Customer" cascade="save-update"> <column name="ff"></column> </many-to-one> 上面两段粗体文字要一样。否则在表中就出现了多个外键了。 cascade="save-update" 是打开级联,就是在保存和更新的时候同时更新所关联的东西。
在集合中,将lazy设置为false时 当查询这个对象的时候就把集合中的数据查询出来了。 。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。 Customer c = (Customer) s.get(Customer.class, 1); System.out.println(c.getSet().size()); Set set = c.getSet(); Iterator it = set.iterator(); while(it.hasNext()){ Orders o = (Orders) it.next(); System.out.println(o.getOrderNo()); } 。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。 Customer c1 = (Customer) s.get(Customer.class, 1); //第二次再取时不查DB Set set1 = c1.getSet(); Iterator it1 = set.iterator();
while(it1.hasNext()){ Orders o = (Orders) it1.next(); System.out.println(o.getOrderNo()); } 。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。 Session是一级缓存 ,从上例可见,缓存中存储了相同的对象。将不再查询。
从表结构单纯的上看,更改一个表的外键是非常容易的。因为只需要一条语句就OK了。而在HIBERNATE中却非常复杂,需要先查询出需要更改的对象,然后在查询与之关联的对象,两边同时改变。所以,更新效率较底。 代码如下: /*得到2号客户*/ Customer c = (Customer) s.get(Customer.class, 2); /*得到2号订单*/ Orders o = (Orders) s.get(Orders.class, 2); /*将2号订单设置给2号客户,不管他以前是那个客户的*/ c.getSet().add(o); o.setCustomer(c); 输出4条SQL语句,三条查询,一条更新,所以,相比之下,效率较底。还需要注意的是,在SESSION中只要对象发生了改变,对象就会与COMMIT时与数据库同步。
<many-to-one name="customer" class="Customer" cascade="save-update-delete" insert="false" update="false"> Many-to-one 中的 insert="false" update="false" 始终没有弄懂。
Load/get都是按OID进行检索。
理解SESSION缓存: Session s = .......; s.Flush(); //清理,数据库与缓存同步,但是不提交(有回滚的机会) s.Clear();//清空缓存 S.refresh();//刷新缓存,让缓存与数据同步
映射组成关系。部分与整体。组件映射相对简单。 映射文件中加: <component name="homeAdd" class="Address"> <parent name="customer"/> <property name="street" column="h_street"/> <property name="floot" column="h_floot"/> </component> 在组件类中,加入引用。
一对一关联: 1.一对一外键关联。(其中一表有外键) 要点:一对一外键关联是多对一关联的特殊形式,要求多方唯一,所以又称为唯一外键关联。
2.一对一共享主键关联。(没有外键) 要点:两个关联表使用相同的主键值,其中一个表的主键共享另外一个表的主键。 其中一个的主键还是正常生成。而另一个表的主键依靠该主键。 多对多关联: 1.多对多单相关联 2.多对多双相关联 多对多,与其它关联关联都一样,无非都是一个配置不相同的问题,但是他们配置方式都大同小异。重点是不其的配置方式,重要在于配置之后,他们的运行方式,他们的效率,这也是我们学习HIBERNATE最终要面对的东西,也同时是标志我们是否是学好,以及对我们后期面试的一个考验。 今天把所有的关联映射复习了一遍,总体上有了一个大致的了解,但是还是不熟练,今天十个小时,都把只是练习了一遍,所以啊,JAVA之难,不在于技术之难,是而难于人都畏难的情绪。JAVA,永不停止的学习。