Mari kita ambil contoh sederhana. Katakanlah dua tabel bernama test
dan di customer
sana 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 test
dan 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_purchased
kunci utama adalah kunci komposit, jadi kita akan menggunakan <composite-id ...>...</composite-id>
tag pada hbm.xml
file pemetaan. Jadi PurchasedTest.hbm.xml
akan 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 PurchasedTestId
kelas) 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.