關於hibernate中多對多關係

關於多對多關係
數據庫:在使用多對多的關係時,我們可以使用複合主鍵。也可以不使用,直接引入外鍵同樣可以實現。
在數據庫中使用多對多關係時,需要一箇中間表。
多對多關係中的數據庫結構如下:
表:Orders
       字段:orderid(主鍵)、。。。。
表:Users
       字段:usersid(主鍵),。。。。
中間表: cy_order_user
       字段:cy_order_user主鍵id
    外鍵:cy_orderid(引入Orders表)
    外鍵:cy_usersid(引入Users表)
注意:中間表的外鍵是需要在實體類對應的配置文件中應用的。所以爲了區分,在這裏給外鍵命名時沒有用orderid,而是使用cy_orderid。 

當使用Myeclipse反轉生成對應的實體類時,這時會生成中間的的實體類。而在Myeclipse中配置多對多關係時,並不需要中間表的信息。
所以,將中間表的實體類及配置文件刪除。還需要在hibernate.cfg.xml中刪除其對應的路徑。然後這時需要修改Orders類和Users類中的Set集合的變量名。
因爲反轉生成的實體類對應關係是針對中間表的,所以需要修改實體類中的Set集合變量。

例如在Orders類中將Set集合的變量名改爲user
那接下來還需要在Orders類對應的配置文件中設置其相關屬性如下:
 <set name="user" inverse="true" table="cy_order_user">
            <key>
                <column name="ordersid" />
            </key>
            <many-to-many class="com.jzlg.po.Users" column="cy_usersid" />
 </set>
針對如上屬性需要修改的如下:
 <set name="Set變量名" inverse="true" table="中間表表名">
            <key>
                <column name="ordersid" />
            </key>
            <many-to-many class="與之多對多關係的類(包名.類名)" column="中間表引入對應的外鍵名" />
 </set>

需要注意的是:每個對應的實體po類的映射文件中配置的屬性並不是必須的。例如:數據庫中可能一張表中有50個字段,但是
其反向生成實體類的映射文件中並不一定需要配置50個屬性。可以根據自身的需要進行配置。也就是說一張表50個字段,在其
對應的映射文件也可能就只有5個屬性。可以根據自身的需要手動添加或者刪除,但是如果不存在這個屬性。在進行添加時,數據庫這時
則爲null。如果查詢則也爲null。所以在配置時需要根據自身的需要手動添加或者刪除。

當我們在數據庫中定義了一個默認字段時,這時我們需要在相應的配置文件中配置dynamic-insert="true"如下:
 <class name="com.jzlg.po.Users" table="Users" schema="dbo" catalog="shopdbone"  dynamic-insert="true">
 
 createSQLQuery與createQuery的區別 :
 hibernate 中createQuery與createSQLQuery兩者區別是:
 前者用的hql語句進行查詢,後者可以用sql語句查詢
 前者以hibernate生成的Bean爲對象裝入list返回
 後者則是以對象數組進行存儲
 所以使用createSQLQuery有時候也想以hibernate生成的Bean爲對象裝入list返回,就不是很方便
 突然發現createSQLQuery有這樣一個方法可以直接轉換對象
Query query = session.createSQLQuery(sql).addEntity(XXXXXXX.class);
 XXXXXXX 代表以hibernate生成的Bean的對象,也就是數據表映射出的Bean。
 
 

 Hibernate中的分頁語句可以這麼寫

     session = HibernateUtils.getSession();
      session.beginTransaction();
      Query query = session.createQuery("from User");
      query.setFirstResult(0);//從第一條記錄開始
     query.setMaxResults(4);//取出四條記錄
     List userList = query.list();


 
 
 
 
 
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章