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. }   

引用:http://hi.baidu.com/29163077/blog/item/3ab11944ed416149500ffe25.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值