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
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 |
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
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.
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 |
persist()
và 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 |
|
org.hibernate.annotations.CascadeType.SAVE_UPDATE |
Support | JPA Provider | Hibernate |
merge()
và update()
method
# | merge() |
update() |
---|---|---|
Purpose | Insert/Update entity tùy thuộc vào state | Update entity |
Implementation |
|
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 |
|
|
Cascading |
|
org.hibernate.annotations.CascadeType.SAVE_UPDATE |
Support | JPA Provider | Hibernate |
remove()
và 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 |
|
|
Support | JPA Provider | Hibernate |
get()
và 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 |
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 |
|
|
# | 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 |
|
|
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:
mappedBy
của những annotation @OneToOne
, @OneToMany
, @ManyToMany
mappedBy
vì bên N luôn là owning side trong mối quan hệ đó.