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

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

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

    西沙璞玉
    愛不容易
    posts - 0,comments - 4,trackbacks - 0

    在關聯關系的映射中使用得最多的就是一對多的關聯,一對多的關聯關系分為兩種:單向一對多,雙向一對多。下面分別對這兩種情況進行總結:


    首先準備兩張表:用戶表user和用戶組表group


     




    Sql代碼


    1. CREATE TABLE  
      `test`.`
      group` (  
    2.    `id` int(10) unsigned NOT NULL auto_increment,  
    3.    `name` varchar(45) NOT NULL,  
    4.   PRIMARY KEY  
      (`id`)  

    5. )  
    6.  
    7.  
    8. CREATE TABLE  
      `test`.`
      user` (
       

    9.    `id` int(10) unsigned NOT NULL auto_increment,  
    10.    `name` varchar(45) NOT NULL,  
    11.    `group_id` int(10) unsigned default
      NULL,  
    12.   PRIMARY KEY  
      (`id`),  

    13.   KEY `FK_users_1` (`group_id`),
       

    14.   CONSTRAINT `FK_users_1` FOREIGN
      KEY (`group_id`) REFERENCES `group`
      (`id`)  

    15. )  

    首先,來看看單向一對多的情況:


    Group類中有如下屬性:


     




    Java代碼


    1. private Integer id;  
    2. private String name;  
    3. private Set users = new
      HashSet(
      0);//用戶的set集合,用于存一對多中的“多”的一方 

    User類只需要有本身的屬性即可:


     




    Java代碼


    1. private Integer id;  
    2. private String name; 

    接下來才是重點,配置單向一對多之間的關聯


    Group.hbm.xml文件的配置如下:


     




    Xml代碼


    1. <hibernate-mapping> 
    2.     <class
      name="com.stream.model.Group" table="group"
      catalog="test"> 

    3.         <id
      name="id" type="java.lang.Integer"> 
    4.             <column
      name="id" /> 
    5.             <generator
      class="identity" /> 
    6.         </id> 
    7.         <property
      name="name" type="java.lang.String"> 
    8.             <column
      name="name" length="45" not-null="true"
      /> 
    9.         </property> 
    10.                 <!-- 以下是單向一對多的配置信息--> 
    11.         <set
      name="users" inverse="false"
      cascade="all"> 

    12.             <key> 
    13.                 <!-- 指定user表中引用外鍵的是哪一列--> 
    14.                 <column
      name="group_id"/> 
    15.             </key> 
    16.             <!--配置是與哪一個類之間的一對多 --> 
    17.             <one-to-many class="com.stream.model.User" /> 
    18.         </set> 
    19.     </class> 
    20. </hibernate-mapping> 

    在該配置文件中,inverse可以使用默認false,或者顯示指定false,如以上代碼。這樣就指定一對多之間的關系由group這個POJO來維護。在單項一對多關聯中,這一點很重要,下面我們通過測試來說明。cascade="all"指定級聯的之間的等級,它具有如下幾種值:


    all : 所有情況下均進行關聯操作。

    none:所有情況下均不進行關聯操作。這是默認值。

    save-update:在執行save/update/saveOrUpdate時進行關聯操作。

    delete:在執行delete時進行關聯操作。


    user.hbm.xml文件的配置與User這個類一樣,不需要包含如何關于關聯關系的配置:


     




    Xml代碼


    1. <class name="com.stream.model.User" table="user"
      catalog="test"> 

    2.         <id
      name="id" type="java.lang.Integer"> 
    3.             <column
      name="id" /> 
    4.             <generator
      class="identity" /> 
    5.         </id> 
    6.         <property
      name="name" type="java.lang.String"> 
    7.             <column
      name="name" length="45" not-null="true"
      /> 
    8.         </property> 
    9. </class> 

    下面只舉單向一對多關聯保存一例來說明,其他操作類似:


     




    Java代碼


    1.                 
    2.                Group group = new Group();  
    3. group.setName("group1");  
    4. User user1   = new User();  
    5. user1.setName("stream");  
    6. User user2 = new User();  
    7. user2.setName("fangqi");  
    8.               //添加用戶
       
    9. group.getUsers().add(user1);  
    10. group.getUsers().add(user2);  
    11.               //開啟事務
       
    12. Transaction transaction =session.beginTransaction();  
    13. //保存用戶組
       
    14.                session.save(group);  
    15.               //將緩沖區中的sql送到數據庫中  
    16. session.flush();  
    17.               //提交事務
       
    18. transaction.commit(); 

    我們沒有顯示的插入user1和uesr2兩條記錄,但是由于我們設置了cascade=all,那么在group表進行任何操作時都會關聯到user表,即在保存group時,也會把user1和user2保存,這就是級聯為我們帶來的好處。


    但是,在這里有兩點需要說明的是:


    1、如果在Group.hbm.xml映射文件中設置了inverse=true,那么說明這個一對多的關聯關系由多的一方來維護。而在單向的一對多關聯中,“多”的一方完全不知情,所以在保存往user
    表中插入的兩條數據,其外鍵group_id這一字段都是為null值。如果user表中group_id是not null的話就會出現如下異常:


     


    org.hibernate.exception.GenericJDBCException: could not insert:
    [com.stream.model.User]


    ....


    Caused by: java.sql.SQLException: Field 'group_id' doesn't have a default
    value。


    異常信息室group_id這個字段沒有設置一個默認值,其實就是我們往group_id這個非空的字段插入了一個null值。


    2、如果再Group.hbm.xml映射文件中設置inverse=false,或者不設置該屬性,即表示由自身來維護這個關聯關系。但在保存group后,會先將user1和user2插入到數據庫,并且group_id的值都為null。然后再接著兩條update語句,將這兩天記錄的group_id字段值設置為前面插入的group的id。同樣的如果user
    表中group_id字段是非空的,仍然會出現上面的異常。


    ---------------------------------------------單向一對多的關聯完畢----------------------------------------------------------


    除了一對多雙向關聯關系的"many"方設為true、多對多雙向關聯關系的兩方設為true之外,其余應均為false


    posted on 2012-05-02 16:06 @趙 閱讀(304) 評論(0)  編輯  收藏

    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    哥哥最近不是很忙
    主站蜘蛛池模板: 在线视频观看免费视频18| 日韩精品内射视频免费观看| 成人免费无码大片a毛片软件 | 亚洲一级毛片免观看| 久久久久久曰本AV免费免费| 内射少妇36P亚洲区| 亚洲免费视频一区二区三区| 羞羞视频网站免费入口| 亚洲国产香蕉人人爽成AV片久久| 免费的黄网站男人的天堂| 18禁黄网站禁片免费观看不卡| 亚洲AV无码不卡在线播放| 8x8x华人永久免费视频| 免费一级大黄特色大片| 人禽伦免费交视频播放| 国产精品视频免费一区二区 | 色欲色欲天天天www亚洲伊| 全部免费毛片在线| 五月天婷婷免费视频| 国产亚洲一区二区在线观看 | 亚洲av无码成人精品国产| 国产午夜免费秋霞影院| 亚洲日本在线播放| 国产偷伦视频免费观看| 午夜网站免费版在线观看| 老司机福利在线免费观看| 亚洲精品国产成人片| 大地资源免费更新在线播放| 老司机午夜在线视频免费观| 亚洲成AV人片在线观看WWW| 中国毛片免费观看| 亚洲自偷精品视频自拍| 凹凸精品视频分类国产品免费| 三年片免费高清版| 亚洲日韩国产一区二区三区在线| 亚洲精品久久久www | 亚洲AV成人影视在线观看| 99re免费在线视频| 亚洲av日韩精品久久久久久a| 在线观看午夜亚洲一区| 国产精品高清免费网站|