zhyiwww
          用平實(shí)的筆,記錄編程路上的點(diǎn)點(diǎn)滴滴………
          posts - 536,comments - 394,trackbacks - 0

          這幾天,在多隊(duì)多的中間表的操作上遇到了點(diǎn)麻煩,總是不能刪除和更新中間表,因?yàn)椋沂褂玫氖且魂?duì)多的關(guān)聯(lián),
          映射的是中間表,所以,我雖然操作了set,但是總是不能反映到中間表上去。

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

          (1)三個(gè)表

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

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





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

          FeedBack:
          # re: hibernate多對(duì)多刪除和更新中間表
          2009-02-27 13:04 | 張梁
          根本沒什么東西  回復(fù)  更多評(píng)論
            
          # re: hibernate多對(duì)多刪除和更新中間表
          2009-03-22 01:15 | 多幅
          還寫得亂七八招。  回復(fù)  更多評(píng)論
            
          # re: hibernate多對(duì)多刪除和更新中間表[未登錄]
          2009-03-25 06:35 | aaaa
          關(guān)鍵的代碼沒有  回復(fù)  更多評(píng)論
            
          # re: hibernate多對(duì)多刪除和更新中間表
          2009-04-23 15:23 | LD
          沒實(shí)質(zhì)內(nèi)容!  回復(fù)  更多評(píng)論
            
          # re: hibernate多對(duì)多刪除和更新中間表
          2009-05-22 15:15 | 其二千萬
          寫了些什么玩意啊,亂七八糟的!~  回復(fù)  更多評(píng)論
            
          # re: hibernate多對(duì)多刪除和更新中間表
          2009-09-24 13:51 | --
          [3]casecade : all
          這樣設(shè)置的話,如果刪除一方,也會(huì)刪除另一方的吧,你不會(huì)這么狠吧?
          刪除一方時(shí),只要關(guān)聯(lián)的刪除關(guān)系就行了!
          所以設(shè)置為save-update  回復(fù)  更多評(píng)論
            
          # re: hibernate多對(duì)多刪除和更新中間表
          2009-10-13 15:49 | zhyiwww
          關(guān)于casecade設(shè)置為all,是測試使用,如果是開發(fā),可以根據(jù)需要來自己設(shè)定。
            回復(fù)  更多評(píng)論
            
          主站蜘蛛池模板: 黔江区| 南皮县| 武城县| 齐齐哈尔市| 桂平市| 兴海县| 永和县| 卢湾区| 滨州市| 惠安县| 许昌市| 凤冈县| 报价| 雅江县| 永州市| 通山县| 鄂州市| 凤台县| 平谷区| 贺州市| 林甸县| 布尔津县| 凯里市| 肥东县| 长宁县| 肇东市| 大英县| 海兴县| 明溪县| 荣昌县| 绿春县| 涞源县| 锡林郭勒盟| 澄江县| 古浪县| 隆子县| 鸡泽县| 灌南县| 阳高县| 阿克陶县| 油尖旺区|