1.3. Các tập tin config
1.3.1. hibernate.cfg.xml
• Tập tin này bắt đầu bằng thẻ <hibernate-configuration> và kết thúc với thẻ </hibernate-configuration>.
• Thẻ <session-factory> là thẻ con của thẻ <hibernate-configuration>. Những thể con của thẻ <session-factory> được sử dụng để định nghĩa properties và resources của session-factory.
• Để định nghĩa các properties của session-factory, ta sử dụng thẻ <property name=””>class</property>.
§ name của thẻ property là property của session-factory. Những properties của session-factory có thể là:
o hibernate.connection.driver_class
o hibernate.connection.url
o hibernate.connection.username
o hibernate.connection.password
o hibernate.connection.pool_size
o show_sql
o dialect
o hibernate.hbm2ddl.auto
o …
§ class là các giá trị của các properties của session-factory.
§ Ví dụ:
<property name=”hibernate.connection.driver_class”>
com.mysql.jdbc.Driver
</property>
• Để định nghĩa resouces của session-factory, ta sử dụng <mapping resource=””/>
§ resource là đường dẫn url của hbm.xml file.
1.3.2. hibernate.properties
Khai báo các properties trong 1 file tên là: hibernate.properties, chỉ cần đặt file này trong classpath của ứng dụng. Nó sẽ tự kiểm tra và đọc khi Hibernate khởi chạy lần đầu tiên, là khi tao 1 Configuaration object. Tương tự như hibernate.cfg.xml, hibernate.properties cũng để khai báo các thông số, nhưng hibernate.properties thường được kết hợp với spring config.
1.4.1. Cấu trúc cơ bản
• Bắt đầu bằng <hibernate-mapping> và kết thúc với </hibernate-mapping>.
• Từng bảng trong CSDL được đinh nghĩa bằng thẻ <class> và chứa những thuộc tính (attributes):
§ name: là tên của lớp đối tượng dữ liệu (data object class) (của bảng tương ứng trong CSDL).
§ table: là tên của bảng trong CSDL.
• Thẻ <class> có các thẻ con sau:
§ Thẻ <id>: để định nghĩa id của bảng. Nó có những thuộc tính sau:
o name: là tên property của đối tượng dữ liệu (data object).
o column: là tên của cột trong CSDL.
o type: là kiểu dữ liệu của cột. Chú ý: đây là một kiểu của Hibernate chứ không phải của kiểu dữ liệu của Java hay của CSDL.
§ Thẻ <id> cũng có thẻ con sau:
o Thẻ <generator class=””> để cho biết loại id trong table của CSDL (được gàn là: no-generate, increment: được tạo ra bởi hibernate (không nên sử dụng), identity: tự động tạo ra bởi CSDL, native: chọn các kiểu tạo khác như sequence của Oracle.
Thẻ§ <property> để chỉ ra một cột bình thường, có cùng thuộc tính như thẻ <id> ngoại trừ việc thẻ này không có thẻ con <generator>.
1.4.2. Mapping types
Mapping types là những kiểu dữ liệu mà khi khai báo ở tập tin hbm.xml sẽ dược ánh xạ tương ứng. Hibernate có một số kiểu dữ liệu sẵn có mà Hibernate đã định nghĩa, goi là Built-in mapping types. Ngoài ra, bạn cụng có thể tự định nghĩa một kiểu riêng của bạn.
1.4.2.1. Java primitive mapping types
• Bạn cũng nên chú ý rằng cơ sở dữ liệu của bạn có thể sẽ không hỗ trợ một vài SQL types ở trên. Danh sách ở trên chỉ là ANSI-standard data types.
• Tuy nhiện, JDBC driver cung cấp vendor-specific SQL data types, cho phép Hibernate làm việc với ANSI-standard types khi thực thi câu lệnh DML (data manipulation language). Đối với DDL, Hibernate dịch ANSI-standard type thành vendor-specific type bằng cách sử dụng đặc tả SQL dialects.
1.4.2.2. Date – time mapping types
1.4.2.3. Large object mapping types
• java.sql.Blob và java.sql.Clob là cách hiểu quả nhất để quản lý large object trong Java.
• Tuy nhiên, do hạn chế là Blob và Clob chỉ có thể sử dụng cho đến khi JDBC transaction hoàn tất, nên người ta thường sử dụng binary hay text mapping type.
• Chú ý: bạn có thể kiếm cái mẫu mới nhất (design pattern) và hướng dẫn sử dụng large object trên website của Hibernate.
1.4.2.4. Various JDK mapping type
1.4.2.5. Sử dụng mapping types
<class
name="vn.huflit.diendan.model.Forum"
table="FORUM"
>
<id
name="id"
type="java.lang.Long"
unsave-value="null"
>
<column
name="FORUM_ID"
not-null="true"
sql-type="INTEGER"
/>
<generator class="identity">
</generator>
</id>
<property
name="forumSubject"
type="java.lang.String"
update="true"
insert="true"
>
<column
name="FORUM_SUBJECT"
not-null="true"
sql-type="VARCHAR(50)"
/>
</property>
<!—
Tiep tuc...
-->
</class>
1.4.3. Mapping collection of value types (sử dụng bag)
• Trong trường hợp ta có CSDL như trên, một FORUM thuộc một CAT và một CAT có nhiều FORUM.
• Vậy nên, trong CAT có danh sách FORUM, như vậy trong Class Category có một thuộc tính forumList, và ta sẽ ánh xạ forumList như thế nào.
• Ta sẽ sử dụng thẻ bag để làm công việc này trong tập tin mapping của CAT:
<bag
name="forumList"
lazy="true"
cascade="save-update"
>
<key
column="CAT_ID"
>
</key>
<one-to-many
class="vn.huflit.diendan.model.Forum"
/>
</bag>
1.4.4. Mapping Entity Association
Thường có 4 dạng kết hợp là: one-to-one, many-to-many, one-to-many, many-to-one, nhưng thường thì ta chỉ sử dụng 2 loại kết hợp: one-to-many và many-to-one.
1.4.4.1. One-to-many
• Như ví dụ phần trên, một FORUM thuộc một CAT và một CAT chứa nhiều FORUM, nên trong CAT có thuộc tính forumList.
• Đối với mỗi phần tử trong forumList sẽ thuộc một CAT, vì vậy, quan hệ giữa CAT với những phần tử này là one-to-many.
• Ta dùng thẻ <one-to-many> nằm trong lớp Category (trong thẻ bag) để cho biết Category có nhiều phần tử nằm trong forumList và mỗi phần tử đó chính là một thể hiện của Forum.
• Ví dụ (xem phần Mapping collection of value types)
1.4.4.2. many-to-one
• Để thể hiện rằng một TOPIC thuộc một FORUM, và cũng có thể một thể hiện khác của TOPIC cũng thuộc FORUM trên, ta sẽ sử dụng thể <many-to-one> trong tập tin ánh xạ của TOPIC.
• Ví dụ:
<many-to-one
name="forumId"
class="vn.huflit.diendan.model.Forum"
cascade="none"
outer-join="auto"
update="true"
insert="true"
>
<column
name="FORUM_ID"
not-null="true"
sql-type="INTEGER"
/>
</many-to-one>
1.4.5. Cascading action
• Về các thuộc tính cascade trong các thẻ bên trên, ý nghĩa nó tương tự như các tùy chọn cascade trong các hệ quản trị CSDL mà ta đã từng biết như Ms Access, SQL Server, Oracle, ... Các giá trị của cascade:
§ "none": không thực hiện gì cả, tự ta kiểm tra các ràng buộc và thực hiện cho đúng để tránh ngoại lệ.
§ "save-update": lưu và cập nhật cha sẽ được cập nhật cả con.
§ "delete": xóa cha thì sẽ thực hiện xỏa cả con.
§ "all": tất cả hành động bao gồm "save-update" hay "delete" đều được thay đổi con nếu có thay đổi từ cha.
§ "all-delete-orphan": tất cả hành động sẽ được cập nhật từ cha đến con, những con không còn cha sẽ bị xóa.
• Thường thì, save-update là một lựa chọn tốt nhất và dễ xài.
No comments:
Post a Comment