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

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

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

    隨筆 - 117  文章 - 72  trackbacks - 0

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

    常用鏈接

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

    訂閱

    訂閱

    留言簿(7)

    隨筆分類(130)

    隨筆檔案(123)

    搜索

    •  

    積分與排名

    • 積分 - 156615
    • 排名 - 390

    最新評論

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

    [正文]:
        Hibernate一對多雙向關聯,例如一個用戶有多張銀行卡。雙向一對多關聯在單向一對多(參見"Hibernate一對多(單向)":http://www.tkk7.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.數據庫:
    數據庫表與單向一對多時并沒有區別,還是在"多方"加一個外鍵"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框架技術》 : 清華大學出版社
    原創作品,轉載請注明出處。
    作者:Winty (wintys@gmail.com)
    博客:http://www.tkk7.com/wintys

    posted on 2009-06-17 22:04 天堂露珠 閱讀(494) 評論(0)  編輯  收藏 所屬分類: Hibernate
    主站蜘蛛池模板: 亚洲av无码片vr一区二区三区| 亚洲色婷婷六月亚洲婷婷6月 | 69视频在线是免费观看| 亚洲乳大丰满中文字幕| 国产成人无码免费网站| 亚洲精品无码专区久久久 | 亚洲av无码专区青青草原| 国产成人无码a区在线观看视频免费| 中文字幕在线日亚洲9| 韩国18福利视频免费观看| 亚洲AV永久无码精品一福利 | 精品久久亚洲一级α| 免费一级做a爰片性色毛片| 日韩精品免费一线在线观看| ass亚洲**毛茸茸pics| 无限动漫网在线观看免费| 亚洲私人无码综合久久网| 免费99热在线观看| 国产免费伦精品一区二区三区| 亚洲成在人线av| 最近最新MV在线观看免费高清| 亚洲国产精品成人AV在线| 久久影院亚洲一区| 中文字幕免费高清视频| 亚洲欧美日韩综合久久久| 亚洲七七久久精品中文国产| 日本高清不卡aⅴ免费网站| 亚洲人成电影网站| 亚洲人成网站在线观看青青| 久久精品成人免费网站| 亚洲精品亚洲人成在线播放| 亚洲&#228;v永久无码精品天堂久久 | 午夜性色一区二区三区免费不卡视频| 国产精品亚洲w码日韩中文| 美女视频黄的免费视频网页| 亚洲六月丁香婷婷综合| 亚洲免费在线观看| 久久午夜免费视频| AAAAA级少妇高潮大片免费看| 亚洲美女精品视频| 精品国产亚洲男女在线线电影 |