Hibernate復合主鍵的處理(一)
復合主鍵,由多個字段組成主鍵,例如,使用firstname和lastname組成主鍵。可以通過兩種方式確定主鍵,一種是基于實體類的復合主鍵,另一種是通過定義主鍵類來實現。
不管通過哪種方式,復合主鍵都需要實現equals方法和hashcode方法,以作為不同數據之間是別的標志。
一.基于實體類屬性的復合主鍵
主鍵由實體類中的屬性組成。
1.
配置文件TUser.hbm.xml














2.
TUser.java
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
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) 編輯 收藏 所屬分類: 開源軟件框架