Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 47 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
47
Dung lượng
1 MB
Nội dung
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 [...]... 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... CacheMode.IGNORE để Hibernate không tương tác với bộ nhớ tạm mức hai trong một session riêng 2.2 Sử dụng câu truy vấn Cú pháp : 1041349 - 1041397 - 1041444 Page 31 Báo cáo đề tài tìm hiểu Hibernate- phần 1 Mệnh đề FROM và WHERE được tùy chọn Mệnh đề FROM chỉ đặt tên cho thực thể đơn Không hỗ trờ từ khóa JOIN Ta có ví dụ : UPDATE: DELETE : Inheritance Mapping.(Tính kế thừa trong Hibernate) 1041349... 1041349 - 1041397 - 1041444 Page 32 Báo cáo đề tài tìm hiểu Hibernate- phần 1 Đặ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ệ 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í... 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.. .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 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 =============== 1041349 - 1041397 - 1041444 Page 24 Báo cáo đề tài tìm hiểu Hibernate- phần 1 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... 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... 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 được sử dụng cho mỗi subclass trong mapping file . 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. - 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. 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