hibernate one-to-one 配置及操作

HIBERNATE一對一配置

1. 完全的一對一關係,即A與B兩種實體,分兩個表格,一對一,A和B的關鍵字一樣,其中一個是父,先產生,另一個是子,後產生,使用要求,就是A和B生成後,一般不再改變關係,也就是說A一般不再將C做爲其子,而去除與B的關係,適用情況,比如表格某一部分太大,經常查詢需要大量數據流,而將表分開以提高性能,完全一對一關係要求不能更改兩者的關係,比如A對應B,一旦要將A的對應關係改成C一般是不允許的,因爲C也要和A一樣的ID,這樣B和C的ID就衝突了,可以測試一下,看會不會衝突
2. <one-to-one
        name="propertyName"                                                       (1)
       class="ClassName"                                                            (2)
        cascade="all|none|save-update|delete"                         (3)
       constrained="true|false"                                                      (4)
        outer-join="true|false|auto"                                                (5)
        property-ref="propertyNameFromAssociatedClass"   (6)
        access="field|property|ClassName"                               (7)
       />
3. (1) name: 屬性的名字(2) class (可選 - 默認是通過反射得到的屬性類型):被關聯的類的名字。 (3) cascade(級聯) (可選) 表明操作是否從父對象級聯到被關聯的對象。 (4) constrained(約束) (可選) 表明該類對應的表對應的數據庫表,和被關聯的對象所對應的數據庫表之間,通過一個外鍵引用對主鍵進行約束。這個選項影響save()和delete()在級聯執行時的先後順序(也在schema export tool中被使用)。 (5) outer-join(外連接) (可選 - 默認爲 自動): 當設置hibernate.use_outer_join的時候,對這個關聯允許外連接抓取。 (6) property-ref: (可選) 指定關聯類的一個屬性,這個屬性將會和本外鍵相對應。如果沒有指定,會使用對方關聯類的主鍵[POJO中POJO類的實例]。 (7) access (可選 - 默認是 property): Hibernate用來訪問屬性的策略。
4. One-to-one中不需要inverse,另外完全的一對一關係很嚴格,兩個對象一定同時存在,並且存在以後一般不會再修改,如果修改也不能從主動的一端進行修改了
5. 環境:模擬共享文件系統,Appender,每個附件有個名字和一個文件組成,在此將文件放到另一個表格中(AppenderFile)
6. 配置文件
-----------------------------------------------------------主動者
   <hibernate-mapping package="com.softWork.school">
<class name="Appender" table="appender">
    <id name="appenderId" column="appender_id" type="long">
      <generator class="native"/>
    </id>
    <property name="appenderTitle" column="appender_title" type="string" length="200"/>
   
    <one-to-one name="appenderFile" class="com.softWork.school.AppenderFile" constrained="false" cascade="all">
    </one-to-one>
</class>
</hibernate-mapping>

-------------------------------------------------------------------------------------------被動着
<hibernate-mapping package="com.softWork.school">
<class name="AppenderFile" table="appender_file">
    <id name="id" column="id" type="long">
      <generator class="foreign">
        <param name="property">appender</param>
      </generator>
    </id>
    <property name="fileContent" column="file_content" type="string" length="2000"/>
   
    <one-to-one name="appender" class="com.softWork.school.Appender" constrained="true">
    </one-to-one>
</class>
</hibernate-mapping>


7. 幾個注意
1) 主動者的constrainted爲false,被動者爲true,這個關鍵字主要決定關鍵字的生成是通過別人來獲得還是自己生成
2) 被動者也一定要有主動者的引用以在主動者創建成功後獲得其獲得的ID。程序執行時,被動者也一定要設置好主動者對象的引用,雖然也可以先不設置,這樣在保存主動者的時候,被動者將不會被保存,雖然這樣可以達到先創建主動者 ,而後按需要創建被動者,但是這與實際語義不符
3) 不可以通過爲主動者設置新的被動者來刪除原被動者的值,而增加新的被動者
4) 可以通過主動對象直接修改被動對象的內容後,保存主動對象而直接修改被動對象對應數據庫的內容
5) 可以級連刪除
6) 一定要先創建主動者再創建被動者

8. 操作程序示範
前提條件是’級連’
            /*
     1)可以級連保存數據
       Appender appender = new Appender();
       appender.setAppenderTitle("hello world.");
       AppenderFile appenderFile = new AppenderFile();
       appenderFile.setFileContent("good action.");
       appender.setAppenderFile(appenderFile);
       appenderFile.setAppender(appender);
      //以下一句將保存所有數據
       session.saveOrUpdate(appender);
       */
       2)可以通過父對象獲取子對象後修改子對象內容,保存父對象,級連更新到子對象
       //讀取appenderFile對象內容
       Appender appender = (Appender)session.load(Appender.class,new Long(4));
       /*
       appender.getAppenderFile().setFileContent("a sucess man.");
      //可以通過父對象修改子對象內容
       session.saveOrUpdate(appender);
       */
3)只刪除子對象
          a.通過設appender.setAppenderFile(null);
                    session.saveOrUpdate(appender); 無效
          b. Appender appender = (Appender)session.load(Appender.class,new Long(1));
             AppenderFile appenderFile = appender.getAppenderFile();
        session.delete(appenderFile);刪除失敗
          c. Appender appender = (Appender)session.load(Appender.class,new Long(1));
             AppenderFile appenderFile = appender.getAppenderFile();
             appender.setAppenderFile(null);
             session.delete(appenderFile);
            session.saveOrUpdate(appender);成功
4)通過爲父對象設置新的子對象來修改子對象數據庫中內容,操作失敗,所以一般的,一對一的操作,因爲完全可以通過父對象來設置子對象內容,完全不需要通過更換子對象來更換子表內容
//以下操作失敗
Appender appender = (Appender)session.load(Appender.class,new Long(1));
        AppenderFile appenderFile = appender.getAppenderFile();
        appender.setAppenderFile(null);
        AppenderFile newFile = new AppenderFile();
        newFile.setFileContent("good man");
       
        appender.setAppenderFile(newFile);
        newFile.setAppender(appender);
        session.delete(appenderFile);
        session.saveOrUpdate(appender);

      4)級連刪除成功
       session.delete(appender);

本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/notruiyi/archive/2007/08/13/1740124.aspx

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章