Hibernate一對(duì)一數(shù)據(jù)關(guān)聯(lián)(一)

          對(duì)于ORM而言,一個(gè)重要的特性就是對(duì)實(shí)體之間關(guān)聯(lián)關(guān)系的管理。數(shù)據(jù)關(guān)聯(lián)是ORM一個(gè)重要的特征,但往往也是導(dǎo)致性能低下的原因,在開發(fā)中要特別注意這一點(diǎn)。

          一對(duì)一關(guān)聯(lián)有兩種類型:主鍵關(guān)聯(lián)和唯一外鍵關(guān)聯(lián)

          一.主鍵關(guān)聯(lián):
          一對(duì)一主鍵關(guān)聯(lián)形式,即兩張關(guān)聯(lián)表通過主鍵形成一對(duì)一映射關(guān)系。
          例如,一個(gè)中國公民只能有一份護(hù)照。

          1.數(shù)據(jù)模型如下



          2.表定義sql

          DROP   TABLE  T_User;
          DROP   TABLE  T_Passport;

          CREATE   TABLE  T_Passport (
                 id 
          INT   NOT   NULL
               , serial 
          VARCHAR ( 30 )
               , expiry 
          INT
               , 
          PRIMARY   KEY  (id)
          );

          CREATE   TABLE  T_User (
                 id 
          INT   NOT   NULL  AUTO_INCREMENT
               , name 
          VARCHAR ( 50 )
               , age 
          INT
               , 
          PRIMARY   KEY  (id)
               , 
          INDEX  (id)
               , 
          CONSTRAINT  FK_T_User_1  FOREIGN   KEY  (id)
                            
          REFERENCES  T_Passport (id)
          );



          3.POJO類
          TUser.java
          package cn.blogjava.start;

          public class TUser  implements java.io.Serializable {
              
          // Fields    
               private Integer id;
               
          private Integer age;
               
          private String name;
               
          private TPassport passport;


              
          // Constructors

              
          public Integer getAge() {
                  
          return age;
              }

              
          public void setAge(Integer age) {
                  
          this.age = age;
              }

              
          public TPassport getPassport() {
                  
          return passport;
              }

              
          public void setPassport(TPassport passport) {
                  
          this.passport = passport;
              }

              
          /** default constructor */
              
          public TUser() {
              }
              
              
          /** constructor with id */
              
          public TUser(Integer id) {
                  
          this.id = id;
              }
              
          // Property accessors

              
          public Integer getId() {
                  
          return this.id;
              }
              
              
          public void setId(Integer id) {
                  
          this.id = id;
              }

              
          public String getName() {
                  
          return this.name;
              }
              
              
          public void setName(String name) {
                  
          this.name = name;
              }

          }

          TPassport.java
          package cn.blogjava.start;

          import java.io.Serializable;

          public class TPassport implements Serializable {
              
          private Integer id;
              
          private String serial;
              
          private Integer expiry;
              
          private TUser user;
              
              
          public Integer getExpiry() {
                  
          return expiry;
              }
              
          public void setExpiry(Integer expiry) {
                  
          this.expiry = expiry;
              }
              
          public Integer getId() {
                  
          return id;
              }
              
          public void setId(Integer id) {
                  
          this.id = id;
              }
              
          public String getSerial() {
                  
          return serial;
              }
              
          public void setSerial(String serial) {
                  
          this.serial = serial;
              }
              
          public TUser getUser() {
                  
          return user;
              }
              
          public void setUser(TUser user) {
                  
          this.user = user;
              }
              
          }

          3.配置文件
          TUser.hbm.xml
          <?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="cn.blogjava.start.TUser" table="T_User" catalog="sample">
                  
          <id name="id" type="integer">
                      
          <column name="id" />
                      
          <generator class="native" />
                  
          </id>
                  
          <property name="name" type="string">
                      
          <column name="name" length="100" not-null="true" />
                  
          </property>
                  
          <property name="age" type="java.lang.Integer" column="age" />
                  
          <one-to-one name="passport" 
                              class
          ="cn.blogjava.start.TPassport"
           
                              cascade
          ="all"
           
                              outer-join
          ="true"
           
                   
          />

              
          </class>
          </hibernate-mapping>

          TPassport.hbm.xml
          <?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="cn.blogjava.start.TPassport" table="T_Passport" catalog="sample">
                  
          <id name="id" type="integer" column="id">
                      
          <generator class="foreign">
                          
          <param name="property">user</param>
                      
          </generator>           
                  
          </id>

                  
          <property name="serial" type="string" column="serial" />
                  
          <property name="expiry" type="java.lang.Integer" column="expiry" />
                  
                  
          <one-to-one name="user" 
                              class
          ="cn.blogjava.start.TUser"
           
                              constrained
          ="true"

                   
          />
              
          </class>
          </hibernate-mapping>

          4.測(cè)試代碼
          package cn.blogjava.start;

          import java.util.List;

          import junit.framework.Assert;
          import junit.framework.TestCase;

          import org.hibernate.HibernateException;
          import org.hibernate.Session;
          import org.hibernate.SessionFactory;
          import org.hibernate.Transaction;
          import org.hibernate.cfg.Configuration;


          public class HibernateTest extends TestCase {
              
              Session session 
          = null;
              protected void setUp() {
                  
          try {

                      Configuration config = new Configuration().configure();
                      SessionFactory sessionFactory 
          = config.buildSessionFactory();
                      session 
          = sessionFactory.openSession();
                      
                  } 
          catch (HibernateException e) {
                      e.printStackTrace();
                  }        
              }

              protected void tearDown() {
                  
          try {
                      session.close();        
                  } 
          catch (HibernateException e) {
                     e.printStackTrace();
                  }        
              }    
              
              public void testInsert() {
                  Transaction tran 
          = null;
                  
          try {
                  
                      TUser user 
          = new TUser();
                      user.setName(
          "byf");
                      user.setAge(
          new Integer(26));
                      
                      TPassport passport 
          = new TPassport();
                      passport.setSerial(
          "PCN123456");
                      passport.setExpiry(
          new Integer(20081010));
                      
                      
          //設(shè)置相互關(guān)聯(lián)
                      user.setPassport(passport);
                      passport.setUser(user);

                      tran 
          = session.beginTransaction();
                      session.save(user);
                      session.flush();
                      tran.commit();
                      Assert.assertEquals(user.getId().intValue()
          >0 ,true);
                  } 
          catch (HibernateException e) {
                      e.printStackTrace();
                      Assert.fail(e.getMessage());
                      
          if(tran != null) {
                          
          try {
                              tran.rollback();
                          } 
          catch (Exception e1) {
                              e1.printStackTrace();
                          }
                      }
                  }
              }
              
              
          /**
               * 對(duì)象讀取測(cè)試(Select方法)
               
          */            
              
          public void testSelect(){
                  String hql 
          = " from TUser where name='byf'";
                  
          try {
                      List userList 
          = session.createQuery(hql).list();
                      TUser user 
          = (TUser)userList.get(0);
                      System.out.println(
          "user name is " + user.getName());
                      System.out.println(
          "passport serial NO. is " + user.getPassport().getSerial());
                      Assert.assertEquals(user.getName(), 
          "byf");
                  } 
          catch (Exception e) {
                      e.printStackTrace();
                      Assert.fail(e.getMessage());
                  }
              }
          }

          posted on 2006-07-03 16:37 baim 閱讀(571) 評(píng)論(0)  編輯  收藏 所屬分類: 開源軟件框架

          <2006年7月>
          2526272829301
          2345678
          9101112131415
          16171819202122
          23242526272829
          303112345

          導(dǎo)航

          常用鏈接

          隨筆分類(27)

          隨筆檔案(28)

          搜索

          最新評(píng)論

          主站蜘蛛池模板: 永德县| 大英县| 遂宁市| 崇信县| 汝南县| 绥阳县| 留坝县| 岚皋县| 遂溪县| 兰西县| 舞阳县| 深州市| 广河县| 会同县| 黑河市| 镇原县| 丰城市| 玉龙| 滁州市| 桓仁| 平定县| 茶陵县| 玛纳斯县| 蓝山县| 辽阳县| 安义县| 湘乡市| 江安县| 盐源县| 类乌齐县| 西吉县| 赤峰市| 杭锦旗| 农安县| 额济纳旗| 安达市| 板桥市| 乐至县| 永嘉县| 三河市| 云梦县|