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
productvới 100 sản phẩm. Sau khi restart app, Hibernate sẽDROPbảng đó rồiCREATEbả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
Productcó 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ảngproductbằng SQL hoặc dùng Flyway/Liquibase.
Tóm gọn
- Dev / Test nhanh: có thể dùng
updatehoặccreateđể tiết kiệm thời gian. - Học tập / Thử nghiệm:
create-droprất hữu ích cho các test tách biệt. - Production (thực tế): nên dùng
validatehoặcnonekế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