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

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

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

    zhyiwww
    用平實的筆,記錄編程路上的點點滴滴………
    posts - 536,comments - 394,trackbacks - 0

    這幾天,在多隊多的中間表的操作上遇到了點麻煩,總是不能刪除和更新中間表,因為,我使用的是一隊多的關(guān)聯(lián),
    映射的是中間表,所以,我雖然操作了set,但是總是不能反映到中間表上去。

    后來使用如下的方法來解決,看如下的例子:

    (1)三個表

    CREATE TABLE `poi` (
    ? `poi_id` INTEGER(10) UNSIGNED NOT NULL AUTO_INCREMENT,
    ? `poi_name` VARCHAR(45) COLLATE latin1_swedish_ci NOT NULL DEFAULT '',
    ? PRIMARY KEY (`poi_id`),
    ? UNIQUE KEY `poi_name` (`poi_name`)

    )ENGINE=InnoDB
    AUTO_INCREMENT=15 CHARACTER SET 'latin1' COLLATE 'latin1_swedish_ci'
    COMMENT='InnoDB free: 3072 kB';


    CREATE TABLE `user` (
    ? `user_id` INTEGER(10) UNSIGNED NOT NULL AUTO_INCREMENT,
    ? `username` VARCHAR(45) COLLATE latin1_swedish_ci NOT NULL DEFAULT '',
    ? `password` VARCHAR(45) COLLATE latin1_swedish_ci NOT NULL DEFAULT '',
    ? PRIMARY KEY (`user_id`),
    ? UNIQUE KEY `username` (`username`)

    )ENGINE=InnoDB
    AUTO_INCREMENT=16 CHARACTER SET 'latin1' COLLATE 'latin1_swedish_ci'
    COMMENT='InnoDB free: 3072 kB';


    關(guān)聯(lián)表

    CREATE TABLE `user_poi` (
    ? `user_id` INTEGER(10) UNSIGNED NOT NULL AUTO_INCREMENT,
    ? `poi_id` INTEGER(10) UNSIGNED NOT NULL,
    ? KEY `FK_user_pois_poiid` (`poi_id`),
    ? KEY `FK_user_pois_userid` (`user_id`),
    ? CONSTRAINT `FK_user_pois_poiid` FOREIGN KEY (`poi_id`) REFERENCES `poi` (`poi_id`) ON DELETE CASCADE ON UPDATE CASCADE,
    ? CONSTRAINT `FK_user_pois_userid` FOREIGN KEY (`user_id`) REFERENCES `user` (`user_id`) ON DELETE CASCADE ON UPDATE CASCADE

    )ENGINE=InnoDB
    AUTO_INCREMENT=3 CHARACTER SET 'latin1' COLLATE 'latin1_swedish_ci'
    COMMENT='InnoDB free: 3072 kB; (`poi_id`) REFER `demo/poi`(`poi_id`) ON UPDATE CASCADE; (';


    (2)POJO


    /**
    ?* @hibernate.class table="user"
    ?*/
    public class User implements java.io.Serializable {

    ??? // Fields

    ??? private Integer userid;
    ??? private String username;
    ??? private String password;

    ??? /**
    ??? ?* Poi set
    ??? ?*/
    ??? private Set<Poi> pois = new HashSet();
    ???
    ???
    ???
    ??? // Constructors

    ??? /**
    ??? ?* @hibernate.set table="user_poi" cascade="all"
    ??? ?* @hibernate.collection-key column="user_id"
    ??? ?* @hibernate.collection-many-to-many column="poi_id" class="org.zy.pro.pd.dao.Poi"
    ??? ?*/
    ??? public Set getPois() {
    ??? ??? return pois;
    ??? }

    ??? public void setPois(Set pois) {
    ??? ??? this.pois = pois;
    ??? }

    ??? public User() {
    ??? }

    ??? /** full constructor */
    ??? public User(String username, String password) {
    ??? ??? this.username = username;
    ??? ??? this.password = password;
    ??? }

    ??? // Property accessors


    ??? /**
    ??? ?* @hibernate.id column="user_id" generator-class="increment"
    ??? ?*/
    ??? public Integer getUserid() {
    ??? ??? return this.userid;
    ??? }

    ??? public void setUserid(Integer userid) {
    ??? ??? this.userid = userid;
    ??? }

    ??? /**
    ??? ?* @hibernate.property column="username"
    ??? ?* @return
    ??? ?*/
    ??? public String getUsername() {
    ??? ??? return this.username;
    ??? }

    ??? public void setUsername(String username) {
    ??? ??? this.username = username;
    ??? }

    ??? /**
    ??? ?* @hibernate.property column="password"
    ??? ?* @return
    ??? ?*/
    ??? public String getPassword() {
    ??? ??? return this.password;
    ??? }

    ??? public void setPassword(String password) {
    ??? ??? this.password = password;
    ??? }

    }


    /**
    ?* @hibernate.class table="poi"
    ?*/
    public class Poi? implements java.io.Serializable {


    ??? // Fields???

    ???? private Integer poiId;
    ???? private String poiName;


    ??? // Constructors

    ??? /** default constructor */
    ??? public Poi() {
    ??? }

    ??? /** minimal constructor */
    ??? public Poi(String poiName) {
    ??????? this.poiName = poiName;
    ??? }


    ??? /**
    ???? * @hibernate.id column="poi_id" generator-class="increment"
    ???? */
    ??? public Integer getPoiId() {
    ??????? return this.poiId;
    ??? }
    ???
    ??? public void setPoiId(Integer poiId) {
    ??????? this.poiId = poiId;
    ??? }

    ??? /**
    ???? * @hibernate.property column="poi_name"
    ???? * @return
    ???? */
    ??? public String getPoiName() {
    ??????? return this.poiName;
    ??? }
    ???
    ??? public void setPoiName(String poiName) {
    ??????? this.poiName = poiName;
    ??? }
    }



    (3)hibernate mapping

    利用xDolect根據(jù)bean生成映射

    Poi.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">

    <hibernate-mapping
    >
    ??? <class
    ??????? name="org.zy.pro.pd.dao.Poi"
    ??????? table="poi"
    ??? >

    ??????? <id
    ??????????? name="poiId"
    ??????????? column="poi_id"
    ??????????? type="java.lang.Integer"
    ??????? >
    ??????????? <generator class="increment">
    ????
    ??????????? </generator>
    ??????? </id>

    ??????? <property
    ??????????? name="poiName"
    ??????????? type="java.lang.String"
    ??????????? update="true"
    ??????????? insert="true"
    ??????????? column="poi_name"
    ??????? />

    ??? </class>

    </hibernate-mapping>


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

    <hibernate-mapping
    >
    ??? <class
    ??????? name="org.zy.pro.pd.dao.User"
    ??????? table="user"
    ??? >

    ??????? <id
    ??????????? name="userid"
    ??????????? column="user_id"
    ??????????? type="java.lang.Integer"
    ??????? >
    ??????????? <generator class="increment">

    ??????????? </generator>
    ??????? </id>

    ??????? <set
    ??????????? name="pois"
    ??????????? table="user_poi"
    ??????????? lazy="false"
    ??????????? cascade="all"
    ??????????? sort="unsorted"
    ??????? >

    ??????????? <key
    ??????????????? column="user_id"
    ??????????? >
    ??????????? </key>

    ??????????? <many-to-many
    ??????????????? class="org.zy.pro.pd.dao.Poi"
    ??????????????? column="poi_id"
    ??????????????? outer-join="auto"
    ???????????? />

    ??????? </set>

    ??????? <property
    ??????????? name="username"
    ??????????? type="java.lang.String"
    ??????????? update="true"
    ??????????? insert="true"
    ??????????? column="username"
    ??????? />

    ??????? <property
    ??????????? name="password"
    ??????????? type="java.lang.String"
    ??????????? update="true"
    ??????????? insert="true"
    ??????????? column="password"
    ??????? />



    ??? </class>

    </hibernate-mapping>


    (4)關(guān)聯(lián)添加
    ??????? UserDAO ud = new UserDAO();
    ??? ??? List l = ud.findAll();
    ??? ??? assertNotNull(l);
    ??? ???
    ??? ??? User u = ud.findById(2);
    ??? ??? assertNotNull(u);
    ??? ???
    ??? ??? Set pois = u.getPois();
    ??? ???
    ??? ??? Poi p = new Poi("Moc"+new java.util.Random().nextInt(1000000));
    ??? ??? System.out.print(p.getPoiId());
    ??? ???
    ??? ???
    ??? ??? pois.add(p);

    //關(guān)聯(lián)刪除
    //??? ??? u.setPois(null);
    ??? ???
    ??? ??? Poi pp = pd.findById(12);
    ??? ??? pois.remove(pp);
    ??? ???
    ??? ???
    ??? ??? ud.begin();
    ??? ??? ud.merge(u);
    ??? ??? ud.commit();


    // 關(guān)聯(lián)更新也可以,只要改變set就可以了。



    使用總結(jié)
    [1]使用多對多關(guān)系
    ??? 在映射的是時候要使用many-to-many
    ??? 所以,在user的set集合里面直接存放的是Poi的對象,而不是user_poi表的對象
    [2]reverse : false
    ??? 允許反轉(zhuǎn)操作
    [3]casecade : all
    ??? 只要允許級聯(lián)操作才可以實現(xiàn)級聯(lián)的刪除和更新

    如果使用一對多,就只能更新中間表的普通字段,不能更新主鍵字段,也不能刪除中間表記錄
    所以只能維護中間表的關(guān)聯(lián),但是不能更新中間表的信息。





    |----------------------------------------------------------------------------------------|
                               版權(quán)聲明  版權(quán)所有 @zhyiwww
                引用請注明來源 http://www.tkk7.com/zhyiwww   
    |----------------------------------------------------------------------------------------|
    posted on 2009-02-16 13:14 zhyiwww 閱讀(11009) 評論(7)  編輯  收藏 所屬分類: java basicj2ee

    FeedBack:
    # re: hibernate多對多刪除和更新中間表
    2009-02-27 13:04 | 張梁
    根本沒什么東西  回復(fù)  更多評論
      
    # re: hibernate多對多刪除和更新中間表
    2009-03-22 01:15 | 多幅
    還寫得亂七八招。  回復(fù)  更多評論
      
    # re: hibernate多對多刪除和更新中間表[未登錄]
    2009-03-25 06:35 | aaaa
    關(guān)鍵的代碼沒有  回復(fù)  更多評論
      
    # re: hibernate多對多刪除和更新中間表
    2009-04-23 15:23 | LD
    沒實質(zhì)內(nèi)容!  回復(fù)  更多評論
      
    # re: hibernate多對多刪除和更新中間表
    2009-05-22 15:15 | 其二千萬
    寫了些什么玩意啊,亂七八糟的!~  回復(fù)  更多評論
      
    # re: hibernate多對多刪除和更新中間表
    2009-09-24 13:51 | --
    [3]casecade : all
    這樣設(shè)置的話,如果刪除一方,也會刪除另一方的吧,你不會這么狠吧?
    刪除一方時,只要關(guān)聯(lián)的刪除關(guān)系就行了!
    所以設(shè)置為save-update  回復(fù)  更多評論
      
    # re: hibernate多對多刪除和更新中間表
    主站蜘蛛池模板: 麻豆高清免费国产一区| 国产综合免费精品久久久| 在线观看特色大片免费视频| 久久精品7亚洲午夜a| 三根一起会坏掉的好痛免费三级全黄的视频在线观看 | 成人毛片免费播放| 2020天堂在线亚洲精品专区| 91在线视频免费播放| 一本色道久久88亚洲精品综合| 国产无人区码卡二卡三卡免费| 亚洲一区二区影视| 思思99re66在线精品免费观看| 久久夜色精品国产噜噜亚洲a| 最新中文字幕电影免费观看| 日本亚洲欧美色视频在线播放 | 美女网站在线观看视频免费的| 国产亚洲日韩在线三区| 毛片在线全部免费观看| 亚洲美女aⅴ久久久91| 一个人看www在线高清免费看| 亚洲熟妇无码八V在线播放| 四虎免费永久在线播放| 中文字幕手机在线免费看电影 | 中文字幕久精品免费视频| 亚洲午夜未满十八勿入| 国产福利在线观看免费第一福利| 亚洲日本VA午夜在线影院| 亚洲国产成人久久笫一页| 热99RE久久精品这里都是精品免费| 精品亚洲成AV人在线观看| 色窝窝免费一区二区三区| 色偷偷亚洲男人天堂| 国产AV无码专区亚洲A∨毛片| 免费观看无遮挡www的小视频| 色偷偷亚洲第一综合网| 国产∨亚洲V天堂无码久久久| 免费成人激情视频| 一级毛片a免费播放王色电影| 亚洲一区二区在线视频| 国产精品深夜福利免费观看| 中文字幕一区二区免费|