Hibernate復合主鍵的處理(一)

          復合主鍵,由多個字段組成主鍵,例如,使用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-06-29 21:58 baim 閱讀(1515) 評論(1)  編輯  收藏 所屬分類: 開源軟件框架

          評論

          # re: Hibernate復合主鍵的處理(一) 2006-10-22 21:51 hibernate初學者

          你好!
          我的代碼如下:
          User.java
          ...

          User.hbm.xml

          <?xml version="1.0" encoding="utf-8"?>
          <!DOCTYPE hibernate-mapping
          PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
          "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
          <hibernate-mapping>
          <class name="onlyfun.caterpillar.user" table="user" catalog="sample">

          <composite-id>
          <key-property name="name"
          column="name"
          type="java.lang.String"/>
          <key-property name="phone"
          column="phone"
          type="java.lang.String"/>
          </composite-id>
          <property name="age" column="age" type="java.lang.Integer"/>
          </class>

          </hibernate-mapping>

          HibernateTest.java
          ...

          build.xml:
          <project name="JNameIt" default="all">
          <target name="setProperties" description="setup the common properties">
          <property name="src.dir" value="src"/>
          <property name="images.dir" value="images"/>
          <property name="classes.dir" value="classes"/>
          <property name="lib.dir" value="lib"/>
          </target>

          <path id="1">
          <fileset dir="lib">
          <include name="**/*.jar"/>
          </fileset>
          </path>

          <path id="class.path">
          <!-- Include our own classes, of course -->
          <pathelement location="${classes.dir}" />
          <!-- Include jars in the project library directory -->
          <fileset dir="lib">
          <include name="*.jar"/>
          </fileset>
          <pathelement path ="${classpath}"/>

          </path>

          <taskdef name="schemaexport"
          classname="org.hibernate.tool.hbm2ddl.SchemaExportTask"
          classpathref="class.path"/>

          <schemaexport
          properties="classes/hibernate.properties"
          quiet="no"
          text="no"
          drop="no"
          delimiter=";"
          output="/schema-export.sql">
          <fileset dir="images">
          <include name="*.hbm.xml"/>
          </fileset>
          </schemaexport>


          <target name="clean" depends="setProperties" description="clean up the previous built files or dirs">
          <delete dir="${classes.dir}"/>
          <delete file="${jar.file}"/>
          </target>

          <target name="prepareDir" depends="setProperties" description="prepare necessary dirs">
          <mkdir dir="${classes.dir}"/>
          <mkdir dir="${lib.dir}"/>
          <!--
          <copy todir="${classes.dir}/images">
          <fileset dir="${images.dir}"/>
          </copy>
          -->
          </target>

          <target name="compile" depends="prepareDir" description="compile the source files">
          <javac srcdir="./src" destdir="${classes.dir}"
          classpathref="1"/>
          <copy todir="${classes.dir}/onlyfun/caterpillar">
          <fileset dir="${images.dir}"/>
          </copy>
          </target>

          <target name="run" depends="compile">

          <java fork="true" classname="onlyfun.caterpillar.HibernateTest" classpathref="1">
          <classpath path="${classes.dir}"/>
          </java>
          </target>

          <target name="all" depends="clean" description="perform all targets"/>
          </project>

          User.java,hibernate.java放在WEB-INF/SRC 下,User.hbm.xml放在WEB-INF/images下,build.xml放在WEB-INF,
          程序結構和你基本一樣,為什么用ant run 時出現:
          D:\Apache Software Foundation\Tomcat 5.5\webapps\HibernateTest\WEB-INF\build.xml
          :35: Schema text failed: component class not found: onlyfun.caterpillar.User的錯誤!好長時間都沒解決,網上也找不到類似的錯誤!
          謝謝你幫忙看一下!  回復  更多評論   

          <2006年10月>
          24252627282930
          1234567
          891011121314
          15161718192021
          22232425262728
          2930311234

          導航

          常用鏈接

          隨筆分類(27)

          隨筆檔案(28)

          搜索

          最新評論

          主站蜘蛛池模板: 虹口区| 梅州市| 芒康县| 潮安县| 兰坪| 阿拉善右旗| 沙湾县| 台东县| 当雄县| 曲麻莱县| 息烽县| 乐山市| 淮阳县| 建平县| 勐海县| 湘潭县| 顺平县| 阳山县| 武山县| 宿松县| 思茅市| 临漳县| 九江县| 大邑县| 弥勒县| 吐鲁番市| 柳河县| 商河县| 社旗县| 平昌县| 保山市| 金堂县| 思茅市| 峨眉山市| 璧山县| 仙游县| 商都县| 绥阳县| 宣恩县| 宣化县| 石渠县|