Nhà tuyển dụng: Bạn hãy kể tên các JPA annotation thường dùng cho việc mapping Entity và table trong CSDL quan hệ?
Ứng viên: Hibernate hỗ trợ JPA annotation và các annotation loại khác trong package org.hibernate.annotations . Danh sách các annotation thường dùng là:
– javax.persistence.Entity: Sử dụng với class model để chỉ ra rằng nó là entity beans (thực thể).
– javax.persistence.Table: Ánh xạ entity với tên bảng trong CSDL quan hệ.
– javax.persistence.Id: Chỉ ra một field duy nhất là khóa chính trong bảng dữ liệu.
– javax.persistence.GeneratedValue: Chỉ ra luật sinh khóa chính (thường là auto-increment: tự tăng) áp dụng cho trường khóa chính (trường có annotation @Id đứng trước).
– javax.persistence.OneToOne: Khai báo mối quan hệ 1-1 với bảng dữ liệu/entity khác, thông qua fields mà annotation @OneToOne đứng trước.
– javax.persistence.OneToMany: Khai báo mối quan hệ 1-nhiều với bảng dữ liệu/entity khác, thông qua fields mà annotation @OneToMany đứng trước.
Nhà tuyển dụng: Nêu 2 cách để thiết lập tính năng/enable “Query cache” sử dụng hibernate.cfg.xml và trong mã nguồn Java?
Ứng viên: Hibernate có cơ chế đệm (cache) để nâng cao hiệu suất (performance) của hệ thống. Để enable tính năng “Query cache” có 2 cách:
Cách 1. Trong tập tin cấu hình hibernate.cfg.xml
1
|
<property name=“hibernate.cache.use_query_cache”>true</property>
|
Cách 2. Trong mã nguồn Java:
1
2
3
4
|
Session session = getSessionFactory().openSession();
Transaction tx = session.beginTransaction();
Query query = session.createQuery(” from Post p where p.id=42 “);
query.setCacheable(true);
|
Nhà tuyển dụng: Trên trang chủ SmartJob hiện ra 2 bài viết mới nhất trong chuyên mục Blog. 2 bài viết này được lấy ra từ CSDL (cụ thể là từ bảng/table dữ liệu Post). Câu truy vấn chỉ cần lấy ra 2 record trong bảng Post, không cần nhiều hơn. Đó là một ví dụ để dẫn đến câu hỏi: Với Hibernate, sử dụng method nào để giới hạn số kết quả trả về khi truy vấn?
Ứng viên: Sử dụng phương thức
1
|
org.hibernate.Query.setMaxResults(int maxResults);
|
Trong trường hợp minh họa, để trả về 2 post hiện ra trang chủ, sẽ có:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
public List<Post> getData() {
Session session = null;
try {
session = HibernateUtil.getSession();
Query query = session.createQuery(“FROM Post”);
query.setMaxResults(2);
return query.list();
} catch (HibernateException e) {
} finally {
HibernateUtil.closeSession(session);
}
return null;
}
|
Nhà tuyển dụng: Bạn hãy cho biết ưu điểm của việc sử dụng Hibernate so với JDBC khi tương tác với CSDL quan hệ?
Ứng viên: Năm ưu điểm nổi bật của việc sử dụng Hibernate so với JDBCkhi tương tác với CSDL quan hệ là
– Hibernate thao tác trên các đối tượng (object), cấu trúc dữ liệu (data structure, như List, Set, v.v..) nên phù hợp hoàn toàn với lập trình hướng đối tượng trong Java, chứ không thao tác trực tiếp trên các table/bảng của CSDL quan hệ.
– Hiệu suất cao: Hibernate sử dụng cơ chế cache (đệm) giúp hệ thống hoạt động nhanh hơn. Hai loại cache trong Hibernate là: First level cache (đệm mức thứ nhất), Second level cache (đệm mức thứ hai). First level cache là mặc định, luôn sẵn có. Second level cache cần bật tùy chọn này lên thì sẽ tận dụng được.
– Truy vấn độc lập với Hệ quản trị cơ sở dữ liệu (Database management system). HQL (Hibernate Query Language: Ngôn ngữ truy vấn Hibernate) cho phép tạo câu truy vấn 1 lần và thực thi trên mọi Hệ quản trị cơ sở dữ liệu quan hệ. Điều đó có nghĩa là viết truy vấn HQL 1 lần, có thể thực thi trên Oracle, MySQL, Microsoft SQLServer hay PostgreSQL v.v..
– Cho phép tạo bảng tự động: Có thể tạo table dữ liệu tự động, không cần tạo bảng dữ liệu thủ công.
– Đơn giản các lệnh join phức tạp: Lấy dữ liệu từ nhiều bảng dễ hơn.
Nhà tuyển dụng: So sánh hai phương thức setMaxResults() và setFetchSize() trong Hibernate.
Query.setFetchSize(int fetchSize);
Query.setMaxResults(int maxResults);
Ứng viên: Phương thức setMaxResult() giới hạn số bản ghi (records) trả về, tương tự như tùy chọn LIMIT khi truy vấn SQL trên Hệ quản trị cơ sở dữ liệu MySQL.
Phương thức setFetchSize() dành cho các truy vấn mà số bản ghi (record) trả về dự kiến sẽ rất lớn. Giả sử setFectchSize(100), và truy vấn thực tế trả về 1001 bản ghi. Hibernate sẽ hoạt động như sau: Lấy về 100 bản ghi đầu tiên, sau đó lấy 100 bản ghi tiếp theo, sau đó lấy 100 bản ghi tiếp theo, v.v.. cho đến lấy 1 bản ghi cuối cùng. Đó là ý nghĩa của setFectchSize().
Nhà tuyển dụng: Giải thích ý nghĩa của dòng code dưới đây:
1
2
|
List<Post> = new ArrayList<Post>();
posts = session.createCriteria(Post.class).list();
|
Ứng viên: Dòng code đã cho có nghĩa là lấy về tất cả các bản ghi trong bảng dữ liệu/table Post. Đó là cách truy vấn ngắn gọn nhất có thể có.
Nhà tuyển dụng: Tôi đã lấy về được toàn bộ các bản ghi/record trong bảng dữ liệu Post:
1
2
|
List<Post> posts = new ArrayList<Post>();
posts = session.createCriteria(Post.class).list();
|
Giúp tôi sắp xếp kết quả trả về theo id giảm dần.
Ứng viên: Chúng ta sử dụng thêm phương thức addOrder() như sau:
1
2
|
List<Post> posts = new ArrayList<Post>();
posts = session.createCriteria(Post.class).addOrder(Order.asc(“id”)).list();
|
Tài liệu tham khảo: http://docs.jboss.org/hibernate/orm/5.0/userGuide/en-US/html_single/#querycriteria-ordering .
Đỗ Như Vý – developer tại SmartJob
annotation,
Hibernate,
HQL,
java,
JPA,
SQL,