Hibernate的对象--关系映射(2)

对象与映射关系总结2

 

 

 

一:一对一的关系

 

步骤:1、建立Hibernate-cfg.xml文件

            2、建立一对一对象Customer和CardID

            在建立对象Customer 和CardID时

          A.Customer类里要把CardID对象组合进来,并且不能初始化!

                  否则会报java.lang.StackOverflowError的异常

     (为什么要报此错,并不理解!)

 

    B.CardID类里面要把Customer组合进来,在此类里,无论初不初始化,都不会报异常!

 

      3、在数据库中建立对应的表

 

      4、建立Customer.hbm.xml对象和关系映射文件

             A、在此映射文件里generator主键生成器要设为assigned(主键由外部程序生成,无需hibernate参与)

              B、在<one-to-one> 里面cascade(级联)要设置成all

       5、建立CardID.hbm.xml

         A、在此映射文件里generator主键生成器要设为foreign(使用外部表的字段作为主键。)

           并且要在此标签里加上<param name="property">customer(Customer类指定的引用的属性)</param>标签

 

       6、建立OneToOneService(业务操作类)

 

二:多对一的关系

 

   步骤:1、建立Hibernate-cfg.xml文件

                  2、建立多对一对象Customer和Order

                  3、建立数据库中的表

 

        在 Order类里面把Customer类组合进来,Customer类可以初始化,也可以不初始化

(具体原因就是:不是很清楚)

         

         4、建立Order.hbm.xml对象与关系映射文件

       

        A、在此映射文件里generator主键生成器要设为assigned(主键由外部程序生成,无需hibernate参与)

        B、并且在此文件里的<many-to-one>的标签中最好是不要设置cascade

    但要设置column="外键"

        

  (因为多对一的关系,多方的多条记录可能对于一方的一条记录,所以插入、更新、删除等操作时,不需要级联操作

 )

         5、建立业务操作类

 

 

 

 

三、一对多的关系

      步骤:1、建立Hibernate-cfg.xml文件

                  2、建立多对一对象PublishHouse和Book

                             在PublishHouse中利用set集合讲Book组合进来

         3、建立对象与关系映射文件

 

         4、   建立数据库中的表

                       A. 在多的一方Book.hbm.xml中配置很简单

                         只有id(id中有generator)property

                     B.在一的那方必须配置

                <set name="bookSet" table="t_book" cascade="all">

        <key column="PID"></key>

        <one-to-many class="com.lovo.hibernate.OneToMany.Book"/>

     </set>

            

         5、建立业务操作类

 

四、多对多的关系

 

           用两个一对多的关系配置就可以得到!

(但最重要的是cascade inverse的配置)                             

     

 

 

总结:

 

一、

get load

 

Aget

1、在一级缓存中找Book 的代理Proxy

2、如果找不到就到数据库中去找

3、若数据中没有数据则返回null(这个与一级缓存无关)

4、如果数据库中有数据在一级缓存中就会创建代理对象

(是填充了数据的代理)

 

 

B、load

1、如果在一级缓存中找,如果找到了就什么都不做了

2、如果找不到的话就创建代理并且设置OID(与数据库无关,只跟一级缓存有关)

3、无论是对代理对象的任何方法,都会触发查找数据库(例如在代理中调用tostring)

 

(注意是否到二级缓存去找,根据配置来定,二级缓存没有空的代理)

二、cascadeinverse

 

1、cascade是级联、就是插入,修改,删除等操作会不会影响另外一个

Cascade属性的可能值有

    all:
所有情况下均进行关联操作,即save-updatedelete

    none:
所有情况下均不进行关联操作。这是默认值。

    save-update:
在执行save/update/saveOrUpdate时进行关联操作。

    delete:
在执行delete 时进行关联操作。


    all-delete-orphan:
当一个节点在对象图中成为孤儿节点时,删除该节点。比如在一个一对多的关系中,Student包含多个book,当在对象关系中删除一个book时,此book即成为孤儿节点。


 

2、inverse

很难理解,反正一边true,一边就要设置成false,

具体的理解,我在另外的一章总结中做了详细的总结!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值