Top những câu hỏi phỏng vấn Hibernate

  • Phuong Dang
  • 23/Oct/2022
hibernate
  1. So sánh JPA và Hibernate
  2. Hibernate Session là gì?
  3. Hibernate SessionFactory là gì?
  4. Mô tả về object lifecycle trong hibernate
  5. So sánh persist() và save() method
  6. So sánh merge() và update() method
  7. So sánh remove() và delete() method
  8. So sánh get() và load() method
  9. So sánh fetch type: Lazy và Eager
  10. So sánh First Level Cache và Second Level Cache
  11. So sánh bidirectional relationships và unidirectional relationships

Trong bài viết này mình sẽ tổng hợp những câu hỏi phỏng vấn Hibernate cho đối tượng Fresher.

Hibernate version 5.6

1. So sánh JPA và Hibernate

Java Persistence API (JPA) Hibernate
JPA là một tập các class/interface/annotation specification mô tả, hướng dẫn triển khai standard ORM cho ứng dụng Java Hibernate là một trong những JPA Provider, implement cho những specification của JPA

2. Hibernate Session là gì?

Session là 1 short-lived object duy trì connection giữa Java application và database, vì bản chất Session wrap một JDBC java.sql.Connection bên trong nó. Session cung cấp những method để thao tác CRUD với dữ liệu như: persist()/save(), merge()/update(), load()/get(), delete()/remove(). Ngoài ra nó còn cung cấp các method factory để tạo ra instance của Query, Criteria, Transaction

3. Hibernate SessionFactory là gì?

SessionFactory giúp tạo các Session objects dựa trên các configuration parameters để tạo kết nối đến database. SessionFactory chứa thông tin mapping các entity đến database. SessionFactory thread-safe và immutable, nên khi instance được tạo thì không thể thay đổi.

Tạo ra một instance của SessionFactory rất tốn tài nguyên, do đó thông thường với mỗi database thì application chỉ nên có 1 SessionFactory liên kết đến.

4. Mô tả về object lifecycle trong hibernate

Hibernate State JPA State Description
Transient New The entity instances have no persistent identity and are not yet associated with a persistence context.
Persistent Managed The entity instances have a persistent identity and are associated with a persistence context.
Detached The entity instances have a persistent identity and are not currently associated with a persistence context
Removed The entity instances have a persistent identity, are associated with a persistent context, and are scheduled for removal from the data store

5. So sánh persist()save() method

# persist() save()
Purpose Thêm mới entity vào database thông qua việc generate câu lệch INSERT tương ứng
Transaction Required Optional
Return type void ID (java.io.Serializable) của record được thêm mới
Cascading
  • javax.persistence.CascadeType.PERSIST
  • org.hibernate.annotations.CascadeType.PERSIST
  • org.hibernate.annotations.CascadeType.SAVE_UPDATE
org.hibernate.annotations.CascadeType.SAVE_UPDATE
Support JPA Provider Hibernate

6. So sánh merge()update() method

# merge() update()
Purpose Insert/Update entity tùy thuộc vào state Update entity
Implementation
  • Generate SELECT statement để kiểm tra trạng thái.
  • Nếu identify chưa tồn tại => Insert record.
  • Nếu identify đã tồn tại => Update record.
Generate UPDATE statement không cần SELECT kiểm tra trước
Transient entity Inserted new record Throw exception org.hibernate.TransientObjectException
Persistent entity Updated value (Nếu có sự thay đổi).
Detached entity
  • Identify chưa tồn tại => Insert record.
  • Identify đã tồn tại => Update record.
  • Identify chưa tồn tại => Throw exception.
  • Identify đã tồn tại => Update record.
Cascading
  • javax.persistence.CascadeType.MERGE
  • org.hibernate.annotations.CascadeType.MERGE
  • org.hibernate.annotations.CascadeType.SAVE_UPDATE
org.hibernate.annotations.CascadeType.SAVE_UPDATE
Support JPA Provider Hibernate

7. So sánh remove()delete() method

# remove() delete()
Purpose Xóa entity khỏi database thông qua việc generate câu lệch DELETE tương ứng
Cascading
  • javax.persistence.CascadeType.REMOVE
  • org.hibernate.annotations.CascadeType.REMOVE
  • org.hibernate.annotations.CascadeType.DELETE
Support JPA Provider Hibernate

8. So sánh get()load() method

# get() load()
Purpose Lấy data của entity thông qua Identity
Null Object Return null Throw ObjectNotFoundException
Lazy or Eager loading

Eager load

Data của object sẽ được lấy ngay và trực tiếp trong database

Lazy load

Sẽ return data của proxy object trước cho đến khi sử dụng data mới request lấy dữ liệu của database

9. So sánh FetchType.LAZY và FetchType.EAGER

FetchType là một thuộc tính trong các annotation @OneToOne, @OneToMany, @ManyToOne, @ManyToMany được dùng để định nghĩa phương thức lấy các đối tượng liên quan.

Giả sử ta có entity A có liên kết đến entity B:

FetchType.LAZY FetchType.EAGER
Nếu ta select đối tượng A thì sẽ KHÔNG auto lấy các đối tượng B có liên kết PK/FK với A Nếu ta select đối tượng A thì sẽ auto lấy các đối tượng B có liên kết PK/FK với A
  • Ưu điểm: Tiết kiệm tài nguyên khi select, chỉ lấy data khi cần thiết
  • Nhược điểm: Có thể gây lỗi LazyInitializationException, nếu muốn lấy các dữ liệu liên quan mà session đã close
  • Ưu điểm: Lấy luôn các đối tượng liên quan cùng 1 lúc, nhanh gọn cho các xử lý tiếp theo nếu cần dùng đến.
  • Nhược điểm: Có thể lấy thừa dữ liệu không cần thiết

10. So sánh First Level Cache và Second Level Cache

# First Level Cache Second Level Cache
Purpose Cải thiện hiệu quả truy xuất dữ liệu
Configuring Default enable và không thể disable Default disable và cần config để enable
Scope Session SessionFactory
Sharing among sessions No Yes
Lifespan
  • Khi Session object bị close thì First Level Cache thuộc về object đó sẽ mất đi.
  • Chủ động xóa entity object ra khỏi First Level Cache bằng các method: evict(), clear().
  • Khi SessionFactory bị close thì Second Level Cache sẽ bị mất đi
  • Chủ động xóa entity object ra khỏi Second Level Cache bằng các method: evict(), evictAll(), evictEntityData().

11. So sánh bidirectional relationships và unidirectional relationships

Trong mối quan hệ giữa 2 đối tượng có thể chia thành bidirectional (2 chiều) hoặc unidirectional (1 chiều).

Bidirectional Unidirectional
Bidirectional: là mối quan hệ mà cả 2 đối tượng đều biết về đối tượng còn lại. Một đối tượng sẽ được gọi là owning side, đối tượng còn lại gọi là inverse side Unidirectional: là mối quan hệ mà cả chỉ 1 đối tượng biết về đối tượng còn lại. Mối quan hệ này sẽ chỉ có owning side
Ví dụ: 2 đối tượng LineItem (owning side) và Order(inverse side), nếu thông qua Order biết rằng có những LineItem nào được bán thuộc về nó, và LineItem biết rằng nó được bán trong đơn hàng nào thì đây là mối quan hệ bidirectional Ví dụ 2 đối tượng LineItem (owning side) và Product, nếu LineItem biết về Product có liên kết nhưng ngược lại Product lại không hề biết về mối liên kết đó thì đây là mối quan hệ unidirectional

Mối quan hệ bidirectional cần tuân thủ các quy định sau:

  • Inverse side cần phải refer đến owning side của nó thông qua thuộc tính mappedBy của những annotation @OneToOne, @OneToMany, @ManyToMany
  • Trong mối quan hệ bidirectional 1-N, bên N không được định nghĩa mappedBy vì bên N luôn là owning side trong mối quan hệ đó.
  • Trong mối quan hệ bidirectional 1-1, owning side là bên sẽ chứa foreign key.
  • Trong mối quan hệ bidirectional N-N, bên nào cũng có thể trở thành owning side