2007-06-08

Hibernate复合主键处理(一)

关键字: 复合主键

复合主键,由多个字段组成主键,例如,使用一个用户的firstname和lastname组成主键。

可以通过两种方式确定主键,一种是基于实体类的复合主键,另一种是通过定义主键类来实现。
不管通过哪种方式,复合主键都需要实现equals方法和hashcode方法,以作为不同数据之间是别的标志。

一.基于实体类属性的复合主键
主键由实体类中的属性组成。

1.映射文件TUser.hbm.xml

xml 代码
  1. <?xml version="1.0"?>  
  2. <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"   
  3. "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">  
  4. <hibernate-mapping>  
  5.     <class name="cn.blogjava.start.TUser" table="t_user" catalog="sample">  
  6.         <composite-id>  
  7.             <key-property name="lastname" column="lastname" type="string" />  
  8.             <key-property name="firstname" column="firstname" type="string" />  
  9.         </composite-id>  
  10.   
  11.         <property name="age" type="integer" column="age"/>  
  12.     </class>  
  13. </hibernate-mapping>  

2.TUser.java

java 代码
  1. package cn.blogjava.start;   
  2.   
  3. import org.apache.commons.lang.builder.EqualsBuilder;   
  4. import org.apache.commons.lang.builder.HashCodeBuilder;   
  5.   
  6. /**  
  7.  * TUser generated by hbm2java  
  8.  */  
  9.   
  10. public class TUser implements java.io.Serializable {   
  11.   
  12.     // Fields       
  13.   
  14.     private Integer age;   
  15.   
  16.     private String firstname;   
  17.   
  18.     private String lastname;   
  19.   
  20.     public Integer getAge() {   
  21.         return age;   
  22.     }   
  23.   
  24.     public void setAge(Integer age) {   
  25.         this.age = age;   
  26.     }   
  27.   
  28.     public String getFirstname() {   
  29.         return firstname;   
  30.     }   
  31.   
  32.     public void setFirstname(String firstname) {   
  33.         this.firstname = firstname;   
  34.     }   
  35.   
  36.     public String getLastname() {   
  37.         return lastname;   
  38.     }   
  39.   
  40.     public void setLastname(String lastname) {   
  41.         this.lastname = lastname;   
  42.     }   
  43.        
  44.     public boolean equals(Object obj) {   
  45.         if(!(obj instanceof TUser)) {   
  46.             return false;   
  47.         }   
  48.            
  49.         TUser user = (TUser)obj;   
  50.         return new EqualsBuilder()          // EqualsBuilder 和HashCodeBuilder均为apache common lang包中的工具类   
  51.             .appendSuper(super.equals(obj))   
  52.             .append(this.lastname, user.lastname)   
  53.             .append(this.firstname, user.firstname)   
  54.             .isEquals();           
  55.     }   
  56.        
  57.     public int hasCode() {   
  58.         return new HashCodeBuilder(-528253723, -475504089)   
  59.             .appendSuper(super.hashCode())   
  60.             .append(this.lastname).append(this.firstname)   
  61.             .toHashCode();   
  62.                
  63.     }   
  64.   
  65. }  

3.测试类HibernateTest.java

java 代码
  1. package cn.blogjava.start;   
  2.   
  3. import junit.framework.Assert;   
  4. import junit.framework.TestCase;   
  5.   
  6. import org.hibernate.HibernateException;   
  7. import org.hibernate.Session;   
  8. import org.hibernate.SessionFactory;   
  9. import org.hibernate.Transaction;   
  10. import org.hibernate.cfg.Configuration;   
  11.   
  12.   
  13. public class HibernateTest extends TestCase {   
  14.        
  15.     Session session = null;   
  16.     /**  
  17.      * JUnit中的setUp方法在TestCase初始化的时候会自动调用  
  18.      * 一般用于初始化公用资源  
  19.      */  
  20.     protected void setUp() {   
  21.         try {   
  22.             /**  
  23.              * 可以采用hibernate.properties或者hibernate.cfg.xml  
  24.              * 配置文件的初始化代码  
  25.              *   
  26.              * 采用hibernate.properties  
  27.              * Configuration config = new Configuration();  
  28.              * config.addClass(TUser.class);  
  29.              */  
  30.                
  31.             //采用hibernate.cfg.xml配置文件,与上面的方法对比,两个差异   
  32.             //1.Configuration的初始化方式   
  33.             //2.xml   
  34.             Configuration config = new Configuration().configure();   
  35.             SessionFactory sessionFactory = config.buildSessionFactory();   
  36.             session = sessionFactory.openSession();   
  37.                
  38.         } catch (HibernateException e) {   
  39.             // TODO: handle exception   
  40.             e.printStackTrace();   
  41.         }           
  42.     }   
  43.   
  44.     /**  
  45.      * JUnit中的tearDown方法在TestCase执行完毕的时候会自动调用  
  46.      * 一般用于释放资源  
  47.      */       
  48.     protected void tearDown() {   
  49.         try {   
  50.             session.close();           
  51.         } catch (HibernateException e) {   
  52.             // TODO: handle exception   
  53.             e.printStackTrace();   
  54.         }           
  55.     }       
  56.        
  57.     /**  
  58.      * 对象持久化测试(Insert方法)  
  59.      */           
  60.     public void testInsert() {   
  61.         Transaction tran = null;   
  62.         try {   
  63.             tran = session.beginTransaction();   
  64.             TUser user = new TUser();   
  65.             user.setFirstname("bai");   
  66.             user.setLastname("yunfeng");   
  67.             user.setAge(26);   
  68.             session.save(user);   
  69.             session.flush();   
  70.             tran.commit();   
  71.         } catch (HibernateException e) {   
  72.             // TODO: handle exception   
  73.             e.printStackTrace();   
  74.             Assert.fail(e.getMessage());   
  75.             if(tran != null) {   
  76.                 try {   
  77.                     tran.rollback();   
  78.                 } catch (Exception e1) {   
  79.                     // TODO: handle exception   
  80.                     e1.printStackTrace();   
  81.                 }   
  82.             }   
  83.         }   
  84.     }   
  85.        
  86.     /**  
  87.      * 对象读取测试(Select方法)  
  88.      */               
  89.     public void testSelect(){   
  90.         TUser user = new TUser();   
  91.         user.setFirstname("bai");   
  92.         user.setLastname("yunfeng");   
  93.            
  94.         user = (TUser)session.load(TUser.class, user);   
  95.         Assert.assertEquals(user.getAge().intValue(), 26);   
  96.     }   
  97. }   



评论
发表评论

您还没有登录,请登录后发表评论