Hibernate一對一數據關聯(一)

          對于ORM而言,一個重要的特性就是對實體之間關聯關系的管理。數據關聯是ORM一個重要的特征,但往往也是導致性能低下的原因,在開發中要特別注意這一點。

          一對一關聯有兩種類型:主鍵關聯和唯一外鍵關聯

          一.主鍵關聯:
          一對一主鍵關聯形式,即兩張關聯表通過主鍵形成一對一映射關系。
          例如,一個中國公民只能有一份護照。

          1.數據模型如下



          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.測試代碼
          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));
                      
                      
          //設置相互關聯
                      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();
                          }
                      }
                  }
              }
              
              
          /**
               * 對象讀取測試(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 閱讀(576) 評論(0)  編輯  收藏 所屬分類: 開源軟件框架

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

          導航

          常用鏈接

          隨筆分類(27)

          隨筆檔案(28)

          搜索

          最新評論

          主站蜘蛛池模板: 印江| 南汇区| 平原县| 台北县| 察雅县| 酉阳| 龙川县| 卓资县| 苏州市| 东兰县| 探索| 高唐县| 武定县| 西宁市| 绥化市| 金坛市| 龙州县| 仁寿县| 平昌县| 新津县| 化州市| 崇阳县| 定陶县| 扬州市| 运城市| 肇东市| 太谷县| 永靖县| 钟祥市| 密山市| 舟曲县| 鲁山县| 星座| 沅陵县| 邯郸市| 贵溪市| 通江县| 大化| 全椒县| 宁乡县| 独山县|