隨筆 - 117  文章 - 72  trackbacks - 0

          聲明:原創(chuàng)作品(標有[原]字樣)轉載時請注明出處,謝謝。

          常用鏈接

          常用設置
          常用軟件
          常用命令
           

          訂閱

          訂閱

          留言簿(7)

          隨筆分類(130)

          隨筆檔案(123)

          搜索

          •  

          積分與排名

          • 積分 - 155531
          • 排名 - 390

          最新評論

          [標題]:Hibernate一對多(雙向)
          [時間]:2009-6-17
          [摘要]:Hibernate一對多雙向關聯,例如一個用戶有多張銀行卡。
          [關鍵字]:雙向關聯,Hibernate,ORM,關系數據庫,映射,一對多
          [環(huán)境]:MyEclipse7 ,Hibernate3.2
          [作者]:Winty (wintys@gmail.com) http://www.aygfsteel.com/wintys

          [正文]:
              Hibernate一對多雙向關聯,例如一個用戶有多張銀行卡。雙向一對多關聯在單向一對多(參見"Hibernate一對多(單向)":http://www.aygfsteel.com/wintys/archive/2009/06/13/hibernate_onetomany.html)的基礎上,再對"多"方進行配置。
          1、概述
          a.實體類:
          public class User{
              ...
              private Set<Card> cards;
              ...
          }

          public class Card{
              ...
              private User user;
              ...
          }

          b.Hibernate配置文件
          根據需要可以將User.hbm.xml中set的屬性inverse設置為true
          User.hbm.xml:
          <set name="cards" inverse="true" cascade="all">
              <key column="userId" />
              <one-to-many class="wintys.hibernate.onetomany.Card" />
          </set>

          Card.hbm.xml:
          <many-to-one   name="user"
                                  class="wintys.hibernate.onetomany.User"
                                  column="userId"
                                  cascade="all" />

          c.數據庫:
          數據庫表與單向一對多時并沒有區(qū)別,還是在"多方"加一個外鍵"userId"即可。

          2、實體類:
          User:
          package wintys.hibernate.onetomany;

          import java.util.Set;

          public class User {
              private String id;
              private String name;
              private Set<Card> cards;
              
              public String getId() {
                  return id;
              }
              public void setId(String id) {
                  this.id = id;
              }
              public String getName() {
                  return name;
              }
              public void setName(String name) {
                  this.name = name;
              }

              public void setCards(Set<Card> cards) {
                  this.cards = cards;
              }

              public Set<Card> getCards() {
                  return cards;
              }   
          }

          Card:
          package wintys.hibernate.onetomany;

          public class Card {
              private String id;
              private float balance;
              private User user;/*用于實現反向關聯:"多對一"*/
              
              public Card(){
              }
              
              public Card(float balance){
                  this.balance = balance;
              }
              public String getId() {
                  return id;
              }
              public void setId(String id) {
                  this.id = id;
              }
              public float getBalance() {
                  return balance;
              }
              public void setBalance(float balance) {
                  this.balance = balance;
              }

              public User getUser() {
                  return user;
              }

              public void setUser(User user) {
                  this.user = user;
              }   
          }


          3、映射文件:
          用戶類映射文件/src/wintys/hibernate/onetomany/User.hbm.xml:
          <?xml version="1.0" encoding="UTF-8"?>
          <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
          "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
          <!--
              Mapping file autogenerated by MyEclipse Persistence Tools
          -->

          <hibernate-mapping>
              <class name="wintys.hibernate.onetomany.User" table="myuser" catalog="db">
                  <id name="id" type="string">
                      <column name="id" not-null="true"/>
                      <generator class="uuid.hex" />
                  </id>
                  <property name="name" type="java.lang.String" column="name" />
                  
                  <!-- 當用于實現反向關聯:"多對一"-->
                  <set name="cards" inverse="true" cascade="all">
                      <key column="userId" />
                      <one-to-many class="wintys.hibernate.onetomany.Card" />
                  </set>
              </class>
          </hibernate-mapping>


          銀行卡映射文件/src/wintys/hibernate/onetomany/User.hbm.xml:
          <?xml version="1.0" encoding="UTF-8"?>
          <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
          "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
          <!--
              Mapping file autogenerated by MyEclipse Persistence Tools
          -->

          <hibernate-mapping>
              <class name="wintys.hibernate.onetomany.Card" table="mycard" catalog="db">
                  <id name="id" type="string">
                      <column name="id" not-null="true"/>
                      <generator class="uuid.hex" />
                  </id>
                  <property name="balance" />
                  
                  <!-- 用于實現反向關聯:"多對一" -->
                  <many-to-one name="user"
                               class="wintys.hibernate.onetomany.User"
                               column="userId"
                               cascade="all" />
              </class>
          </hibernate-mapping>


          4、數據庫表與"單向一對多"相同。

          5、Hibernate配置文件:/src/hibernate.cfg.xml也與"單向一對多"相同。

          6、使用測試:
          /src/wintys/hibernate/onetomany/HibernateUtil.java與"單向一對多"相同。
          /src/wintys/hibernate/onetomany/CardDAO.java:

          package wintys.hibernate.onetomany;
          import java.util.List;

          public interface CardDAO {
              public void insert();
              public List<Card> selectAll();
          }


          /src/wintys/hibernate/onetomany/CardDAOBean.java:
          package wintys.hibernate.onetomany;
          import java.util.HashSet;
          import java.util.List;
          import java.util.Set;
          import org.hibernate.HibernateException;
          import org.hibernate.Query;
          import org.hibernate.Session;
          import org.hibernate.Transaction;

          public class CardDAOBean implements CardDAO {

              public void insert() throws HibernateException {
                  Transaction tc = null;
                  try{
                      Card c1,c2,c3;
                      User user;
                      Set<Card> cards;
                      
                      c1 = new Card(7641.96f);
                      c2 = new Card(654.8f);
                      c3 = new Card(3650f);
                      
                      user = new User();
                      user.setName("Tom");
                      
                      /*一對多映射*/
                      cards = new HashSet<Card>();
                      cards.add(c1);
                      cards.add(c2);
                      cards.add(c3);
                      user.setCards(cards);
                      
                      /*多對一映射*/
                      c1.setUser(user);
                      c2.setUser(user);
                      c3.setUser(user);
                      
                      Session session = HibernateUtil.getSession();
                      tc = session.beginTransaction();
                                  
                      session.save(c1);
                      session.save(c2);
                      session.save(c3);
                      
                      tc.commit();
                  }catch(HibernateException e){
                      try{
                          if(tc != null)
                              tc.rollback();
                      }catch(Exception ex){
                          System.err.println(ex.getMessage());
                      }
                      System.err.println(e.getMessage());
                  }finally{
                      HibernateUtil.closeSession();           
                  }
              }

              @SuppressWarnings("unchecked")
              public List<Card> selectAll() throws HibernateException {
                  List<Card> cards = null;
                  Transaction tc = null;
                  try{
                      Session session = HibernateUtil.getSession();
                      tc = session.beginTransaction();
                                  
                      Query query = session.createQuery("from Card");
                      cards = query.list();
                      
                      tc.commit();
                  }catch(HibernateException e){
                      try{
                          if(tc != null){
                              tc.rollback();
                              cards = null;
                          }
                      }catch(Exception ex){
                          System.err.println(ex.getMessage());
                      }
                      System.err.println(e.getMessage());
                  }finally{
                      //HibernateUtil.closeSession();         
                  }
                  
                  return cards;
              }
          }


          7、運行結果:

          控制臺顯示:
          ......
          Hibernate: insert into db.myuser (name, id) values (?, ?)
          Hibernate: insert into db.mycard (balance, userId, id) values (?, ?, ?)
          Hibernate: insert into db.mycard (balance, userId, id) values (?, ?, ?)
          Hibernate: insert into db.mycard (balance, userId, id) values (?, ?, ?)
          Hibernate: update db.mycard set balance=?, userId=? where id=?
          Hibernate: update db.mycard set balance=?, userId=? where id=?
          Hibernate: update db.mycard set balance=?, userId=? where id=?
          ......

          id:402881e421eddc240121ede9c5d10009
          name:Tom
          cards:
              cardId:402881e421eddc240121ede9c5d1000a
              balance:7641.96
              cardId:402881e421eddc240121ede9c5d1000c
              balance:3650.0
              cardId:402881e421eddc240121ede9c5d1000b
              balance:654.8

          [參考資料]:
          《J2EE項目實訓-Hibernate框架技術》 : 清華大學出版社
          原創(chuàng)作品,轉載請注明出處。
          作者:Winty (wintys@gmail.com)
          博客:http://www.aygfsteel.com/wintys

          posted on 2009-06-17 22:04 天堂露珠 閱讀(488) 評論(0)  編輯  收藏 所屬分類: Hibernate
          主站蜘蛛池模板: 苏尼特左旗| 池州市| 册亨县| 陕西省| 大庆市| 南京市| 壤塘县| 揭西县| 泌阳县| 同江市| 观塘区| 临沂市| 勃利县| 揭西县| 九台市| 武胜县| 广昌县| 富顺县| 故城县| 柘城县| 盐津县| 衡水市| 闽清县| 洛宁县| 澎湖县| 交城县| 玉环县| 五家渠市| 永春县| 焦作市| 江永县| 潜江市| 商水县| 孝感市| 沭阳县| 太仆寺旗| 光泽县| 新田县| 濮阳市| 林西县| 鄯善县|