內蒙古java團隊

          j2se,j2ee開發組
          posts - 139, comments - 212, trackbacks - 0, articles - 65
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          Hibernate一對一數據關聯(一)

          Posted on 2007-01-08 16:44 帥子 閱讀(386) 評論(0)  編輯  收藏 所屬分類: j2se技術專區

          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());
          ????????}
          ????}
          }
          主站蜘蛛池模板: 固镇县| 沐川县| 师宗县| 茶陵县| 洱源县| 曲水县| 九龙县| 富平县| 修文县| 济南市| 阿城市| 加查县| 将乐县| 新乐市| 安龙县| 衢州市| 锡林郭勒盟| 白山市| 马边| 禹城市| 化德县| 台北市| 集贤县| 邛崃市| 阜康市| 内黄县| 囊谦县| 佛学| 抚州市| 永川市| 二手房| 介休市| 仙游县| 宜章县| 合川市| 遂昌县| 通河县| 若羌县| 筠连县| 海宁市| 德安县|