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

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

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

    隨筆-57  評(píng)論-202  文章-17  trackbacks-0
          Hibernate中的表的關(guān)聯(lián)有一對(duì)一,一對(duì)多和多對(duì)多三種關(guān)聯(lián)方式,在這篇筆記和接下來(lái)的筆記中,我將用我自己的實(shí)際例子來(lái)說(shuō)明如何具體實(shí)施。
          我使用的Hibernate版本是2.1.8,在Hibernate的網(wǎng)站2.1.6版本的中文文檔中有關(guān)一對(duì)一的關(guān)聯(lián)有下面一段表述:

    5.1.11. 一對(duì)一
    持久化對(duì)象之間一對(duì)一的關(guān)聯(lián)關(guān)系是通過(guò)one-to-one元素定義的。 

    <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)
            
    />
    (1) name: 屬性的名字。 
     
    (2) class (可選 - 默認(rèn)是通過(guò)反射得到的屬性類型):被關(guān)聯(lián)的類的名字。 
     
    (3) cascade(級(jí)聯(lián)) (可選) 表明操作是否從父對(duì)象級(jí)聯(lián)到被關(guān)聯(lián)的對(duì)象。 
     
    (4) constrained(約束) (可選) 表明該類對(duì)應(yīng)的表對(duì)應(yīng)的數(shù)據(jù)庫(kù)表,和被關(guān)聯(lián)的對(duì)象所對(duì)應(yīng)的數(shù)據(jù)庫(kù)表之間,通過(guò)一個(gè)外鍵引用對(duì)主鍵進(jìn)行約束。這個(gè)選項(xiàng)影響save()和delete()在級(jí)聯(lián)執(zhí)行時(shí)的先后順序(也在schema export tool中被使用)。 
     
    (5) outer-join(外連接) (可選 - 默認(rèn)為 自動(dòng)): 當(dāng)設(shè)置hibernate.use_outer_join的時(shí)候,對(duì)這個(gè)關(guān)聯(lián)允許外連接抓取。 
     
    (6) property-ref: (可選) 指定關(guān)聯(lián)類的一個(gè)屬性,這個(gè)屬性將會(huì)和本外鍵相對(duì)應(yīng)。如果沒(méi)有指定,會(huì)使用對(duì)方關(guān)聯(lián)類的主鍵。 
     
    (7) access (可選 - 默認(rèn)是 property): Hibernate用來(lái)訪問(wèn)屬性的策略。 
     

    有兩種不同的一對(duì)一關(guān)聯(lián): 

    主鍵關(guān)聯(lián) 

    惟一外鍵關(guān)聯(lián) 

    主鍵關(guān)聯(lián)不需要額外的表字段;兩行是通過(guò)這種一對(duì)一關(guān)系相關(guān)聯(lián)的,那么這兩行就共享同樣的主關(guān)鍵字值。所以如果你希望兩個(gè)對(duì)象通過(guò)主鍵一對(duì)一關(guān)聯(lián),你必須確認(rèn)它們被賦予同樣的標(biāo)識(shí)值! 

    比如說(shuō),對(duì)下面的Employee和Person進(jìn)行主鍵一對(duì)一關(guān)聯(lián): 

    <one-to-one name="person" class="Person"/>
    <one-to-one name="employee" class="Employee" constrained="true"/>
    現(xiàn)在我們必須確保PERSON和EMPLOYEE中相關(guān)的字段是相等的。我們使用一個(gè)特別的稱為foreign的Hibernate標(biāo)識(shí)符生成器策略: 

    <class name="person" table="PERSON">
        
    <id name="id" column="PERSON_ID">
            
    <generator class="foreign">
                
    <param name="property">employee</param>
            
    </generator>
        
    </id>
        
        
    <one-to-one name="employee"
            class
    ="Employee"
            constrained
    ="true"/>
    </class>
    一個(gè)剛剛保存的Person實(shí)例被賦予和該P(yáng)erson的employee屬性所指向的Employee實(shí)例同樣的關(guān)鍵字值。 

    另一種方式是一個(gè)外鍵和一個(gè)惟一關(guān)鍵字對(duì)應(yīng),上面的Employee和Person的例子,如果使這種關(guān)聯(lián)方式,應(yīng)該表達(dá)成: 

    <many-to-one name="person" class="Person" column="PERSON_ID" unique="true"/>
    如果在Person的映射加入下面幾句,這種關(guān)聯(lián)就是雙向的: 

    <one-to-one name"employee" class="Employee" property-ref="person"/>
          
          下面是我的一個(gè)一對(duì)一主鍵關(guān)聯(lián)的例子,使用的數(shù)據(jù)庫(kù)是MySQL 4.1.11:
          我有兩個(gè)表:UserBasic和UserInfo,UserBasic記錄的是用戶的基本注冊(cè)信息,UserInfo表記錄的是用戶的詳細(xì)信息。表的結(jié)構(gòu)如下:

     1CREATE TABLE IF NOT EXISTS UserBasic
     2(
     3   Guid                           INT                            NOT NULL AUTO_INCREMENT,
     4   Account                        VARCHAR(64)                    NOT NULL,
     5   Password                       VARCHAR(16)                    NOT NULL,
     6   Email                          VARCHAR(128)                   NOT NULL,
     7   PRIMARY KEY (Guid)
     8) TYPE=InnoDB;
     9
    10CREATE TABLE IF NOT EXISTS UserInfo
    11(
    12   Guid                           INT                            NOT NULL,
    13   Username                       VARCHAR(128),
    14   Gender                         CHAR(1),
    15   Birthday                       DATETIME,
    16   PRIMARY KEY (Guid)
    17) TYPE=InnoDB;
    18
    19ALTER TABLE UserInfo ADD CONSTRAINT UserInfoRFUserBasic FOREIGN KEY (Guid) 
    20   REFERENCES UserBasic (Guid) ON DELETE CASCADE ON UPDATE RESTRICT;

          UserInfo的主鍵值和UserBasic的主鍵值是一樣的,兩個(gè)表是單向的一對(duì)一關(guān)系。UserBasic為主控方,UserInfo是被動(dòng)方。
          用Middlegen生成的UserBasic.hbm.xml文件,修改后的內(nèi)容如下:

      1<?xml version="1.0"?>
      2<!DOCTYPE hibernate-mapping PUBLIC
      3    "-//Hibernate/Hibernate Mapping DTD 2.0//EN"
      4    "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd" >
      5    
      6<hibernate-mapping>
      7<!-- 
      8    Created by the Middlegen Hibernate plugin 2.1
      9
     10    http://boss.bekk.no/boss/middlegen/
     11    http://www.hibernate.org/
     12-->
     13
     14<class 
     15    name="com.xxx.hibernate.UserBasic" 
     16    table="UserBasic"
     17    dynamic-update="true"
     18    dynamic-insert="true"
     19>
     20    <meta attribute="class-description" inherit="false">
     21       @hibernate.class
     22        table="UserBasic"
     23        dynamic-update="true"
     24        dynamic-insert="true"
     25    </meta>
     26
     27    <id
     28        name="guid"
     29        type="int"
     30        column="Guid"
     31    >
     32        <meta attribute="field-description">
     33           @hibernate.id
     34            generator-class="native"
     35            type="int"
     36            column="Guid"
     37
     38
     39        </meta>
     40        <generator class="native" />
     41    </id>
     42
     43    <property
     44        name="account"
     45        type="java.lang.String"
     46        column="Account"
     47        not-null="true"
     48        length="64"
     49    >
     50        <meta attribute="field-description">
     51           @hibernate.property
     52            column="Account"
     53            length="64"
     54            not-null="true"
     55        </meta>    
     56    </property>
     57    <property
     58        name="password"
     59        type="java.lang.String"
     60        column="Password"
     61        not-null="true"
     62        length="16"
     63    >
     64        <meta attribute="field-description">
     65           @hibernate.property
     66            column="Password"
     67            length="16"
     68            not-null="true"
     69        </meta>    
     70    </property>
     71    <property
     72        name="email"
     73        type="java.lang.String"
     74        column="Email"
     75        not-null="true"
     76        length="128"
     77    >
     78        <meta attribute="field-description">
     79           @hibernate.property
     80            column="Email"
     81            length="128"
     82            not-null="true"
     83        </meta>    
     84    </property>
     85
     86    <!-- Associations -->
     87  
     88    <!-- bi-directional one-to-one association to UserInfo -->
     89    <one-to-one
     90        name="userInfo"
     91        class="com.xxx.hibernate.UserInfo"
     92        cascade="save-update"
     93    >
     94        <meta attribute="field-description">
     95           @hibernate.one-to-one
     96               class="com.xxx.hibernate.UserInfo"
     97            cascade="save-update"
     98        </meta>
     99    </one-to-one>
    100
    101</class>
    102</hibernate-mapping>

          由于在建立外鍵的時(shí)候就聲明了ON DELETE CASCADE,所以在xml的配置文件中第97行聲明為save-update。如果聲明為all,那么在刪除UserBasic表的數(shù)據(jù)時(shí),會(huì)無(wú)謂的多出一條刪除UserInfo的delete語(yǔ)句出來(lái)。
          UserInfo.hbm.xml文件的內(nèi)容如下:

     1<?xml version="1.0"?>
     2<!DOCTYPE hibernate-mapping PUBLIC
     3    "-//Hibernate/Hibernate Mapping DTD 2.0//EN"
     4    "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd" >
     5    
     6<hibernate-mapping>
     7<!-- 
     8    Created by the Middlegen Hibernate plugin 2.1
     9
    10    http://boss.bekk.no/boss/middlegen/
    11    http://www.hibernate.org/
    12-->
    13
    14<class 
    15    name="com.xxx.hibernate.UserInfo" 
    16    table="UserInfo"
    17    dynamic-update="true"
    18    dynamic-insert="true"
    19>
    20    <meta attribute="class-description" inherit="false">
    21       @hibernate.class
    22        table="UserInfo"
    23        dynamic-update="true"
    24        dynamic-insert="true"
    25    </meta>
    26
    27    <id
    28        name="guid"
    29        type="int"
    30        column="Guid"
    31    >
    32        <meta attribute="field-description">
    33           @hibernate.id
    34            generator-class="foreign"
    35            type="int"
    36            column="Guid"
    37
    38
    39        </meta>
    40        <generator class="foreign">
    41            <param name="property">userBasic</param>
    42        </generator>
    43    </id>
    44
    45    <property
    46        name="username"
    47        type="java.lang.String"
    48        column="Username"
    49        length="128"
    50    >
    51        <meta attribute="field-description">
    52           @hibernate.property
    53            column="Username"
    54            length="128"
    55        </meta>    
    56    </property>
    57    <property
    58        name="gender"
    59        type="java.lang.String"
    60        column="Gender"
    61        length="1"
    62    >
    63        <meta attribute="field-description">
    64           @hibernate.property
    65            column="Gender"
    66            length="1"
    67        </meta>    
    68    </property>
    69    <property
    70        name="birthday"
    71        type="java.sql.Date"
    72        column="Birthday"
    73        length="19"
    74    >
    75        <meta attribute="field-description">
    76           @hibernate.property
    77            column="Birthday"
    78            length="19"
    79        </meta>    
    80    </property>
    81
    82    <!-- Associations -->
    83  
    84    <!-- bi-directional one-to-one association to UserBasic -->
    85    <one-to-one
    86        name="userBasic"
    87        class="com.xxx.hibernate.UserBasic"
    88        constrained="true"
    89    >
    90        <meta attribute="field-description">
    91           @hibernate.one-to-one
    92            class="com.xxx.hibernate.UserBasic"
    93            constrained="true"
    94        </meta>    
    95    </one-to-one>
    96    
    97</class>
    98</hibernate-mapping>

          用hbm2java生成對(duì)應(yīng)的對(duì)應(yīng)的Java類:hbm2java *.xml --output=xxx。
          Hibernate的配置文件hibernate.cfg.xml內(nèi)容如下:

     1<?xml version="1.0" encoding="utf-8"?>
     2<!DOCTYPE hibernate-configuration
     3    PUBLIC "-//Hibernate/Hibernate Configuration DTD//EN"
     4    "http://hibernate.sourceforge.net/hibernate-configuration-2.0.dtd">
     5
     6<hibernate-configuration>
     7    <session-factory>
     8
     9        <!-- local connection properties -->
    10        <property name="hibernate.connection.url">jdbc:mysql://127.0.0.1/xxx?useUnicode=true&amp;characterEncoding=UTF-8&amp;autoReconnect=true</property>
    11        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
    12        <property name="hibernate.connection.username">root</property>
    13        <property name="hibernate.connection.password">123456</property>
    14        <!-- property name="hibernate.connection.pool_size"></property -->
    15
    16        <!-- dialect for MySQL -->
    17        <property name="dialect">net.sf.hibernate.dialect.MySQLDialect</property>
    18
    19        <property name="hibernate.show_sql">true</property>
    20        <property name="hibernate.use_outer_join">true</property>
    21        <property name="hibernate.transaction.factory_class">net.sf.hibernate.transaction.JDBCTransactionFactory</property>
    22        
    23        <mapping resource="com/xxx/hibernate/UserBasic.hbm.xml"/>
    24        <mapping resource="com/xxx/hibernate/UserInfo.hbm.xml"/>
    25
    26    </session-factory>
    27</hibernate-configuration>

          JUnit的測(cè)試用例程序片斷如下:

     1    public void testInsertUser() throws Exception {
     2        UserBasic user = new UserBasic();
     3        user.setAccount("test");
     4        user.setPassword("123456");
     5        user.setEmail("georgehill@21cn.com");
     6        
     7        UserInfo info = new UserInfo();
     8        info.setUsername("George Hill");
     9        info.setGender("M");
    10        info.setBirthday(new Date());
    11        
    12        user.setUserInfo(info);
    13        info.setUserBasic(user);
    14        
    15        Transaction tx = session.beginTransaction();
    16        session.save(user);
    17        tx.commit();
    18    }

          運(yùn)行測(cè)試程序,可以看到輸出了兩條insert語(yǔ)句。
    posted on 2005-05-14 15:02 小米 閱讀(4044) 評(píng)論(2)  編輯  收藏 所屬分類: Hibernate

    評(píng)論:
    # re: Hibernate的一對(duì)一關(guān)聯(lián)實(shí)例 2014-10-16 16:03 | vds
    好樣的  回復(fù)  更多評(píng)論
      
    # re: Hibernate的一對(duì)一關(guān)聯(lián)實(shí)例 2016-06-17 15:32 | 33
    根據(jù)寫(xiě)了報(bào)錯(cuò)了是怎么回事  回復(fù)  更多評(píng)論
      
    主站蜘蛛池模板: 日本人护士免费xxxx视频| 久久国产精品亚洲综合| 亚洲的天堂av无码| 国产黄在线观看免费观看不卡 | 免费无遮挡无码永久视频| 免费在线观看污网站| 亚洲人成伊人成综合网久久| a级毛片免费高清毛片视频| 性做久久久久免费看| 色偷偷亚洲女人天堂观看欧| 无码人妻一区二区三区免费n鬼沢| 亚洲精品天堂成人片?V在线播放| 国产精品亚洲综合久久| 3344永久在线观看视频免费首页| 一级毛片免费不卡| 四虎在线免费播放| 亚洲三级视频在线| 6080午夜一级毛片免费看6080夜福利| 亚洲午夜久久久影院| 免费国产黄网站在线看| 成全视频免费高清| 亚洲中文字幕久久精品无码2021| 一级毛片免费播放| 久久99国产亚洲高清观看首页| 九九久久精品国产免费看小说 | 亚洲色中文字幕在线播放| 9277手机在线视频观看免费| 国产精品亚洲片在线| 一区二区3区免费视频| 又爽又黄无遮挡高清免费视频| 亚洲乱色伦图片区小说| 欧美三级在线电影免费| 亚洲最大中文字幕| 最近中文字幕电影大全免费版| 亚洲电影国产一区| 精品成人免费自拍视频| 久久亚洲高清观看| 国产成人免费AV在线播放 | 亚洲人成77777在线播放网站| a在线视频免费观看在线视频三区| vvvv99日韩精品亚洲|