Mari kita ambil contoh sederhana. Katakanlah dua tabel bernama testdan di customersana digambarkan sebagai:
create table test(
test_id int(11) not null auto_increment,
primary key(test_id));
create table customer(
customer_id int(11) not null auto_increment,
name varchar(50) not null,
primary key(customer_id));
Satu lagi meja ada yang melacak testdan customer:
create table tests_purchased(
customer_id int(11) not null,
test_id int(11) not null,
created_date datetime not null,
primary key(customer_id, test_id));
Kita dapat melihat bahwa dalam tabel tests_purchasedkunci utama adalah kunci komposit, jadi kita akan menggunakan <composite-id ...>...</composite-id>tag pada hbm.xmlfile pemetaan. Jadi PurchasedTest.hbm.xmlakan terlihat seperti:
<?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="entities.PurchasedTest" table="tests_purchased">
<composite-id name="purchasedTestId">
<key-property name="testId" column="TEST_ID" />
<key-property name="customerId" column="CUSTOMER_ID" />
</composite-id>
<property name="purchaseDate" type="timestamp">
<column name="created_date" />
</property>
</class>
</hibernate-mapping>
Tapi itu tidak berakhir di sini. Di Hibernate kami menggunakan session.load ( entityClass, id_type_object) untuk menemukan dan memuat entitas menggunakan kunci utama. Dalam kasus kunci komposit, objek ID harus kelas ID yang terpisah (dalam kasus di atas PurchasedTestIdkelas) yang hanya menyatakan atribut kunci utama seperti di bawah ini :
import java.io.Serializable;
public class PurchasedTestId implements Serializable {
private Long testId;
private Long customerId;
// an easy initializing constructor
public PurchasedTestId(Long testId, Long customerId) {
this.testId = testId;
this.customerId = customerId;
}
public Long getTestId() {
return testId;
}
public void setTestId(Long testId) {
this.testId = testId;
}
public Long getCustomerId() {
return customerId;
}
public void setCustomerId(Long customerId) {
this.customerId = customerId;
}
@Override
public boolean equals(Object arg0) {
if(arg0 == null) return false;
if(!(arg0 instanceof PurchasedTestId)) return false;
PurchasedTestId arg1 = (PurchasedTestId) arg0;
return (this.testId.longValue() == arg1.getTestId().longValue()) &&
(this.customerId.longValue() == arg1.getCustomerId().longValue());
}
@Override
public int hashCode() {
int hsCode;
hsCode = testId.hashCode();
hsCode = 19 * hsCode+ customerId.hashCode();
return hsCode;
}
}
Poin penting adalah bahwa kami juga mengimplementasikan dua fungsi hashCode()dan equals()sebagai Hibernate bergantung padanya.