<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    在mysql里建立2個表
    CREATE TABLE `customers` (
      `id` int(11) NOT NULL auto_increment,
      `name` char(20) character set latin1 default NULL,
      PRIMARY KEY  (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

    CREATE TABLE `orders` (
      `id` int(11) NOT NULL auto_increment,
      `customer_id` int(50) NOT NULL default '0',
      `order_number` int(50) default NULL,
      PRIMARY KEY  (`id`),
      KEY `fk_customer_id` (`customer_id`),
      CONSTRAINT `fk_customer_id` FOREIGN KEY (`customer_id`) REFERENCES `customers` (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

    然后自動生成持久化類,在customers.hbm.xml一方設置與orders的外鍵customer_id的一對多關聯,其中聯級操作為save-update,inverse="true"為表示hibernate不由customers對象的狀態變化來更新數據庫,僅按照Orders對象狀態變化來更新數據庫。由此來優化hibernate的性能。
     <set name="orderses" inverse="true" cascade="save-update">
                <key>
                    <column name="customer_id" unique="true" />
                </key>
                <one-to-many class="com.yourcompany.model.Orders" />
            </set>

    在orders.hbm.xml設置多對一關聯,其中業務邏輯決定了order是由customer來下決定的,所以必須not-null="true" ,聯級操作根據實際情況而定,本例子的邏輯關系里面,應該不需要在many-to-one一方設置save-update聯級操作,因為增加orders并不需要增加customer。在目前的情況里如果設置了save-update,增加orders記錄的時候hibernate就會把原來已存在的customers記錄設置為null。這是不對的。
            <many-to-one name="customers" class="com.yourcompany.model.Customers" fetch="select" >
                <column name="customer_id" not-null="true" unique="true" />
            </many-to-one>

    在AddCustomerAction里保存一個customers,之后可以看到當保存一個customers的同時,orders也同時保存了該customers的id。
      String strname = addCustomerForm.getString("name");
      Customers customers = new  Customers();
      customers.setName(strname);
      Orders orders=new Orders();
      orders.setCustomers(customers);
      customers.getOrderses().add(orders);
      customersDAO.save(customers);

    其中
      orders.setCustomers(customers);
      customers.getOrderses().add(orders);
    在建立兩個對象的雙向關聯時,應該同時修改關聯兩端的對象的相應屬性,這樣可提高業務邏輯的獨立性。
    比如:解除雙向關聯時:
      customers.getOrderses().remove(orders);
      orders.setCustomers(null);

    在AddOrdersAction里,由表單傳入customers的ID值和新增加的order_number值。ordersDAO.attachDirty(orders);為Myeclipse里生成的DAO,其調用的是HibernateTemplate的getHibernateTemplate().saveOrUpdate(instance);方法。
      Integer strcustomers= Integer.valueOf(addOrdersForm.getString("customers"));
      Integer strorder_number= Integer.valueOf(addOrdersForm.getString("order_number"));
      Orders orders = new  Orders(); 
      Customers customers = new  Customers();
      customers.setId(strcustomers);
      orders.setCustomers(customers);
      orders.setOrderNumber(strorder_number);
      ordersDAO.attachDirty(orders);

    在這里的持久化對象的生命周期里,當Customers customers = new  Customers();時,Customers還屬于臨時狀態,而到了sessionv.save(customers);的時候Customers由臨時狀態轉變為持久化狀態。臨時狀態時不處于Session緩存中,轉化為持久化狀態后Customers就加入到了Session緩存中,在此Customers customers 2=(Customers)session.load(Customer.class,id);、Customers customers 3=(Customers)session.load(Customer.class,id);、均是在持久化狀態。而直到session.close();就表明Customers退出了Session緩存,由持久化狀態轉變為游離狀態。System.out.println(customers 3.getname());也是處于游離狀態。到最后c2=null;c3=null;Customers生命周期結束。

    Session有三種檢索方法:load()、get()、find(),檢索策略有類級別的:立即檢索、延遲檢索,關聯級別的立即檢索、延遲檢索、迫切左外連接檢索。在類級別中應該有線考慮使用立即檢索。不管hbm文件里lazy屬性是true還是false,Session的get()、find()方法總是使用立即檢索策略。

    在一對多關聯級別中,對于<set>元素不能隨意使用立即檢索策略,盡量使用延遲檢索策略。應用程序如果新聞訪問游離狀態的代理類實例,必須保證它在持久化狀態時已經被初始化,不然會拋出異常

    對于多對一或一對一關聯,應該優先考慮使用外連接檢索策略,因為它比立即檢索策略使用的select語句數目少。在默認情況下<many-to-one>元素的outer-join屬性為auto,<class>元素的lazy屬性為false,因此默認使用迫切外連接檢索策略。迫切外連接檢索策略受數據庫表的大小和連接影響,如果select語句中的外連接表的數目太多,會影響檢索性能,可以通過Hibernate配置文件中的hibernate.max_fetch_depth來達到優化。hibernate.max_fetch_depth取決數據庫連接性能及表大小。

    posted on 2007-08-27 10:15 lzj520 閱讀(732) 評論(0)  編輯  收藏 所屬分類: 個人學習日記Hibernate
    主站蜘蛛池模板: 午夜毛片不卡高清免费| 免费观看大片毛片| 日本免费网站在线观看| 曰韩亚洲av人人夜夜澡人人爽 | 青青草原亚洲视频| 亚洲熟妇无码爱v在线观看| 亚洲精品天堂成人片AV在线播放| 一级有奶水毛片免费看| 青青视频观看免费99| 亚洲高清视频一视频二视频三| 噜噜噜亚洲色成人网站∨ | 亚洲日韩一区二区一无码| 三根一起会坏掉的好痛免费三级全黄的视频在线观看 | 无码中文字幕av免费放| 亚洲自偷自偷在线制服| 2019亚洲午夜无码天堂| 一级做a爰片久久免费| 久热中文字幕在线精品免费| 亚洲日韩中文在线精品第一| 亚洲国产成人精品久久久国产成人一区二区三区综| 午夜亚洲www湿好大| 亚洲精品动漫免费二区| 99视频在线免费观看| 人妻视频一区二区三区免费| 亚洲精品国产电影| 亚洲人成网站18禁止久久影院| 精品亚洲国产成人| 免费夜色污私人影院网站电影| 波多野结衣免费一区视频 | 亚洲av日韩av永久在线观看| 国产情侣久久久久aⅴ免费 | 国产在线观看免费完整版中文版 | 免费高清在线影片一区| 久热综合在线亚洲精品| 国产亚洲视频在线播放大全| 日韩精品内射视频免费观看 | 老外毛片免费视频播放| 18禁黄网站禁片免费观看不卡| 亚洲高清无码综合性爱视频| 亚洲国产精品久久人人爱| 中文在线观看永久免费|