আসুন একটি সহজ উদাহরণ গ্রহণ করা যাক। আসুন আমরা দুটি টেবিলের নাম বলি test
এবং customer
সেখানে বর্ণিত আছে:
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));
আরও একটি টেবিল রয়েছে যা এর ট্র্যাক রাখে test
এবং 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));
আমরা দেখতে পাচ্ছি যে টেবিলে tests_purchased
প্রাথমিক কীটি একটি যৌগিক কী, তাই আমরা ম্যাপিং ফাইলটিতে <composite-id ...>...</composite-id>
ট্যাগটি ব্যবহার করব hbm.xml
। সুতরাং PurchasedTest.hbm.xml
চেহারা দেখতে হবে:
<?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>
তবে এখানেই শেষ হচ্ছে না। হাইবারনেটে আমরা প্রাথমিক কী ব্যবহার করে সত্তা খুঁজে পেতে এবং লোড করতে সেশন.লোড ( entityClass
, id_type_object
) ব্যবহার করি। সংমিশ্রিত কীগুলির ক্ষেত্রে, আইডি অবজেক্টটি পৃথক আইডি শ্রেণি হওয়া উচিত (উপরের ক্ষেত্রে কোনও PurchasedTestId
শ্রেণি) যা নীচের মতো প্রাথমিক কী বৈশিষ্ট্যগুলি ঘোষনা করে :
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;
}
}
গুরুত্বপূর্ণ পয়েন্ট যে আমরা দুটি ফাংশন বাস্তবায়ন হয় hashCode()
এবং equals()
যেমন হাইবারনেট তাদের উপর নির্ভর করে।