Hibernate config xml hướng dẫn
Nhóm phát triển của chúng tôi vừa ra mắt website langlearning.net học tiếng Anh, Nga, Đức, Pháp, Việt, Trung, Hàn, Nhật, ... miễn phí cho tất cả mọi người. Là một website được viết trên công nghệ web Flutter vì vậy hỗ trợ rất tốt cho người học, kể cả những người học khó tính nhất. Hiện tại website đang tiếp tục được cập nhập nội dung cho phong phú và đầy đủ hơn. Mong các bạn nghé thăm và ủng hộ website mới của chúng tôi. Show
1- Chuẩn bị DatabaseHibernate vốn là một thư viện sinh ra để làm việc với mọi loại DB, nó không phụ thuộc vào bạn chọn loại DB nào. Nếu Java là "Viết 1 lần chạy mọi nơi" thì Hibernate là "Viết 1 lần chạy trên mọi loại DB" Trong tài liệu này, tôi sử dụng simplehr, nó là một database đơn giản, được sử dụng trong nhiều hướng dẫn trên o7planning. Bạn có thể tạo nó với một trong các loại cơ sở dữ liệu Oracle, MySQL hoặc SQL Server. Xem hướng dẫn dưới đây: 2- Tạo Maven Project & Khai báo thư việnỞ đây tôi tạo một Maven project, và khai báo các thư viện Hibernate trong pom.xml.
Project đã được tạo ra. Trong pom.xml tôi khai báo thư viện Hibernate 5, và các thư viện JDBC cho các loại Database khác nhau Oracle, MySQL và SQL Server. pom.xml
3- Các lớp EntityChúng ta tạo các lớp Entity. Mỗi Entity sẽ đại diện cho một bảng trong DB. Hãy khoan nói về những gì có trong các lớp đó.
Department.java
Employee.java
SalaryGrade.java
Timekeeper.java
4- Cấu hình HibernateMục đích là để Hibernate đọc được vào Database, cũng như khai báo danh sách các Entity mà bạn đã tạo ở bước trên. Tập tin hibernate.cfg.xml được đặt tại src/main/java hibernate.cfg.xml (ORACLE)
hibernate.cfg.xml (MySQL)
hibernate.cfg.xml (SQL Server)
Với mỗi loại Database khác nhau có một Dialect (Phương ngữ) khác nhau. Ví dụ: Dialect dùng cho Oracle:
Dialect dùng cho SQL Server:
Dialect dùng cho MySQL:
Dialect là gì? Dialect là một lớp, nó nói với Hibernate cách chuyển đổi các kiểu dữ liệu của Database thành các kiểu dữ liệu của Java, và ngược lại. Đồng thời nó cũng được sử dụng để định nghĩa cách chuyển đổi giữa các hàm của HSQL (Hibernate SQL) thành các hàm của Database tương ứng.
5- SessionFactoryHibernateUtils là một lớp tiện ích, nó có phương thức trả về đối tượng SessionFactory. Lớp này sẽ được sử dụng thường xuyên trong các ví dụ. HibernateUtils.java
6- Hibernate Query Language (HQL)Hibernate sử dụng ngôn ngữ Hibernate Query Language (HQL) để query dữ liệu. HQL có một chút khác biệt với SQL mà bạn đã biết. SQL:
HQL:
Nguyên tắc hoạt động của Hibernate: Ứng dụng của bạn viết các câu lệnh HQL trong thời gian chạy Hibernate tự biết nó đang làm việc với loại Database nào, nó sẽ tự chuyển đổi các câu lệnh HQL sang SQL tương ứng với loại DB đó. Thực tế chúng ta biết rằng cú pháp SQL có sự khác nhau đôi chút giữa các loại Database khác nhau. Và kiểu dữ liệu cũng vậy.
7- Query dữ liệu với HibernateCó nhiều cách để lấy dữ liệu với Hibernate. Trong phần này tôi sẽ giới thiệu một vài cách lấy dữ liệu thông dụng. 7.1- Query Object sử dụng HQLVí dụ đầu tiên, sử dụng HQL để query các đối tượng Entity: QueryObjectDemo.java
Kết quả chạy ví dụ: Demo2: QueryObjectDemo2.java
7.2- Query lấy dữ liệu một vài cột sử dụng HQLQuerySomeColumnDemo.java
Kết quả chạy ví dụ: 7.3- Query lấy dữ liệu một vài cột sử dụng HQL & JavaBeanTrong trường hợp bạn cần lấy dữ liệu một số cột trên một số bảng, cách tốt nhất là sử dụng Java beans. Lớp Java bean sẽ có một constructor để khởi tạo các giá trị các trường (field) của nó. Constructor này tham gia vào câu lệnh truy vấn HQL. ShortEmpInfo.java
ShortEmpInfoQueryDemo.java
7.4- Query Lấy dữ liệu duy nhấtUniqueResultDemo.java
8- Transient, Persistent và Detached là gì?DataUtils.java
Đây là ví dụ đơn giản sử dụng Session.persist(Object) để insert một đối tượng Transient vào DB. Khái niệm đối tượng Transitent, Persistent, Detached sẽ được giải thích trong ví dụ này. PersistDemo.java
Kết quả chạy ví dụ: 9- Vòng đời của Hibernate (Hibernate Lifecycle)Lớp Session của Hibernate có một số các phương thức quan trọng. Chúng được chia ra các nhóm như hình minh họa dưới đây. Một đối tượng trong Hibernate có 1 trong 4 trạng thái:
Chúng ta giải thích các trạng thái này bằng hình minh họa dưới đây: Transient: Trường hợp bạn tạo mới một đối tượng java từ một Entity, đối tượng đó sẽ có trạng thái là Transient. Hibernate không biết về sự tồn tại của nó. Nó nằm ngoài sự quản lý của Hibernate. Persistent Trường hợp bạn lấy ra đối tượng Entity thông qua các phương thức get, load, find, getSingleResult,.. bạn có được một đối tượng nó tương ứng với 1 bản ghi dưới database. Đối tượng này có trạng thái Persistent. Nó được quản lý bởi Hibernate. Transient -> Persistent Session gọi một trong các phương thức save, saveOrUpdate, persist, merge sẽ đẩy đối tượng Transientvào sự quản lý của Hibernate và đối tượng này chuyển sang trạng thái Persistent. Nó tương đương với hành động insert hoặc update trong Database. Persistent -> Detached Đối tượng Session gọi phương thức evict(..) hoặc clear() để đuổi các đối tượng có trạng thái Persistent ra khỏi sự quản lý của Hibernate, giờ các đối tượng này sẽ có trạng thái mới là Detached (Bị tách ra). Nếu nó không được đính lại (Re-Attached), nó sẽ bị bộ gom rác của Java (Java Garbage Collector) loại bỏ theo cơ chế thông thường. Detached -> Persistent Sử dụng một trong các phương thức: update(..), saveOrUpdate(..), merge(..) sẽ đưa một đối tượng có trạng thái Detached vào sự quản lý của Hibernate. Nó tương đương với hành động update hoặc insert dưới Database. Đối tượng sẽ chuyển sang trạng thái Persistent. Persistent -> Removed Đối tượng Session gọi phương thức remove(..) hoặc delete(..) để xóa một đối tượng (Bản ghi), đối tượng Persistent sẽ chuyển sang trạng thái Removed (Đã bị loại bỏ). 10- Thao tác Insert, Update, Delete với Hibernate10.1- PersistentPersistentDemo.java
Kết quả chạy ví dụ: 10.2- Transient --> Persistent : Tổng quan10.3- Transient --> Persistent : Sử dụng persist(Object)PersistTransientDemo.java
Kết quả chạy ví dụ: 10.4- Transient --> Persistent : Sử dụng save(Object) *SaveTransientDemo.java
Kết quả chạy ví dụ: 10.5- Transient --> Persistent : Sử dụng saveOrUpdate(Object)SaveOrUpdateTransientDemo.java
Kết quả chạy ví dụ: 10.6- Transient --> Persistent : Sử dụng merge(Object)MergeTransientDemo.java
Kết quả chạy ví dụ: 10.7- Persistent --> Detached Một đối tượng đang có tình trạng Persistent (Được quản lý bởi Hibernate) có thể chuyển sang trạng thái Detached (Bị tách ra, không được Hibernate quản lý) thông qua phương thức dưới đây của Session:
Đuổi một đối tượng ra khỏi sự quản lý của Hibernate
Đuổi tất các các đối tượng ra khỏi sự quản lý của Hibernate.
EvictDemo.java
Kết quả chạy ví dụ: ClearDemo.java
Kết quả chạy ví dụ: 10.8- Detached --> Persistent : Tổng quanMột đối tượng có trạng thái Detached (Bị tách ra khỏi sự quản lý của Hibernate) có thể được đính lại (Re-attach) thông qua một vài phương thức của Session:
Bạn có thể xem sự khác nhau của các phương thức này theo các ví dụ dưới đây: 10.9- Detached --> Persistent : Sử dụng update(Object)UpdateDetachedDemo.java
Kết quả chạy ví dụ: 10.10- Detached --> Persistent : Sử dụng saveOrUpdate(Object)SaveOrUpdateDetachedDemo.java
Chạy ví dụ trên một vài lần, bạn có thể thấy hai tình huống saveOrUpdatetạo ra các hành động: Insert hoặc Update vào DB. INSERT: UPDATE: 10.11- Detached --> Persistent : Sử dụng merge(Object)
MergeDetachedDemo.java
Kết quả chạy ví dụ: INSERT: UPDATE: 10.12- Detached --> Persistent : Sử dụng refresh(Object)RefreshDetachedDemo.java
Kết quả chạy ví dụ: 10.13- Detached --> Persistent : Sử dụng lock(Object)
11- Tạo ra các bảng từ các lớp EntityHibernate cho phép bạn tạo ra các bảng từ các lớp Entity, với đầy đủ các giàng buộc giữa các bảng. 12- Tra cứu Hibernate |