架構(gòu)師之路

            BlogJava :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
            4 Posts :: 0 Stories :: 1 Comments :: 0 Trackbacks

          所有配置文件都要放在classes下面

          一:創(chuàng)建hibernate.cfg.xml文件,內(nèi)容如下:
          <?xml version='1.0' encoding='utf-8'?>
          <!DOCTYPE hibernate-configuration
              PUBLIC "-//Hibernate/Hibernate Configuration DTD//EN"
              "
          http://hibernate.sourceforge.net/hibernate-configuration-2.0.dtd">

          <hibernate-configuration>
              <session-factory>
                  <property name="connection.datasource">java:comp/env/note</property> 連接池用,如在TOMCAT里配置連接池。
                  <property name="show_sql">true</property>
                  <property name="dialect">net.sf.hibernate.dialect.MySQLDialect</property> 如果使用mysql就這樣,如果是其他就根據(jù)hi..property文件配置

                  <!-- Mapping files -->
                  <mapping resource="User.hbm.xml"/>
            <mapping resource="Passwd.hbm.xml"/>  這里是需要映射的hbm文件
              </session-factory>
          </hibernate-configuration>

          二: One-To-One關(guān)系
          1):主表的hbm.xml文件應(yīng)該加:
            <one-to-one name="passwd" class="web.model.vo.passwdBean"  cascade="save-update"/> #class是子表的類
          2):子表的hbm.xml文件如下:
            <one-to-one name="user" class="web.model.vo.userBean" constrained="true" /> #class是主表的
          3):每個bean都要有g(shù)et,set各自的子類和主類.
          4):在調(diào)用的時候執(zhí)行:
               user.setPasswd(passwd);
               passwd.setUser(user);
               session.save(user); //只需要保存主類
              
           三:many-to-one關(guān)系(單向關(guān)聯(lián))
           1):多數(shù)據(jù)這邊一定要多一個字段好關(guān)聯(lián)主表ID,比如一個房間對多個學生:
           room表:id,address
           student表:id,name,pid(這個字段關(guān)聯(lián)room表的id),pid必須為可以為空
           2):在student.hbm.xml的關(guān)系為:
           <many-to-one name="room"  column="pid"  class="web.model.vo.RoomBean" cascade="save-update/>
              如果設(shè)置了cascade(聯(lián)級持久)那么只需要save(student) 而不用save(room)了,這表示當我們插入或更新Student時,自動對其所關(guān)聯(lián)到的Room進行持久化
              在student.hbm.xml里不能寫進pid的描述
             
           4):在room.hbm.xml里只需要設(shè)置字段對應(yīng)的屬性而已,如果用了cascade,必須在:
            <id name="id" column="id" unsaved-value="0"> 這里加個unsaved-value="0",不然會出如下錯誤:
             javax.servlet.ServletException: a different object with the same identifier value was already associated with the session: 0,
             of class: web.model.vo.RoomBean
           3):在測試里,先保存主類(room,也就是one這方),在保存many這方。
           4):在studentBean中不需要pid的set,get方法,而需要一個對主類的set,get,如:setRoom(RoomBean xx),getRoom()


           四:many-to-one關(guān)系(雙向關(guān)聯(lián))
           1):在one(student)這方加入set,比如setStudents(Set x),getStudents();
           2):在many(room)的room.hbm.xml為:
             <set name="user" table="user" inverse="true" cascade="all"> 這里inverse一定要為true,意思是關(guān)聯(lián)由對方(student)維護;
                      <key column="pid"/>
                      <one-to-many class="web.model.vo.UserBean"/>
             </set>
             注意這兩個hbm.xml的ID處都必須加上unsaved-value="0"
           3)客戶端程序改為:
                          RoomBean room1 = new RoomBean();
            room1.setAddress("chengdu");  
            
            UserBean user = new UserBean();
            user.setName("raoqn");
            
            UserBean user2 = new UserBean();
            user2.setName("liping");
            
            UserBean user3 = new UserBean();
            user3.setName("yrq");

            user.setRoom(room1);  //這里由于關(guān)系由user類維護,所以必須setRoom
            user2.setRoom(room1);
            user3.setRoom(room1);
            
            room1.getUser().add(user);
            room1.getUser().add(user2);
            room1.getUser().add(user3);
            
            session.save(room1); //只需要保存room1就搞定一切,不用每個對象都save了

           

          posted on 2005-12-20 16:20 月-風 閱讀(859) 評論(1)  編輯  收藏 所屬分類: hibernate

          Feedback

          # re: Hibernate學習筆記 2006-10-02 11:57 都市雛鷹
          我遇見一種many -to-one雙向關(guān)聯(lián):
          報出這樣錯誤:a different object with the same identifier value was already associated with the session
          ,后來發(fā)現(xiàn)沒有建立雙指向:
          就是
          one.setMany(many)沒有建立many.getXXX().add(one).
          但是并沒有設(shè)置:unsaved-value="0"

            回復  更多評論
            


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


          網(wǎng)站導航:
           
          主站蜘蛛池模板: 聊城市| 剑川县| 湖州市| 荃湾区| 股票| 宁都县| 雅江县| 阿合奇县| 汾阳市| 乐清市| 福建省| 宁海县| 浠水县| 武城县| 鹤壁市| 淮北市| 九江市| 滦平县| 乌拉特中旗| 茂名市| 澄迈县| 珲春市| 南通市| 湟源县| 万安县| 泗阳县| 峨眉山市| 金湖县| 开阳县| 邳州市| 信宜市| 神木县| 霍邱县| 渝中区| 合水县| 枣强县| 保定市| 长汀县| 光山县| 海阳市| 鄂州市|