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

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

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

    石頭JAVA擺地攤兒

    JAVA所有的討論-要一點一點的進步

      BlogJava :: 首頁 ::  :: 聯系 ::  :: 管理 ::
      30 隨筆 :: 0 文章 :: 11 評論 :: 0 Trackbacks

    來源:thinkGhoster的專欄 - CSDNBlog

      在測試Hibernate的一對多雙向關聯映射時,碰到很有趣的問題,跟inverse屬性直接相關。

    1、People.hbm.xml

    <hibernate-mapping default-lazy="false">
    <class name="com.persistent.People" table="people">
    <id name="id" column="peopleId" unsaved-value="0">
    <generator class="increment">
    </generator>
    </id>
    <property name="name" column="name"></property>
    <set name="addresses" cascade="save-update">
    <key column="peopleId" not-null="true" />
    <one-to-many class="com.persistent.Address"/>
    </set>
    </class>
    </hibernate-mapping>

    2、Address.hbm.xml

    <hibernate-mapping>
    <class name="com.persistent.Address" table="address">
    <id name="id" column="addressId" unsaved-value="0">
    <generator class="increment">
    </generator>
    </id>
    <many-to-one name="people" column="peopleId" insert="false" update="false"></many-to-one>
    <property name="addressName" column="addressName"></property>
    <property name="codeNumber" column="codeNumber"></property>
    </class>
    </hibernate-mapping>
    3、People.java和Address.java

    public class People ...{
    private long id;
    private String name;
    private Set addresses = new HashSet();
    ...
    }

    public class Address ...{
    private long id;
    private People people;
    private String addressName;
    private String codeNumber;
    ...
    }

    4、數據庫結構

    people表:{peopleId,name}

    address表:{addressId,peopleId,addressName,codeNumber}

    5、測試代碼

    People people = new People();
    people.setName("linda");
    Address address = new Address();
    address.setAddressName("yunnan");
    address.setCodeNumber("564123");
    address.setPeople(people);
    people.getAddresses().add(address);
    Session session = HibernateSessionFactory.getSession();
    session.beginTransaction();
    session.save(people);
    session.getTransaction().commit();

    6、運行結果

      上面測試代碼運行起來正確:

    Hibernate: select max(peopleId) from people
    Hibernate: select max(addressId) from address
    Hibernate: insert into people (name, peopleId) values (?, ?)
    Hibernate: insert into address (addressName, codeNumber, peopleId, addressId) values (?, ?, ?, ?)
    Hibernate: update address set peopleId=? where addressId=?

      如果將People.hbm.xml映射改寫一下:

    <set name="addresses" cascade="save-update" inverse="true">
    <key column="peopleId" not-null="true" />
    <one-to-many class="com.persistent.Address"/>
    </set>

      不同之處在于添加了inverse="true",結果:

    Hibernate: select max(peopleId) from people
    Hibernate: select max(addressId) from address
    Hibernate: insert into people (name, peopleId) values (?, ?)
    Hibernate: insert into address (addressName, codeNumber, addressId) values (?, ?, ?)

      可以看到,peopleId并沒有寫入到關聯的address當中,數據庫address表中相應記錄的peopleId字段為空。

    7、分析

      在Hibernate中,術語inverse是反轉的意思,在關聯關系中,inverse="false"為主控方,由主控方負責維護對象的關聯關系。所以上面的映射文件改動之后,address為主控方,people為被控方,但是測試代碼只進行了一個保存操作session.save(people),這是針對people的,因此無法正確級聯保存address。而原來的映射文件中(雖然沒有明確指明,Hibernate默認inverse="false"),people為主控方,因此保存people時它會保證關聯的address的正確保存。

      也就是說,Hibernate僅僅按照主控方對象的狀態的變化來同步更新數據庫。按照原來的映射文件,people.getAddresses().add(address),即主控方對象的狀態發生了改變,因此數據庫會跟著對象狀態的變化來同步更新數據庫;而address.setPeople(people),即被控方對象的狀態發生了改變,它是不能觸發對象和數據庫的同步更新的。

    posted on 2007-10-24 19:31 石頭JAVA擺地攤兒 閱讀(357) 評論(0)  編輯  收藏

    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 99在线免费视频| 亚洲情A成黄在线观看动漫软件 | 亚洲午夜成人精品电影在线观看| 亚洲国产欧美国产综合一区 | 亚洲国产精品激情在线观看| 国产∨亚洲V天堂无码久久久| 亚洲精品动漫在线| 182tv免费视视频线路一二三| 四虎影视www四虎免费| 久久久国产亚洲精品| 国产猛烈高潮尖叫视频免费| 日韩欧美亚洲中文乱码| 一级毛片在线免费看| heyzo亚洲精品日韩| 亚洲av极品无码专区在线观看| 一级做a爱过程免费视| 一本久久a久久精品亚洲| 久久午夜夜伦鲁鲁片免费无码| 亚洲精品国产福利一二区| 久久久受www免费人成| 亚洲一区二区三区夜色| 18勿入网站免费永久| 亚洲国产成人AV网站| 青青草原亚洲视频| 1000部无遮挡拍拍拍免费视频观看| 亚洲videos| 亚洲国产精品成人久久蜜臀| 久久这里只精品热免费99| 亚洲va在线va天堂va手机| 国产免费69成人精品视频| 中文字幕无码免费久久| 亚洲日韩在线中文字幕第一页| 你懂的免费在线观看| 亚洲视频一区二区三区四区| 精品福利一区二区三区免费视频 | 国产偷国产偷亚洲高清在线| 国产l精品国产亚洲区在线观看| 7723日本高清完整版免费| 免费无遮挡无码视频在线观看| 亚洲综合一区二区国产精品| 国产成人精品免费直播|