spring.jpa.hibernate.ddl-auto là cái gì???
Hiểu đơn giản spring.jpa.hibernate.ddl-auto
Trong Spring Boot + JPA/Hibernate, ta thường viết các class Java có annotation @Entity
để mô tả bảng trong database. Khi ứng dụng chạy, Hibernate nhìn vào các @Entity
này và hiểu đó là các bảng — tên bảng, các cột tương ứng với các field, v.v.
Ví dụ:
@Entity
public class Product {
@Id
@GeneratedValue
private Long id;
private String name;
private Double price;
}
=> Tương ứng với 1 bảng product
trong DB, có cột id
, name
, price
.
Vấn đề đặt ra
Từ điều cơ bản ở trên, nảy sinh câu hỏi: Hibernate sẽ xử lý database như thế nào khi ứng dụng chạy?
- Tự tạo bảng mới?
- Kiểm tra bảng có sẵn không?
- Cập nhật thêm cột nếu có field mới?
- Hay không động đến database cả?
➡️ Câu trả lời nằm ở thuộc tính spring.jpa.hibernate.ddl-auto
trong file cấu hình (application.properties
/ application.yml
). Chính nó quyết định cách Hibernate tương tác với schema của database khi ứng dụng khởi động.
Các chế độ của spring.jpa.hibernate.ddl-auto
bạn cần biết
create
Mỗi lần chạy app → xóa sạch database rồi tạo lại bảng mới theo entity.
- Dữ liệu cũ mất hết.
- Ví dụ: hôm nay bạn có bảng
product
với 100 sản phẩm. Sau khi restart app, Hibernate sẽDROP
bảng đó rồiCREATE
bảng mới rỗng.
create-drop
Tương tự create
, nhưng sau khi tắt app → xóa luôn bảng.
- Thường dùng để test unit, không lưu dữ liệu giữa các lần chạy.
update
Hibernate sẽ giữ bảng cũ, nhưng nếu entity có thay đổi thì nó sẽ thêm/sửa vào DB.
- Ví dụ: ban đầu
Product
có 2 cộtid
,name
. Sau đó bạn thêm fieldprice
. Khi chạy lại app, Hibernate sẽ tự độngALTER TABLE product ADD COLUMN price
. - Lưu ý: nó không xóa cột nếu bạn xóa field trong entity → dễ làm DB lộn xộn. Vì vậy không khuyến khích dùng trong production.
validate
Hibernate chỉ kiểm tra entity và DB có khớp nhau không.
- Nếu không khớp → báo lỗi, nhưng không sửa gì trong DB.
- Dùng khi bạn muốn đảm bảo entity và schema đồng bộ, nhưng không cho Hibernate tự ý can thiệp.
none
Hibernate không làm gì với database.
- Bạn phải tự tạo bảng và quản lý DB bằng tay hoặc dùng tool migration (Flyway, Liquibase).
- Đây là cách an toàn nhất cho production.
Ví dụ minh họa
Giả sử bạn đang làm app quản lý sản phẩm:
Entity ban đầu:
@Entity
public class Product {
@Id
@GeneratedValue
private Long id;
private String name;
}
- Nếu
ddl-auto = create
→ Hibernate sẽ tạo bảngproduct
(id, name) mới mỗi lần chạy. - Nếu
ddl-auto = update
→ Nếu bảng chưa có thì Hibernate tạo mới; nếu có rồi thì chỉ thêm/sửa cột cần thiết. - Nếu
ddl-auto = validate
→ Hibernate chỉ kiểm tra bảngproduct
đã tồn tại và các cột đúng hay chưa. Sai thì báo lỗi. - Nếu
ddl-auto = none
→ Hibernate mặc kệ, bạn phải tạo bảngproduct
bằng SQL hoặc dùng Flyway/Liquibase.
Tóm gọn
- Dev / Test nhanh: có thể dùng
update
hoặccreate
để tiết kiệm thời gian. - Học tập / Thử nghiệm:
create-drop
rất hữu ích cho các test tách biệt. - Production (thực tế): nên dùng
validate
hoặcnone
kết hợp với công cụ migration như Flyway hoặc Liquibase để quản lý schema một cách an toàn và có thể truy vết.
👉 update
tiện nhưng rủi ro (không xóa cột), none
/validate
an toàn hơn khi kết hợp migration.
All rights reserved