Dưới đây là danh sách các câu hỏi phỏng vấn Hibernate. Nếu bạn biết bất kỳ câu hỏi phỏng vấn hay về Hibernate, vui lòng đăng nó trong phần bình luận để chia sẻ cho mọi người nhé.
1. Hibernate là gì?
Hibernate là một công cụ ORM mã nguồn mở, được sử dụng để lưu trữ, thao tác và truy xuất dữ liệu từ cơ sở dữ liệu.
2. ORM là gì?
ORM là từ viết tắt của Object/Relational mapping có nghĩa là ánh xạ đối tượng/quan hệ. Đây là một kỹ thuật lập trình để ánh xạ đối tượng với dữ liệu được lưu trữ trong cơ sở dữ liệu. Nó đơn giản hóa việc tạo dữ liệu, thao tác dữ liệu và truy cập dữ liệu.
3. ORM bao gồm những gì?
Giải pháp ORM bao gồm 4 phần như sau:
- API để thực hiện các thao tác CRUD cơ bản.
- API để thể hiện các truy vấn tham chiếu đến các lớp.
- Phương tiện để chỉ định Metadata.
- Tối ưu hóa phương tiện: dirty checking,lazy associations fetching.
4. Tại sao bạn cần công cụ ORM như Hibernate?
Ưu điểm chính của ORM như Hibernate là nó bảo vệ các nhà phát triển khỏi SQL lộn xộn. Ngoài ra, ORM cung cấp các lợi ích sau:
Improved productivity
- High-level object-oriented API
- Less Java code to write
- NoSQL to write
Improved performance
- Sophisticated caching
- Lazy loading
- Eager loading
Improved maintainability
- A lot less code to write
Improved portability
- ORM framework generates database-specific SQL for you
5. Phương thức hay được sử dụng nhất để cấu hình Hibernate là gì?
- Anotation configuration
- XML configuration (hibernate.cfg.xml)
6. Các core interface của Hibernate là gì?
Các core interface của Hibernate framework bao gồm:
- Configuration
- SessionFactory
- Session
- Query
- Criteria
- Transaction
7. Session interface đóng vai trò gì trong Hibernate?
Session là interface chính được sử dụng trong ứng dụng Hibernate. Nó là một đối tượng single-threaded, short-lived biểu diễn cuộc giao tiếp giữa ứng dụng và persistent store. Nó cho phép bạn tạo các đối tượng truy vấn để lấy ra các đối tượng được lưu trữ trong store.
Vai trò của Session interface:
- Gói một JDBC connection
- Nhà máy cho các Transaction
- Giữ bộ đệm bắt buộc (first-level) của các đối tượng persistent, được sử dụng khi thao tác hoặc tìm kiếm đối tượng bằng mã định danh.
8. ORM có những ưu điểm gì so với JDBC?
ORM có những ưu điểm sau so với JDBC:
- Phát triển ứng dụng nhanh.
- Quản lý giao dịch.
- Tạo khóa tự động.
- Chi tiết về các truy vấn SQL được ẩn đi.
9. Liệt kê một vài database được Hibernate hỗ trợ.
Một số cơ sở dữ liệu được Hibernate hỗ trợ là:
- DB2
- MySQL
- Oracle
- Sybase SQL Server
- Informix Dynamic Server
- HSQL
- PostgreSQL
- FrontBase
10. Kể tên 2 thành phần chính của đối tượng cấu hình Hibernate.
Database Connection
Class Mapping Setup
11. HQL là gì?
HQL là viết tắt của Hibernate Query Language - Ngôn ngữ truy vấn Hibernate được biết đến như một ngôn ngữ truy vấn hướng đối tượng. Nó giống như một ngôn ngữ truy vấn có cấu trúc (SQL).
Ưu điểm chính của HQL so với SQL là:
- Không cần học SQL.
- Độc lập cơ sở dữ liệu.
- Đơn giản để viết một truy vấn.
12. Truy vấn HQL được tạo ra như thế nào?
Sử dụng phương thức: Session.createQuery()
Làm thế nào để chúng ta có thể thêm criteria vào truy vấn SQL?
Sử dụng phương thức: Session.createCriteria()
13. persistent class là gì?
Các lớp có đối tượng được lưu trữ trong bảng cơ sở dữ liệu được gọi là persistent class.
14. Các bước cơ bản của Hibernate giao tiếp với hệ quản trị cơ sở dữ liệu (RDBMS)
1. Tải Hibernate configuration file và tạo đối tượng configuration. Nó cũng sẽ tải tất cả các file hbm mapping.
2. Tạo đối tượng session factory từ đối tượng configuration.
3. Open một session từ đối tượng session factory.
4. Tạo truy vấn HQL.
5. Thự thi câu lệnh truy vấn.
15. SessionFactory đóng vai trò gì trong Hibernate?
SessionFactory tạo ra các thể hiện của Session. Nó là nhà máy của Session. Nó giữ data của bộ nhớ cache cấp 2 (second-level) mà không được bật theo mặc định.
16. SessionFactory có phải đối tượng thread-safe không?
Có, SessionFactory là một đối tượng thread-safe, vì nhiều thread không thể truy cập nó một cách đồng thời.
17. Session là gì?
Một Session trong Hibernate được sử dụng để có được một kết nối vật lý với một cơ sở dữ liệu. Đối tượng Session là nhẹ và được thiết kế để được khởi tạo mỗi khi cần tương tác với cơ sở dữ liệu. Các đối tượng persistent được lưu và truy xuất thông qua một đối tượng Session.
18. Session có phải là đối tượng thread-safe không?
Không, nhiều thread có thể truy cập nó một cách đồng thời.
19. Các kiểu của mô hình kế thừa trong Hibernate là gì?
Có 3 kiểu mô hình kế thừa trong Hibernate:
- Table per class hierarchy
- Table per subclass
- Table per concrete class
20. Sự khác nhau giữa phương thức session.save() và session.persist() là gì?
No. | save() | persist() |
---|---|---|
1) | trả về identifier (Serializable) của thể hiện. | Kiểu trả về là void. |
2) | Syn: public Serializable save(Object o) | Syn: public void persist(Object o) |
21. Sự khác nhau giữa phương thức get và load là gì?
Có vài Sự khác nhau giữa phương thức get và load như sau:
No. | get() | load() |
---|---|---|
1) | Trả về null nếu không tìm thấy đối tượng. | Ném ra ngoại lệ ObjectNotFoundException nếu không tìm thấy đối tượng. |
2) | get() luôn chọc vào database. | load() không chọc vào database. |
3) | Nó trả về đối tượng thực tế. | Nó trả về đối tượng proxy. |
4) | Nó nên được sử dụng nến bạn không chắc chắn về sự tồn tại của thể hiện. | Nó nên được sử dụng nếu bạnchắc chắc về sự tồn tại của thể hiện. |
22. Sự khác nhau giữa phương thức update và merge là gì?
No. | The update() method | merge() method |
---|---|---|
1) | Update nghĩa là sửa một cái gì đó. | Merge nghĩa là kết hợp nhiều cái với nhau. |
2) | update() nên được sử dụng nếu session không chứa trạng thái persistent với id giống nhau. Nó có nghĩa là update nên chỉ sử dụng bên trong session. Sau khi đóng session, nó sẽ throw error. | merge() nên được sử dụng nếu bạn không biết về trạng thái của session, nghĩa là bạn muốn sửa bất cứ lúc nào. |
Ví dụ:
... SessionFactory factory = cfg.buildSessionFactory(); Session session1 = factory.openSession(); Employee e1 = (Employee) session1.get(Employee.class, Integer.valueOf(101)); //101 là id của employee session1.close(); e1.setSalary(70000); Session session2 = factory.openSession(); Employee e2 = (Employee) session1.get(Employee.class, Integer.valueOf(101)); //truyền id giống e1 Transaction tx=session2.beginTransaction(); session2.merge(e1); tx.commit(); session2.close();
Sau khi đóng session1, e1 ở trạng thái detached. Nó sẽ không có trong bộ đệm session1. Vì vậy, nếu bạn gọi phương thức update(), nó sẽ báo lỗi.
Sau đó, chúng tôi đã mở một session khác và load cùng một employee có id là 101. Nếu chúng ta gọi merge() trong session2, các thay đổi của e1 sẽ được hợp nhất trong e2.
23. Các trạng thái của một đối tượng trong Hibernate là gì?
Các thể hiện có thể tồn tại ở một trong ba trạng thái sau đây tại một thời điểm nhất định:
- transient: Một thể hiện mới của một lớp persistent không liên quan đến một Session, không có đại diện trong cơ sở dữ liệu và không có giá trị định danh được coi là transient (tạm thời) bởi Hibernate.
- persistent: Bạn có thể tạo một thể hiển transient persistent bằng cách liên kết nó với một session. Một thể hiện persistent có một dại diện trong cơ sở dữ liệu, một giá trị định danh và được liên kết với một Session.
- detached: Khi chúng ta đóng session trong Hibernate, thể hiện persistent sẽ trở thành một thể hiện detached.
24. Làm thế nào để tạo lớp immutable trong Hibernate?
Nếu bạn đánh dấu một lớp là mutable = "false", lớp đó sẽ được coi là một lớp bất biến. Theo mặc định, nó là mutable = "true".
25. dirty checking tự động trong hibernate là gì?
Tính năng dirty checking tự động của Hibernate, tự động gọi câu lệnh update trên các đối tượng được sửa đổi trong transaction.
Hãy hiểu nó bằng ví dụ được đưa ra dưới đây:
... SessionFactory factory = cfg.buildSessionFactory(); Session session1 = factory.openSession(); Transaction tx=session2.beginTransaction(); Employee e1 = (Employee) session1.get(Employee.class, Integer.valueOf(101)); e1.setSalary(70000); tx.commit(); session1.close();
Ở đây, sau khi có được nhân viên e1 và chúng ta sẽ thay đổi trạng thái của e1.
Sau khi thay đổi trạng thái, chúng ta commit. Trong trường hợp như vậy, trạng thái sẽ được cập nhật tự động. Điều này được gọi là dirty check tự động trong Hibernate.
26. Có bao nhiêu loại mapping trong Hibernate?
Có thể có 4 loại:
- One to One
- One to Many
- Many to One
- Many to Many
26.Có thể thực hiện mapping collection với One-to-One và Many-to-One không?
Không, chỉ có thể thể thực hiện mapping collection với One-to-Many and Many-to-Many.
28. lazy loading trong Hibernate là gì?
Nó tải các đối tượng con theo yêu cầu, được sử dụng để cải thiện hiệu suất.
Hibernate 3, lazy loading được bật theo mặc định và bạn không cần phải cài đặt lazy = "true". Có nghĩa là không tải các đối tượng con khi đối tượng cha được tải.
29. Sự khác biệt giữa bộ đệm cấp một và bộ đệm cấp hai là gì?
No. | First Level Cache | Second Level Cache |
---|---|---|
1) | First Level Cache được liên kết với Session. | Second Level Cache được liên kết với SessionFactory. |
2) | Nó được bật theo mặc định. | Nó không được bật theo mặc định. |