Báo cáo đề tài tìm hiểu Hibernate-phần 1
Báo cáo tìm hiểu đề tài – mã đề tài: SE04.
HIBERNATE – phần 1
I. Component mapping.
1. Component mapping là gi?
Component không phải là một tham chiếu thực thể, nó giống như một
đối tượng được chứa trong một đối tượng cha khác. Nó không có id và
chỉ tồn tại khi thực thể cha tồn tại. Component cho phép bạn nhóm một
vài cột vào trong một đối tượng.
Ta xét ví dụ:
Ta quan sát, bảng AccountOwner gồm các thuộc tính:
- accountOwner
- lastname
- firstname
- socialSecuritynumber
- streeAddress
- city
- state
- zip-code
1041349 - 1041397 - 1041444 Page 1
Báo cáo đề tài tìm hiểu Hibernate-phần 1
- home-phone
- cell-phone
để tổ chức cơ sở dữ liệu tốt hơn, người ta sẽ tách các thuộc tính :
StreetAddress, city, zipcode ra thành một đơn vị dữ liệu riêng, việc này
giúp cơ sở dữ liệu của chúng ta tường minh hơn, rõ ràng hơn và việc
truy xuất đơn giản hơn.
Các thuộc tính sau khi được tách ra sẽ thuộc về 1 đơn vị dữ liệu có tên
là Address.
Ta có nhận xét như sau:
- Address được chứa trong AccountOwner
- Address chỉ tồn tại khi AccountOwner tồn tại
Nói một cách khác, Address chính là một component.
2. Using Component - sử dụng component
Việc ánh xạ từ bảng dữ liệu cho component là hết sức đơn giản. để dễ
hiểu hơn, ta xét việc ánh xạ từ bảng AccountOwner cho component
address như sau:
1041349 - 1041397 - 1041444 Page 2
Báo cáo đề tài tìm hiểu Hibernate-phần 1
Cú pháp của một component như sau:
Bên trong thẻ component là thẻ parent khai báo tên của Cha.
Tiếp theo là các thẻ property khai báo các thuộc tính bên trong của
component.
3. Nested Components - Component lồng nhau:
Là hiện tượng bên trong component cho có chứa các component con
bên trong.
Xét ví dụ sau:
1041349 - 1041397 - 1041444 Page 3
Báo cáo đề tài tìm hiểu Hibernate-phần 1
Thuộc tính zipcode được chia làm hai phần: Zip và plus4. Ví du: 12222-
1234.
Như vậy để thuận tiện, người ta đưa zipcode vào một component như
hình sau:
Ta thấy được rằng bên trong bảng AccountOwner có component
Address và bên trong Address có component Zipcode. Đây là một ví dụ
điển hình cho việc thể hiện Nested component.
Ta biểu diễn file mapping như sau:
4. Mapping a component – Tham chiếu trong component
1041349 - 1041397 - 1041444 Page 4
Báo cáo đề tài tìm hiểu Hibernate-phần 1
Một component có thể có tham chiếu tới đối tượng <parent>.
5. Collection of component
6. Component as Entity ID
II. Collection Mapping
1. Mapping collection of value
Tập hợp các giá trị: là danh sách lưu trữ các giá trị, các kiểu tham trị(String,
integer,double…) nhưng không phải là đối tượng cố định.
1041349 - 1041397 - 1041444 Page 5
Báo cáo đề tài tìm hiểu Hibernate-phần 1
Mapping collection of value là sự tập hợp của các giá trị.
Để định nghĩa tập hợp, ta sử dụng thẻ <bag>, 1 thẻ tập hợp đơn giản trong
hibernat.
Thẻ <bag> là đối tượng không theo thứ tự, mỗi cái có thể chứa các phần tử
lặp lại.
Ví dụ về thẻ <bag>:
2. Collection types in hibernate
Ngoài thẻ <bag> , còn có nhiều tập hợp khác trong hibernate, mỗi loại có
những ưu điểm và đặc điểm riêng.
2.1. Association as <bag>
Thẻ <bag> là một tập hợp mà trong đó, nó có thể chứa các phần tử
tập hợp.Thẻ <bag> thực hiện thông qua Collection hoặc List.
Thẻ <bag> yêu cầu phải có cột giá trị, có thể sắp xếp tăng giảm.
Thẻ <bag> được sử dụng trong quan hệ one-many hoặc many-one.
Vi dụ về khai báo thẻ <bag>:
2.2. Association as <Set>
Thẻ <set>tương tự như thẻ <bag> nhưng không chưa các phần tử lặp
lại.
Có thể có thứ tự hoặc không có thứ tự, nhưng đòi hỏi phải có cột giá
trị.
Thẻ <Set> có thể tùy chọn sắp xếp : unsort hoặc natural.
Thẻ <Set> được sử dụng trong quan hệ one-many hoặc many-one.
Ví dụ về khai báo thẻ <Set>:
2.3. Association as <List>
1041349 - 1041397 - 1041444 Page 6
Báo cáo đề tài tìm hiểu Hibernate-phần 1
Thẻ <List> là tập hợp chỉ mục được kết nối, chúng ta có thể giữ lại
thứ tự của list khi nó kết nối lại, do đó nó cần phải có một chỉ mục
của cột mà nó tham chiếu tới trong bảng cơ sở dữ liệu.
<List>khác <Bag> là <List> có kết nối chỉ mục phần tử.
Thẻ <List> được sử dụng trong quan hệ one-many hoặc many-one.
Ví dụ về khai báo thẻ <List> :
2.4. Association as <Array>
Thẻ <Array> tương đối giống thẻ <List>, có một điểm khác biệt đó
là thẻ <Array> tương ứng với kiểu mảng trong java, còn thẻ <List
>tương ứng với kiểu List.
Do đó, khi mảng không thể tự động tăng giảm được kích thước,
người ta thường sử dụng thẻ<List>.
Thẻ <Array> được sử dụng trong quan hệ one-many hoặc many-one
Ví dụ về khai báo thẻ <Array>:
2.5. Association as Map
Thẻ <map> gần giống như thẻ <List> nhưng thẻ <map> sử dụng
khóa có kiểu bất kỳ để làm chỉ mục chứ không sử dụng kiểu int như
thẻ <List>.
Thẻ <map> có thể có thứ tự hoặc không có thứ tự nhưng đòi hỏi
phải có khóa và giá trị cột.
Thẻ <map> được sử dụng trong quan hệ one-many hoặc many-one
Ví dụ về khai báo thẻ <map>:
1041349 - 1041397 - 1041444 Page 7
Báo cáo đề tài tìm hiểu Hibernate-phần 1
2.6. Association as idbag
Thẻ <idbag> sử dụng tương tự như thẻ <bag> nhưng nó thêm khả
năng nhận dạng thêm các key thay thế.
Không thể sử dụng thẻ<idbag > cho cả 2 mặt của quan hệ(many-
many).
Thẻ <idbag> được sử dụng trong quan hệ many-many.
Ví dụ về khai báo thẻ <idbag>:
3. Sorting the collection.
3.1. Sorting database.
Khi tập hợp quá lớn, để sắp xếp thuận lợi nhất, ta sắp xếp tập hợp
trong cơ sở dữ liệu.
Để sắp xếp, ta sử dụng từ khóa orderby, với 2 giá trị có thể lựa
chọn, đó là asc (sắp tăng) và desc(sắp giảm). Chúng ta cần chú ý
một điều là thuộc tính orderby không phải là một thuộc tính trong
hibernate mà chỉ là một cột trong cơ sở dữ liệu.
3.2. Sorting memory
Khi kích thước không lớn, ta có thể sử dụng phương pháp sắp xếp
này. Và điều đặc biệt của việc sắp xếp này đó là chỉ có thẻ <map>
và thẻ <set> là có thể sử dụng được.
Để sắp tăng ta khai báo từ khóa sort với ba giá trị là natural,
unsort, hoặc my.custom.mycomparator.
III. Inheritance Mapping.(Tính kế thừa trong Hibernate)
Đặc tính của Kế thừa (Inheritance)
- Dễ sử dụng trong ngôn ngữ hướng đói tượng(object oriented language).
Java: sử dụng từ khóa “extend” hay “implement”.
- Nhưng lại không dễ sử dụng trong dữ liệu quan hệ.
1041349 - 1041397 - 1041444 Page 8
Báo cáo đề tài tìm hiểu Hibernate-phần 1
Các bảng không thể “extend” từ các bảng khác được.
Vấn đề “Impedence missmatch”.
Để hiểu rõ vấn đề Impedence missmatch ta xem ví dụ sau :
Ta có một mô hình dữ liệu có 2 table: Customers và Accounts.
Như vậy chúng ta sẽ tạo mô hình object với 2 class tương ứng với 2 table này:
Nhưng mô hình object trên thiếu tính linh động và khả năng mở rộng, do đó
chúng ta nên thiết kế lại để thêm inheritance và abstraction, làm mô hình gần hơn
với thực tế:
Chúng ta có thể thấy rõ ràng sự không đối xứng (mismatch) giữa mô hình
dữ liệu và mô hình object trong trường hợp này. Trong database, hoàn toàn chấp
nhận được khi chứa toàn bộ thông tin của Person và PersonName trong một table
Customers. Nhưng để tăng tốc độ thực thi, việc bảo trì và sự linh hoạt; một object
lớn nên được chia thành nhiều object nhỏ.
Vậy phải giải quyết các vấn đề này như thế nào?
Trong Hibernate ta có 4 cách giải quyết :
1. Table per class hierachy.
2. Table per subclass.
3. Table per concrete class.
4. Đa hình tiềm ẩn.
Xét ví dụ sau đây:
1041349 - 1041397 - 1041444 Page 9
Báo cáo đề tài tìm hiểu Hibernate-phần 1
Ta có 3 lớp : Person, Teacher và Student. Trong đó Person là lớp cha và Teacher ,
Student kế thừa từ lớp cha này.
Sơ đồ lớp:
Table per class hierachy.
Với phương pháp nà ta sẽ ánh xạ tất cả các lớp vào duy nhất 1 bảng. tất cả các
thuộc tính của các lớp sẽ hiển thị trong bảng như là một colum, trong đó sẽ có 1
cột chứa các tên lớp con mà ta gọi là “Discriminator” để phân biệt các lớp với
nhau.
Theo bảng Person trên ta thấy Discriminator lúc này là cột PERSON_TYPE
chứa 2 trường dữ liệu là Sutent và Teacher. Đây là tên của hai lớp con kế thừa từ
lớp cha Person.
Bảng PERSON chứa tất cả các thuộc tính (attributes ) cùa các lớp Person, Teacher
và Student như là các colunms của nó.
Mapping cho Table class hierachy:
Person.hbm.xml
<hibernate-mapping>
<class name=”Person” table=”PERSON”>
<id name=”id” column=”ID”>
<generator class=”increment”/>
</id>
<discriminator column=”PERSON_TYPE” type=”string”/>
<property name= “name” column=”NAME”/>
</class>
</hibernate-mapping>
1041349 - 1041397 - 1041444 Page 10
Báo cáo đề tài tìm hiểu Hibernate-phần 1
Bảng Person có chứa column PERSON_TYPE. Column này được maped (ánh
xạ) bằng cách sử dụng thẻ XML <discriminator> .
Discriminator không phải là thuộc tính của bất kỳ java class nào, nó chỉ là một cột
được dùng chung giữa databse và Hibernate.
Mapping file cho hai lớp Student và Teacher.
Student.hbm.xml
===============
<hibernate-mapping>
<subclass name=”Student” extends=Person” discriminator-value=”Student”>
<property name= “branch” column=”BRANCH”/>
</subclass>
</hibernate-mapping>
Teacher.hbm.xml
===============
<hibernate-mapping>
<subclass name=”Teacher” extends=Person” discriminator-value=”Teacher”>
<property name= “department” column=”DEPARTMENT”/>
</subclass>
</hibernate-mapping>
Ưu điểm :
Cách tiếp cận này thì đơn giản và hiệu quả vì tất cả các dữ liệu thì đều nằm trong
cùng một bảng nên việc kết bảng lúc này thì không cần thiết.
Nhược điểm :
không thể khai báo cho các subclass ràng buộc NOT NULL.
Table per concrete class
Một lớp con là một bảng riêng biệt.
1041349 - 1041397 - 1041444 Page 11
Báo cáo đề tài tìm hiểu Hibernate-phần 1
Bây giờ ta mapping bằng <union-subclass>
<union-subclass> được sử dụng cho mỗi subclass trong mapping file.
<class name="Person">
<id name="id" type="long" column="ID">
<generator class="sequence"/>
</id>
<property name="name" column="NAME"/>
<union-subclass name="Student" table="STUDENT">
<property name="branch" column="BRANCH"/>
</union-subclass>
<union-subclass name="Teacher" table="TEACHER ">
<property name="branch" column="BRANCH"/>
</union-subclass>
</class>
Table per subclass:
Ta tạo ra ba bảng riêng biệt cho 3 lớp.
1041349 - 1041397 - 1041444 Page 12
Báo cáo đề tài tìm hiểu Hibernate-phần 1
<joined-subclass> được sử dụng cho mỗi subclass torng mapping file.
<class name="Person" table="PERSON">
<id name="id” column="ID">
<generator class="native"/>
</id>
<property name="name" column="NAME"/>
<joined-subclass name="Teacher" table="TEACHER">
<key column="ID"/>
<property name="department" column="DEPARTMENT"/>
</joined-subclass>
<joined-subclass name="Student" table="STUDENT">
<key column="ID"/>
<property name="branch" column="BRANCH"/>
</joined-subclass>
</class>
Trong trường hợp này ta sẽ có 3 bảng. Và khóa chính của các subclass trùng với
khóa chính của lớp cha( Ở đây khóa chính của cả 3 bảng là ID).
IV. Working With Object
1. vòng đời của một object trong Hibernate.
Các objects mà Hibernate quản lý phải luôn luôn ở một trong bốn trạng
thái(STATE) sau đây:
1. Transient.
2. Persisten.
1041349 - 1041397 - 1041444 Page 13
Báo cáo đề tài tìm hiểu Hibernate-phần 1
3. Removed.
4. Detatched.
Các Objects muốn chuyển từ trạng thái này sang trạng thái khác sẽ được
thực hiện thông qua các phương thức khác nhau.
Transient State_ Trạng thái tạm thời.
Tất cả các đối tượng khi mới khởi tạo đều ở trạng thái Transient.
• Account account = new Account();
Đối tượng account vừa được ta khởi tạo cho nên account bây giờ
đang ở trạng thái tạm thời mà thôi.
Đặc điểm của các đối tượng khi đang ở trạng thái Transient State:
Hibernate không thể nhận ra các đối tượng này .
Các đối tượng này không hề có bất kỳ liên quan đến các dữ liệu
có trong database.
Do không có giá trị cho accountID.(accountID là khóa chính.)
Khi đối tượng mới khởi tạo này không liên quan đến bất kỳ đối
tượng nào khác thì nó sẽ được hủy bởi cơ chế thu gom
rác(garbage collected).
PERSISTENT STATE_Trạng thái ổn định .
Với các đối tượng ở trạng thái này thì nó có các đặc điểm sau:
Được nhận biết và chịu sự quản lý của Hibernate.
Có một database id
• là một đối tượng được tồn tại bằng việc lấy lên từ database.
• Hay là một đối tượng đang ở trạng thái tạm thời (Transient
State) nhưng đã được lưu.
• Đây là trạng thái duy nhất mà các objecs được lưu vào database.
Nói cách khác khi một object muốn được lưu vào databse điều
đầu tiên là nó phải đang ở trạng thái Persisent.
• Việc chỉnh sửa, cập nhật trên một đối tượng đang ở trang thái
khác trạng thái này sẽ KHÔNG được lưu lại vào database .
• Trong khi đó khi ta làm việc với một đối tượng đang ở trạng thái
Persistent thì việc thay đổi của đối tượng này sẽ được tự động
cập nhật xuống databse mà không càn gọi bất kỳ phương thức
Session Persistent nào.
1041349 - 1041397 - 1041444 Page 14
Báo cáo đề tài tìm hiểu Hibernate-phần 1
các đối tượng được tạo ra ổn định , lâu bền thông qua các Hibernate
session:
• session.save(account);
• session.update(account);
• session.lock(account);
• session.merge(account);
Ta xem ví dụ sau đây:
Đầu tiên ta thấy khi mới khởi tạo đối tượng account thông qua phương
thức new Account() thì accoount lúc này đang ở trạng thái tạm thời mà
thôi(Transient state). Hibernate không làm việc trên account đơn giản vì nó không
hiểu account là gì.
Vậy để Hibernate hiểu và làm việc trên account ta phải chuyển nó về trạng
thái Persistent thông qua session . Lúc này việc cập nhật, thay đổi ta làm trên
account sẽ được Hibernate tự động lưu xuống databse.
REMOVE STATE.
Xét đối tượng đang ở trạng thái Persistent.
1041349 - 1041397 - 1041444 Page 15
Báo cáo đề tài tìm hiểu Hibernate-phần 1
Remove state là trạng thái mà mà đối tượng này đã bị delete ra khỏi
database.
• session.delete(account);
Lúc này mọi thay đổi trên đối tượng này sẽ không còn được lưu xuống
database nữa. Cơ chế thu gom rác của Hibernate sẽ dọn dẹp đối tượng này bởi vì
Hibernate không cho phép tồn tại một đối tượng rỗng.(Đối tượng không lưu trử
bất kỳ thông tin gì.)
Xét ví dụ sau đây:
Đẩu tiên khởi tạo một phiên làm việc cho Hibernate(session)
Sau đó ta lấy lên một account với id = 1 . Lúc này account được trả ra trong
trạng thái Persistent.
Tiếp đó ta tiến hành delete account đi.
Lúc này mọi chỉnh sửa trên account sẽ bị Hibernate lờ đi vì account hiện tại
đang ở trạng thái Remove.
Chú ý rằng trong Java thì đối tượng account lúc này sẽ vẫn còn alive, tức
là ta có thể gán giá trị cho nó, làm việc với nó như một đối tượng bình thường dù
đã bị delete ra khỏi databse và đối tượng này sẽ alive cho đến khi nào lập trình
viên set nó null hoặc hủy nó đi.
DETACHED STATE
1041349 - 1041397 - 1041444 Page 16
Báo cáo đề tài tìm hiểu Hibernate-phần 1
Một đối tượng persistent sẽ vẫn còn được tham chiếu sau khi session của nó
đã đóng lại.
Phương thức session.close() thay đổi trạng thái của đối tượng từ Persistent sang
Detached.
Đặc tính:
Đối tượng lúc này vẫn đại diện cho hàng dữ liệu mà nó đang mang trong
databse.
Nhưng không thuộc sự quản lý của Hibernate nữa.
Lúc này mọi sự thay đổi trên detached object sẽ không còn được lưu xuống
database .
Có thể redetached ( kết nối lại) để trả về trạng thái Persistent cho đối
tượng và gây ra hiện tượng là lưu lại trạng thái của chính nó xuống database.
update();
merge();
lock(); // ta retach() nhưng sẽ không lưu trạng thái .
Xét ví dụ sau :
1041349 - 1041397 - 1041444 Page 17
Báo cáo đề tài tìm hiểu Hibernate-phần 1
Đầu tiên khởi tạo session1.
Tạo đối tượng account thông qua session1.
Sau đó đóng session1 lại.
Lúc này account đang ở trạng thái Detached State.
Bây giờ ta muốn trả lại trạng thái Persistent cho nó thì ta re-attach lại thông qua
việc mở ra một phiên làm việc mới tức là tạo ra session2.
HIBERNATE LIFECYCLE
V. Association Mapping
1. Giới thiệu
Trình bày các mối quan hệ thường là điều khó khăn nhất để thể hiện một
cách chính xác. Trong phần này, chúng ta xem xét một số trường hợp thông
dụng, bắt đầu với mối quan hệ một chiều và sau đó là hai chiều.
2. Các mối quan hệ thông dụng
2.1. Quan hệ một chiều (unidirectional association):
a. Nhiều – Một : Quan hệ Nhiều – Một là loại quan hệ phổ biến
nhất trong các mối quan hệ.
Mỗi một căn nhà (có địa chỉ) thuộc về một cá nhân, mỗi cá nhân
có thể có nhiều căn nhà. Mối quan hệ hướng từ căn nhà ( có địa
chỉ ) đến cá nhân là mối quan hệ Nhiều – Một.
1041349 - 1041397 - 1041444 Page 18
Báo cáo đề tài tìm hiểu Hibernate-phần 1
<class name="Person">
<id name="id" column="personId">
<generator class="native"/>
</id>
<many-to-one name="address"
column="addressId"
not-null="true"/>
</class>
<class name="Address">
<id name="id" column="addressId">
<generator class="native"/>
</id>
b. Một – Một : Mối quan hệ một – một giống như mối quan hệ
Nhiều – Nhiều nhưng có them thuộc tính Unique = true
<class name="Person">
<id name="id" column="personId">
<generator class="native"/>
</id>
<many-to-one name="address"
column="addressId"
unique="true"
not-null="true"/>
</class>
<class name="Address">
<id name="id" column="addressId">
1041349 - 1041397 - 1041444 Page 19
Báo cáo đề tài tìm hiểu Hibernate-phần 1
<generator class="native"/>
</id>
Hoặc ta có thể sử dụng cách khác dưới đây
<class name="Person">
<id name="id" column="personId">
<generator class="native"/>
</id>
</class>
<class name="Address">
<id name="id" column="personId">
<generator class="foreign">
<param name="property">person</param>
</generator>
</id>
<one-to-one name="person" constrained="true"/>
c. Một – Nhiều : Mối quan hệ Một – Nhiều là một mối quan hệ
không thông dụng và ít được giới thiệu.
<class name="Person">
<id name="id" column="personId">
<generator class="native"/>
</id>
<set name="addresses">
<key column="personId"
not-null="true"/>
<one-to-many class="Address"/>
1041349 - 1041397 - 1041444 Page 20
Báo cáo đề tài tìm hiểu Hibernate-phần 1
</set>
</class>
<class name="Address">
<id name="id" column="addressId">
<generator class="native"/>
</id>
Bạn nên thay thế dùng một bảng tham gia trong trường hợp này.
2.2. Quan hệ một chiều có dùng bảng tham gia :
a. Một - Nhiều : Mối quan hệ Một - Nhiều với bảng tham gia là ưu
tiên lựa chọn. Chỉ rõ unique = true đã chuyển từ quan hệ Nhiều –
Nhiều sang quan hệ Một - Nhiều.
<class name="Person">
<id name="id" column="personId">
<generator class="native"/>
</id>
<set name="addresses" table="PersonAddress">// bảng tham gia
<key column="personId"/>
<many-to-many column="addressId"
unique="true"
class="Address"/>
</set>
</class>
<class name="Address">
<id name="id" column="addressId">
1041349 - 1041397 - 1041444 Page 21
Báo cáo đề tài tìm hiểu Hibernate-phần 1
<generator class="native"/>
</id>
b. Nhiều – Một : Quan hệ Nhiều – Một với một bảng tham gia là
mối quan hệ phổ biến khi mối quan hệ là tuỳ chọn.
<class name="Person">
<id name="id" column="personId">
<generator class="native"/>
</id>
<join table="PersonAddress"
optional="true">// tuỳ chọn
<key column="personId" unique="true"/>
<many-to-one name="address"
column="addressId"
not-null="true"/>
</join>
</class>
<class name="Address">
<id name="id" column="addressId">
<generator class="native"/>
</id>
c. Một – Một : Quan hệ Một – Một với một bảng tham gia là quan
hệ có thể sử dụng nhưng chi trong các trường hợp cực kỳ đặc
biệt.
<class name="Person">
1041349 - 1041397 - 1041444 Page 22
Báo cáo đề tài tìm hiểu Hibernate-phần 1
<id name="id" column="personId">
<generator class="native"/>
</id>
<join table="PersonAddress"
optional="true">
<key column="personId"
unique="true"/>
<many-to-one name="address"
column="addressId"
not-null="true"
unique="true"/>
</join>
</class>
<class name="Address">
<id name="id" column="addressId">
<generator class="native"/>
</id>
d. Nhiều – Nhiều : Quan hệ Nhiều - Nhiều có bảng tham gia là một
điển hình trong các mối quan hệ
<class name="Person">
<id name="id" column="personId">
<generator class="native"/>
</id>
<set name="addresses" table="PersonAddress">
<key column="personId"/>
<many-to-many column="addressId"
1041349 - 1041397 - 1041444 Page 23
Báo cáo đề tài tìm hiểu Hibernate-phần 1
class="Address"/>
</set>
</class>
<class name="Address">
<id name="id" column="addressId">
<generator class="native"/>
</id>
2.3. Quan hệ hai chiều (bidirectional association) :
a. Một – Nhiều / Nhiều – Một : Quan hệ hai chiều Nhiều – Một là
quan hệ phổ biến nhất.
<class name="Person">
<id name="id" column="personId">
<generator class="native"/>
</id>
<many-to-one name="address"
column="addressId"
not-null="true"/>
</class>
<class name="Address">
<id name="id" column="addressId">
<generator class="native"/>
</id>
<set name="people" inverse="true">
<key column="addressId"/>
1041349 - 1041397 - 1041444 Page 24
Báo cáo đề tài tìm hiểu Hibernate-phần 1
<one-to-many class="Person"/>
</set>
Nếu bạn sử dụng một danh sách, hoặc lập chỉ mục thì thiết lập các cột quan
trọng với khoá ngoại không phải null. Hibernate sẽ quản lý các liên kết từ
các phía để duy trì chỉ số của mỗi phần tử với thiết lập update = false và
insert = false
<class name="Person">
<id name="id"/>
<many-to-one name="address"
column="addressId"
not-null="true"
insert="false"
update="false"/>
</class>
<class name="Address">
<id name="id"/>
<list name="people">
<key column="addressId" not-null="true"/>
<list-index column="peopleIdx"/>
<one-to-many class="Person"/>
</list>
b. Một – Một : Quan hệ Một – Một hai hướng là quan hệ phổ biến.
1041349 - 1041397 - 1041444 Page 25