<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)

    搜索

    •  

    積分與排名

    • 積分 - 155667
    • 排名 - 391

    最新評論

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

    [正文]:
        Hibernate一對多雙向關聯,例如一個用戶有多張銀行卡。雙向一對多關聯在單向一對多(參見"Hibernate一對多(單向)":http://m.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://m.tkk7.com/wintys

    posted on 2009-06-17 22:04 天堂露珠 閱讀(489) 評論(0)  編輯  收藏 所屬分類: Hibernate
    主站蜘蛛池模板: 国产午夜亚洲精品理论片不卡 | 亚洲AV无码久久精品狠狠爱浪潮| 亚洲人成网站18禁止| 波多野结衣免费在线观看| 99久久亚洲综合精品成人网| 四虎影视成人永久免费观看视频| 亚洲人成人77777网站| 国产免费无码AV片在线观看不卡| 亚洲日韩aⅴ在线视频| a级毛片在线免费观看| 亚洲欧洲日韩不卡| 久久午夜夜伦鲁鲁片免费无码影视| 亚洲色图古典武侠| 成人免费无码视频在线网站| 亚洲偷自拍另类图片二区| 又黄又大又爽免费视频| 久香草视频在线观看免费| 亚洲精品高清国产一线久久| 三年片在线观看免费大全电影 | 久久精品国产亚洲AV大全| 国产成人免费在线| 亚洲欧美熟妇综合久久久久| 国产jizzjizz免费看jizz| 一个人看的免费观看日本视频www| 伊人久久精品亚洲午夜| 日韩午夜理论免费TV影院 | 亚洲av日韩aⅴ无码色老头| 四虎永久成人免费| 国产免费区在线观看十分钟| 亚洲尹人九九大色香蕉网站| 一个人免费观看www视频在线| 老司机午夜在线视频免费观| 亚洲国产AV无码专区亚洲AV| www.999精品视频观看免费| 国产成人亚洲午夜电影| 亚洲人JIZZ日本人| 最近2019中文字幕mv免费看| 一级毛片免费在线| 亚洲一线产区二线产区精华| 亚洲av再在线观看| 日本片免费观看一区二区|