復合主鍵,由多個字段組成主鍵,例如,使用firstname和lastname組成主鍵。

          可以通過兩種方式確定主鍵,一種是基于實體類的復合主鍵,另一種是通過定義主鍵類來實現。
          不管通過哪種方式,復合主鍵都需要實現equals方法和hashcode方法,以作為不同數據之間是別的標志。

          一.基于實體類屬性的復合主鍵
          主鍵由實體類中的屬性組成。

          1.
          配置文件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">
          ????????
          <composite-id>
          ????????????
          <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.
          TUser.java
          package?cn.blogjava.start;

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

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

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

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

          ????
          private?Integer?age;

          ????
          private?String?firstname;

          ????
          private?String?lastname;

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

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

          ????
          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
          ?TUser))?{
          ????????????
          return?false
          ;
          ????????}
          ????????
          ????????TUser?user?
          =
          ?(TUser)obj;
          ????????
          return?new
          ?EqualsBuilder()????????? // EqualsBuilder 和HashCodeBuilder均為apache common lang包中的工具類
          ????????????.appendSuper(
          super
          .equals(obj))
          ????????????.append(
          this
          .lastname,?user.lastname)
          ????????????.append(
          this
          .firstname,?user.firstname)
          ????????????.isEquals();????????
          ????}
          ????
          ????
          public?int
          ?hasCode()?{
          ????????
          return?new?HashCodeBuilder(-528253723,?-475504089
          )
          ????????????.appendSuper(
          super
          .hashCode())
          ????????????.append(
          this.lastname).append(this
          .firstname)
          ????????????.toHashCode();
          ????????????
          ????}


          }

          3.
          測試類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初始化的時候會自動調用
          ?????*?一般用于初始化公用資源
          ?????
          */
          ????
          protected?void?setUp()?{
          ????????
          try?{
          ????????????
          /**
          ?????????????*?可以采用hibernate.properties或者hibernate.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執行完畢的時候會自動調用
          ?????*?一般用于釋放資源
          ?????
          */????
          ????
          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();
          ????????????user.setFirstname(
          "bai");
          ????????????user.setLastname(
          "yunfeng");
          ????????????user.setAge(
          26);
          ????????????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(){
          ????????TUser?user?
          =?new?TUser();
          ????????user.setFirstname(
          "bai");
          ????????user.setLastname(
          "yunfeng");
          ????????
          ????????user?
          =?(TUser)session.load(TUser.class,?user);
          ????????Assert.assertEquals(user.getAge().intValue(),?
          26
          );
          ????}
          }
          posted on 2006-07-05 14:48 knowhow 閱讀(329) 評論(0)  編輯  收藏 所屬分類: ORM:Hibernate及其他
          主站蜘蛛池模板: 连城县| 措勤县| 达日县| 莱芜市| 安仁县| 莱阳市| 定日县| 信丰县| 巴东县| 禄丰县| 大姚县| 乌鲁木齐县| 葵青区| 中阳县| 内丘县| 阜新| 龙胜| 中卫市| 巍山| 武鸣县| 齐河县| 安平县| 汉阴县| 江西省| 共和县| 吉林省| 独山县| 二连浩特市| 融水| 嵊州市| 梓潼县| 乌苏市| 滨州市| 江北区| 合水县| 赞皇县| 图们市| 醴陵市| 营山县| 射洪县| 郧西县|