隨筆-55  評論-208  文章-0  trackbacks-0
          天花費了n久時間在一個hibernate的雙鍵關聯問題上好在最后問題還是解決了,不然我會睡不著覺的
          問題:
          我的數據庫結構是這樣的:

          首先一開始我可以獲得一個頻道的channelId,我根據這個channelId得到一個首頁區塊的List,我在hibernate中配置homepagearea的加載方式,這樣就可以通過homepage的到關聯的欄目column(多對一關系),然后我還是使用hibernate的自動加載,取到column關聯的專題subject(一對多關系)。
          這時候問題出來了,由于column到subject的關聯沒有帶channel信息,所以,我取到的subject實際上是一個column下所有的subject,而我期望的是要得到,一個homepagearea下根據channelId和columnId取得的subject.

          解決思路:
          希望通過hibernate直接建立homepage和subject的1對多關聯關系

          解決方法
          首先我改變原來利用工具生成的hibernate配置文件和entitybean
          先列出原來的homepagearea的配置文件
          <?xml version="1.0"?>
          <!DOCTYPE hibernate-mapping PUBLIC
          ??? "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
          ??? "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >

          <hibernate-mapping>
          <class
          ??? name="com.easou.wapsearch.channel.entity.CsHomepageArea"
          ??? table="CS_HOMEPAGE_AREA"
          ??? schema="WAPUSER"
          ??? lazy="true"
          >
          ??? <id
          ??????? name="id"
          ??????? type="long"
          ??????? column="ID"
          ??????? length="22"
          ??? >
          ??? ?<generator class="assigned">
          ??? ??
          ??? ?</generator>
          ??? </id>
          ??? <property
          ??????? name="createdBy"
          ??????? type="long"
          ??????? column="CREATED_BY"
          ??????? length="22"
          ??? />
          ??? <property
          ??????? name="createdDate"
          ??????? type="timestamp"
          ??????? column="CREATED_DATE"
          ??????? length="7"
          ??? />
          ??? <property
          ??????? name="isMore"
          ??????? type="long"
          ??????? column="IS_MORE"
          ??????? length="22"
          ??? />
          ??? <property
          ??????? name="name"
          ??????? type="string"
          ??????? column="NAME"
          ??????? length="50"
          ??? />
          ??? <property
          ??????? name="rowCount"
          ??????? type="long"
          ??????? column="ROW_COUNT"
          ??????? length="22"
          ??? />
          ??? <property
          ??????? name="showCount"
          ??????? type="long"
          ??????? column="SHOW_COUNT"
          ??????? length="22"
          ??? />
          ??? <property
          ??????? name="theOrder"
          ??????? type="long"
          ??????? column="THE_ORDER"
          ??????? length="22"
          ??? />
          ??? <property
          ??????? name="updateBy"
          ??????? type="long"
          ??????? column="UPDATE_BY"
          ??????? length="22"
          ??? />
          ??? <property
          ??????? name="updateDate"
          ??????? type="timestamp"
          ??????? column="UPDATE_DATE"
          ??????? length="7"
          ??? />

          ??? <!-- Associations -->
          ??? <!-- bi-directional many-to-one association to CsChannel -->
          ??? <many-to-one
          ??????? name="csChannel"???????
          ??? >
          ??????? <column name="CHANNEL_ID" length="22"/>
          ??? </many-to-one>
          ??? <!-- bi-directional many-to-one association to CsColumn -->
          ??? <many-to-one
          ??????? name="csColumn"???????
          ??? >
          ??????? <column name="COLUMN_ID" length="22"/>
          ??? </many-to-one>

          </class>
          </hibernate-mapping>

          為了讓homepagearea和subject形成一種一對多的關系,我增加的一個
          <set name="csSubjects" inverse="true" cascade="save-update"
          ???lazy="false" order-by="THE_ORDER" table="CS_SUBJECT"
          ???outer-join="true">
          ???<key>
          ????<column name="CHANNEL_ID" index="CHANNEL_ID" />
          ????<column name="COLUMN_ID" index="COLUMN_ID" />
          ???</key>
          ???<one-to-many
          ????class="com.easou.wapsearch.channel.entity.CsSubject" />
          </set>
          但是由于hibernate一對多映射的一端必須是主鍵,而且我這里需要關聯的還是2列信息,所以我還必須要修改配置文件的主鍵設置
          <composite-id mapped="false" unsaved-value="none">
          ????? <key-many-to-one name="csChannel" column="CHANNEL_ID"></key-many-to-one>
          ???<key-many-to-one name="csColumn" column="COLUMN_ID"></key-many-to-one>
          </composite-id>
          并且遮蔽掉原有的channel和column多對一關聯關系,否則會報告重復錯誤
          <!-- Associations
          ?? bi-directional many-to-one association to CsChannel
          ??<many-to-one name="csChannel" lazy="true">
          ???<column name="CHANNEL_ID" length="22" />
          ??</many-to-one>
          ?? bi-directional many-to-one association to CsColumn
          ??<many-to-one name="csColumn" lazy="true">
          ???<column name="COLUMN_ID" length="22" />
          ??</many-to-one>

          ??-->
          這樣hibernate才會在加載homepagearea時自動把subject的關聯信息也加載進來了


          最后的homepagearea配置文件
          <?xml version="1.0"?>
          <!DOCTYPE hibernate-mapping PUBLIC
          ??? "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
          ??? "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >

          <hibernate-mapping>
          ?<class name="com.easou.wapsearch.channel.entity.CsHomepageArea"
          ??table="CS_HOMEPAGE_AREA" schema="WAPUSER" lazy="true">
          ??<composite-id mapped="false" unsaved-value="none">
          ????? <key-many-to-one name="csChannel" column="CHANNEL_ID"></key-many-to-one>
          ???<key-many-to-one name="csColumn" column="COLUMN_ID"></key-many-to-one>
          ??</composite-id>
          ??<property name="createdBy" type="long" column="CREATED_BY"
          ???length="22" />
          ??<property name="createdDate" type="timestamp"
          ???column="CREATED_DATE" length="7" />
          ??<property name="isMore" type="long" column="IS_MORE"
          ???length="22" />
          ??<property name="name" type="string" column="NAME" length="50" />
          ??<property name="rowCount" type="long" column="ROW_COUNT"
          ???length="22" />
          ??<property name="showCount" type="long" column="SHOW_COUNT"
          ???length="22" />
          ??<property name="theOrder" type="long" column="THE_ORDER"
          ???length="22" />
          ??<property name="updateBy" type="long" column="UPDATE_BY"
          ???length="22" />
          ??<property name="updateDate" type="timestamp"
          ???column="UPDATE_DATE" length="7" />

          ??<!-- Associations
          ?? bi-directional many-to-one association to CsChannel
          ??<many-to-one name="csChannel" lazy="true">
          ???<column name="CHANNEL_ID" length="22" />
          ??</many-to-one>
          ?? bi-directional many-to-one association to CsColumn
          ??<many-to-one name="csColumn" lazy="true">
          ???<column name="COLUMN_ID" length="22" />
          ??</many-to-one>

          ??-->
          ??<set name="csSubjects" inverse="true" cascade="save-update"
          ???lazy="false" order-by="THE_ORDER" table="CS_SUBJECT"
          ???outer-join="true">
          ???<key>
          ????<column name="CHANNEL_ID" index="CHANNEL_ID" />
          ????<column name="COLUMN_ID" index="COLUMN_ID" />
          ???</key>
          ???<one-to-many
          ????class="com.easou.wapsearch.channel.entity.CsSubject" />

          ??</set>


          ?</class>

          </hibernate-mapping>

          經驗總結:
          1、本來使用hibernate的加載策略就是為了把一些業務邏輯直接融合在數據庫關系當中,但是由于自己邏輯沒有考慮清楚造成了加載時信息的丟失(而且我覺得我的表結構有問題,不知有有沒有dba給我指點一下問題)。
          2、hibernate的一對多關聯關系多端是1端是針對主鍵的,所以不論你是關聯的是1列2列還是3列,它們都應該是你的1端的主鍵或者聯合主鍵(其實一對一,多對一,多對多的原理也是相似的)。

          參考資料:hibernate_reference(3.2)

          posted on 2006-11-08 00:42 rocket 閱讀(2522) 評論(0)  編輯  收藏

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


          網站導航:
           
          主站蜘蛛池模板: 宝鸡市| 清流县| 来宾市| 甘德县| 夹江县| 嵊州市| 西昌市| 镇雄县| 靖远县| 读书| 滨海县| 恩平市| 应城市| 井陉县| 从江县| 竹山县| 汽车| 安丘市| 高阳县| 新邵县| 宣化县| 新干县| 兴海县| 海伦市| 措勤县| 伊吾县| 二连浩特市| 吉木萨尔县| 凤阳县| 乌什县| 肃北| 东宁县| 商丘市| 荥阳市| 乐山市| 汉川市| 安远县| 木兰县| 香河县| 芦山县| 张家界市|