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

          唯一外鍵關(guān)聯(lián)
          一.單向一對一關(guān)聯(lián)
          1.數(shù)據(jù)模型如下圖所示:


          2.數(shù)據(jù)表sql
          DROP TABLE T_User;
          DROP TABLE T_Group;

          CREATE TABLE T_Group (
                 id 
          INT NOT NULL AUTO_INCREMENT
               , name 
          VARCHAR(50)
               , 
          PRIMARY KEY (id)
          );

          CREATE TABLE T_User (
                 id 
          INT NOT NULL AUTO_INCREMENT
               , name 
          VARCHAR(50)
               , age 
          INT
               , group_id 
          INT NOT NULL
               , 
          PRIMARY KEY (id)
               , 
          INDEX (group_id)
               , 
          CONSTRAINT FK_T_User_1 FOREIGN KEY (group_id)
                            
          REFERENCES T_Group (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 TGroup group;


              
          // Constructors

              
          public Integer getAge() {
                  
          return age;
              }

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


              
          public TGroup getGroup() {
                  
          return group;
              }

              
          public void setGroup(TGroup group) {
                  
          this.group = group;
              }

              
          /** 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;
              }
          }

          TGroup.java
          package cn.blogjava.start;

          import java.io.Serializable;

          public class TGroup implements Serializable {
              
              
          private Integer id;
              
          private String name;
              
              
          public Integer getId() {
                  
          return id;
              }
              
          public void setId(Integer id) {
                  
          this.id = id;
              }
              
          public String getName() {
                  
          return name;
              }
              
          public void setName(String name) {
                  
          this.name = name;
              }
              
          }

          3.配置文件
          hibernate.cfg.xml
          <?xml version="1.0" encoding="UTF-8"?>
          <!DOCTYPE hibernate-configuration PUBLIC
                  "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
                  "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"
          >
          <hibernate-configuration>
              
          <session-factory>
                  
          <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
                  
          <property name="hibernate.connection.password">1234</property>
                  
          <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/sample</property>
                  
          <property name="hibernate.connection.username">root</property>
                  
          <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
                  
          <mapping resource="cn/blogjava/start/TUser.hbm.xml" />
                  
          <mapping resource="cn/blogjava/start/TGroup.hbm.xml" />        
              
          </session-factory>
          </hibernate-configuration>

          TGroup.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.TGroup" table="T_Group" catalog="sample">
                  
          <id name="id" type="integer">
                      
          <column name="id" />
                      
          <generator class="native" />
                  
          </id>
                  
          <property name="name" type="string" column="name" />
              
          </class>
          </hibernate-mapping>

          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" />
                  
          <many-to-one name="group" 
                              class
          ="cn.blogjava.start.TGroup" 
                              column
          ="GROUP_ID"
                              cascade="all"
                              unique
          ="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();
                  }        
              }    
              
              /**
               * 對象持久化測試(Insert方法)
               */        
              public void testInsert() {
                  Transaction tran = null;
                  try {
                  
                      TUser user = new TUser();
                      user.setName("byf");
                      user.setAge(new Integer(26));
                      
                      TGroup group = new TGroup();
                      group.setName("Admin");
                      
                         // 如果在配置文件中沒有cascade="all",就要先插入group信息
                     // tran = session.beginTransaction();            
                     // session.save(group);
                     // session.flush();
                     // tran.commit();
                                  
                      tran = session.beginTransaction();                    
                      //設(shè)置關(guān)聯(lián)
                      user.setGroup(group);

                         //插入user信息
                      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("user group is " + user.getGroup().getName());

                      Assert.assertEquals(user.getName(), "byf");
                  } catch (Exception e) {
                      e.printStackTrace();
                      Assert.fail(e.getMessage());
                  }
              }
          }

          二.雙向一對一關(guān)聯(lián)
          需要對TGroup.java和TGroup.hbm.xml文件作修改

          1.在TGroup.java中增加一個(gè)TUser類和相應(yīng)的getter、setter方法
          TGroup.java
          package cn.blogjava.start;

          import java.io.Serializable;

          public class TGroup implements Serializable {
              
              private Integer id;
              private String name;
              private TUser user;
              
              public TUser getUser() {
                  return user;
              }
              public void setUser(TUser user) {
                  this.user = user;
              }

              public Integer getId() {
                  return id;
              }
              public void setId(Integer id) {
                  this.id = id;
              }
              public String getName() {
                  return name;
              }
              public void setName(String name) {
                  this.name = name;
              }
              
          }

          2.在TGroup.hbm.xml中增加one-to-one配置
          <?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.TGroup" table="T_Group" catalog="sample">
                  
          <id name="id" type="integer">
                      
          <column name="id" />
                      
          <generator class="native" />
                  
          </id>
                  
          <property name="name" type="string" column="name" />
                  
          <one-to-one 
                               
          name="user"

                               class
          ="cn.blogjava.start.TUser"
                               property-ref
          ="group"
                               
          />
              
          </class>
          </hibernate-mapping>

          這樣就實(shí)現(xiàn)了雙向關(guān)聯(lián)。可以實(shí)現(xiàn)雙向查詢
          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();
                  }        
              }    
              
              
          /**
               * 對象持久化測試(Insert方法)
               
          */        
              
          public void testInsert() {
                  Transaction tran 
          = null;
                  
          try {
                  
                      TUser user 
          = new TUser();
                      user.setName(
          "byf");
                      user.setAge(
          new Integer(26));
                      
                      TGroup group 
          = new TGroup();
                      group.setName(
          "Admin");
                      
                                
                      tran 
          = session.beginTransaction();                    
                      
          //設(shè)置關(guān)聯(lián)
                      user.setGroup(group);

                      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'"
          ;
                  String hql2 
          = " from TGroup where name='admin'"
          ;
                  
          try
           {
                      List userList 
          =
           session.createQuery(hql).list();
                      TUser user 
          = (TUser)userList.get(0
          );
                      System.out.println(
          "user name is " +
           user.getName());
                      System.out.println(
          "user group is " +
           user.getGroup().getName());
                      Assert.assertEquals(user.getName(), 
          "byf"
          );
                      
                      List groupList 
          =
           session.createQuery(hql2).list();
                      TGroup group 
          = (TGroup)groupList.get(0
          );
                      System.out.println(
          "group name is " +
           group.getName());
                      System.out.println(
          "group user is " +
           group.getUser().getName());
                      Assert.assertEquals(group.getUser().getName(), 
          "byf"
          );            
                  } 
          catch
           (Exception e) {
                      e.printStackTrace();
                      Assert.fail(e.getMessage());
                  }
              }

          }

          posted on 2006-07-03 17:24 baim 閱讀(485) 評論(0)  編輯  收藏 所屬分類: 開源軟件框架

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

          導(dǎo)航

          常用鏈接

          隨筆分類(27)

          隨筆檔案(28)

          搜索

          最新評論

          主站蜘蛛池模板: 土默特右旗| 浙江省| 台东县| 拜城县| 进贤县| 雷州市| 麻栗坡县| 山阴县| 武清区| 龙岩市| 二连浩特市| 嘉禾县| 绥棱县| 滦南县| 宜宾市| 霍邱县| 金沙县| 东至县| 彝良县| 扬中市| 合江县| 天津市| 郧西县| 镇宁| 吴江市| 临洮县| 伊通| 仪征市| 六安市| 贵港市| 永德县| 海口市| 万盛区| 萨迦县| 永昌县| 兰西县| 喀什市| 镇平县| 同江市| 莎车县| 竹溪县|