Hãy lấy một ví dụ đơn giản. Giả sử hai bảng được đặt tên test
và customer
được mô tả là:
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));
Có thêm một bảng để theo dõi test
s và 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));
Chúng ta có thể thấy rằng trong bảng tests_purchased
, khóa chính là khóa tổng hợp, vì vậy chúng ta sẽ sử dụng <composite-id ...>...</composite-id>
thẻ trong hbm.xml
tệp ánh xạ. Vì vậy, PurchasedTest.hbm.xml
sẽ trông như:
<?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>
Nhưng nó không kết thúc ở đây. Trong Hibernate, chúng tôi sử dụng session.load ( entityClass
, id_type_object
) để tìm và tải thực thể bằng khóa chính. Trong trường hợp các khóa tổng hợp, đối tượng ID phải là một lớp ID riêng (trong trường hợp trên là một PurchasedTestId
lớp) chỉ khai báo các thuộc tính khóa chính như bên dưới :
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;
}
}
Điểm quan trọng là chúng tôi cũng thực hiện hai chức năng hashCode()
và equals()
vì Hibernate dựa vào chúng.