传智播客java培训2010年4月25日hibernate学习

本文详细介绍了通过Hibernate框架实现的一对多、多对一及多对多等关联映射的具体配置方法,包括Java类和配置文件中的实现细节,并探讨了不同配置选项的影响,如级联操作、延迟加载等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天放假,但基于,现在的状况根本不是放假的时机,所以,放假是别人的假期,与我无缘,谁叫我老大不小,天智不慧呢!努力是我求知路上相信的唯一真理。

重新做了一遍一对多,多对一双向的关联的练习,以求在其中能发现点什么理解的规律,果不其然,总是有收获得。他仅仅是将多对一和一对多的组合。首先,要清楚的是,他们在表中的联系仅仅就是一个外键。具体的实现方法在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);

输出4SQL语句,三条查询,一条更新,所以,相比之下,效率较底。还需要注意的是,在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,永不停止的学习。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值