基于主鍵類的復(fù)合主鍵:
          方法:將主鍵字段從POJO類中提出了,生成一個主鍵類。
          可以將1中的例子加以改造,將firstname和lastname字段單獨(dú)提取到一個主鍵類中。

          1.
          配置文件TUser.hbm.xml
          composite-id節(jié)點(diǎn)的name指定了實(shí)體類中的主鍵類的屬性名。

          <?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?package="cn.blogjava.start">
          ????
          <class?name="TUser"?table="t_user"?catalog="sample">
          ????????
          <composite-id?name="userPK"?class="TUserPK">
          ????????????
          <key-property?name="lastname"?column="lastname"?type="string"?/>
          ????????????
          <key-property?name="firstname"?column="firstname"?type="string"?/>
          ????????
          </composite-id>

          ????????
          <property?name="age"?type="integer"?column="age"/>
          ????
          </class>
          </hibernate-mapping>

          2.POJO類
          package?cn.blogjava.start;

          /**
          ?*?TUser?generated?by?hbm2java
          ?
          */

          public?class?TUser?implements?java.io.Serializable?{

          ????
          //?Fields????

          ????
          private?Integer?age;
          ????
          ??? //配置文件composite-id的name屬性
          ????
          private?TUserPK?userPK;


          ????
          public?Integer?getAge()?{
          ????????
          return?age;
          ????}

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

          ????
          public?TUserPK?getUserPK()?{
          ????????
          return?userPK;
          ????}

          ????
          public?void?setUserPK(TUserPK?userPK)?{
          ????????
          this.userPK?=?userPK;
          ????}
          }

          3.主鍵類TUserPK.java
          package?cn.blogjava.start;

          import?java.io.Serializable;

          import?org.apache.commons.lang.builder.EqualsBuilder;
          import?org.apache.commons.lang.builder.HashCodeBuilder;

          public?class?TUserPK?implements?Serializable?{

          ????
          private?String?firstname;
          ????
          private?String?lastname;

          ????
          public?String?getFirstname()?{
          ????????
          return?firstname;
          ????}

          ????
          public?void?setFirstname(String?firstname)?{
          ????????
          this.firstname?=?firstname;
          ????}

          ????
          public?String?getLastname()?{
          ????????
          return?lastname;
          ????}

          ????
          public?void?setLastname(String?lastname)?{
          ????????
          this.lastname?=?lastname;
          ????}
          ????
          ????
          public?boolean?equals(Object?obj)?{
          ????????
          if(!(obj?instanceof?TUserPK))?{
          ????????????
          return?false;
          ????????}
          ????????
          ????????TUserPK?userPK?
          =?(TUserPK)obj;
          ????????
          return?new?EqualsBuilder()
          ????????????.appendSuper(
          super.equals(obj))
          ????????????.append(
          this.lastname,?userPK.lastname)
          ????????????.append(
          this.firstname,?userPK.firstname)
          ????????????.isEquals();????????
          ????}
          ????
          ????
          public?int?hasCode()?{
          ????????
          return?new?HashCodeBuilder(-528253723,?-475504089)
          ????????????.appendSuper(
          super.hashCode())
          ????????????.append(
          this.lastname).append(this.firstname)
          ????????????.toHashCode();????????????
          ????}
          }

          4.測試代碼HibernateTest.java
          package?cn.blogjava.start;

          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;
          ????
          /**
          ?????*?JUnit中的setUp方法在TestCase初始化的時候會自動調(diào)用
          ?????*?一般用于初始化公用資源
          ?????
          */
          ????
          protected?void?setUp()?{
          ????????
          try?{
          ????????????
          /**
          ?????????????*?可以采用hibernate.properties或者h(yuǎn)ibernate.cfg.xml
          ?????????????*?配置文件的初始化代碼
          ?????????????*?
          ?????????????*?采用hibernate.properties
          ?????????????*?Configuration?config?=?new?Configuration();
          ?????????????*?config.addClass(TUser.class);
          ?????????????
          */
          ????????????
          ????????????
          //采用hibernate.cfg.xml配置文件,與上面的方法對比,兩個差異
          ????????????
          //1.Configuration的初始化方式
          ????????????
          //2.xml
          ????????????Configuration?config?=?new?Configuration().configure();
          ????????????SessionFactory?sessionFactory?
          =?config.buildSessionFactory();
          ????????????session?
          =?sessionFactory.openSession();
          ????????????
          ????????}?
          catch?(HibernateException?e)?{
          ????????????
          //?TODO:?handle?exception
          ????????????e.printStackTrace();
          ????????}????????
          ????}

          ????
          /**
          ?????*?JUnit中的tearDown方法在TestCase執(zhí)行完畢的時候會自動調(diào)用
          ?????*?一般用于釋放資源
          ?????
          */????
          ????
          protected?void?tearDown()?{
          ????????
          try?{
          ????????????session.close();????????
          ????????}?
          catch?(HibernateException?e)?{
          ????????????
          //?TODO:?handle?exception
          ????????????e.printStackTrace();
          ????????}????????
          ????}????
          ????
          ????
          /**
          ?????*?對象持久化測試(Insert方法)
          ?????
          */????????
          ????
          public?void?testInsert()?{
          ????????Transaction?tran?
          =?null;
          ????????
          try?{
          ????????????tran?
          =?session.beginTransaction();
          ????????????TUser?user?
          =?new?TUser();
          ????????????TUserPK?userPK?
          =?new?TUserPK();
          ????????????userPK.setFirstname(
          "yu");
          ????????????userPK.setLastname(
          "yy");
          ????????????user.setUserPK(userPK);
          ????????????user.setAge(
          25);
          ????????????session.save(user);
          ????????????session.flush();
          ????????????tran.commit();
          ????????}?
          catch?(HibernateException?e)?{
          ????????????
          //?TODO:?handle?exception
          ????????????e.printStackTrace();
          ????????????Assert.fail(e.getMessage());
          ????????????
          if(tran?!=?null)?{
          ????????????????
          try?{
          ????????????????????tran.rollback();
          ????????????????}?
          catch?(Exception?e1)?{
          ????????????????????
          //?TODO:?handle?exception
          ????????????????????e1.printStackTrace();
          ????????????????}
          ????????????}
          ????????}
          ????}
          ????
          ????
          /**
          ?????*?對象讀取測試(Select方法)
          ?????
          */????????????
          ????
          public?void?testSelect(){
          ????????TUserPK?userPK?
          =?new?TUserPK();
          ????????userPK.setFirstname(
          "yu"
          );
          ????????userPK.setLastname(
          "yy"
          );
          ????????
          ????????TUser?user?
          =?(TUser)session.load(TUser.class
          ,?userPK);
          ????????Assert.assertEquals(user.getAge().intValue(),?
          25);
          ????}
          }
          posted on 2006-07-05 14:50 knowhow 閱讀(267) 評論(0)  編輯  收藏 所屬分類: ORM:Hibernate及其他
          主站蜘蛛池模板: 揭阳市| 荆门市| 祥云县| 灵武市| 威海市| 阿合奇县| 通山县| 皋兰县| 平昌县| 天祝| 武鸣县| 长兴县| 济宁市| 龙井市| 巢湖市| 鄂温| 都匀市| 孟州市| 手游| 登封市| 沙田区| 连云港市| 伊吾县| 法库县| 长寿区| 图木舒克市| 平舆县| 兴仁县| 阆中市| 普格县| 衡山县| 锡林郭勒盟| 阿合奇县| 龙山县| 新晃| 大埔区| 健康| 澳门| 西华县| 和平县| 那曲县|