復(fù)合主鍵,由多個(gè)字段組成主鍵,例如,使用firstname和lastname組成主鍵。

          可以通過兩種方式確定主鍵,一種是基于實(shí)體類的復(fù)合主鍵,另一種是通過定義主鍵類來實(shí)現(xiàn)。
          不管通過哪種方式,復(fù)合主鍵都需要實(shí)現(xiàn)equals方法和hashcode方法,以作為不同數(shù)據(jù)之間是別的標(biāo)志。

          一.基于實(shí)體類屬性的復(fù)合主鍵
          主鍵由實(shí)體類中的屬性組成。

          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初始化的時(shí)候會(huì)自動(dòng)調(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配置文件,與上面的方法對(duì)比,兩個(gè)差異
          ????????????
          //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í)行完畢的時(shí)候會(huì)自動(dòng)調(diào)用
          ?????*?一般用于釋放資源
          ?????
          */????
          ????
          protected?void?tearDown()?{
          ????????
          try?{
          ????????????session.close();????????
          ????????}?
          catch?(HibernateException?e)?{
          ????????????
          //?TODO:?handle?exception
          ????????????e.printStackTrace();
          ????????}????????
          ????}????
          ????
          ????
          /**
          ?????*?對(duì)象持久化測試(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();
          ????????????????}
          ????????????}
          ????????}
          ????}
          ????
          ????
          /**
          ?????*?對(duì)象讀取測試(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 閱讀(328) 評(píng)論(0)  編輯  收藏 所屬分類: ORM:Hibernate及其他
          主站蜘蛛池模板: 简阳市| 高陵县| 修水县| 布尔津县| 晋江市| 内乡县| 道孚县| 乌恰县| 靖远县| 岐山县| 自治县| 谷城县| 宜春市| 天长市| 晋江市| 札达县| 景德镇市| 金寨县| 历史| 明溪县| 清原| 义马市| 牙克石市| 宝兴县| 呼玛县| 福海县| 望江县| 象山县| 洛扎县| 阳原县| 五大连池市| 息烽县| 马公市| 定州市| 双鸭山市| 霍林郭勒市| 纳雍县| 华安县| 通化市| 定州市| 巴中市|