0

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ồi CREATE 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ột id, name. Sau đó bạn thêm field price. Khi chạy lại app, Hibernate sẽ tự động ALTER TABLE product ADD COLUMN price.
  • Lưu ý: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ảng product (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ảng product đã 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ảng product bằng SQL hoặc dùng Flyway/Liquibase.

Tóm gọn

  • Dev / Test nhanh: có thể dùng update hoặc create để 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ặc none 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

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí