
Written on 3rd September 2026 by Carter Phan.
JPA / Hibernate
↓
Quản lý DATA ACCESS
↓
Java Object ↔ Database Row
Migration Tool
↓
Quản lý DATABASE SCHEMA
↓
Version 1 → Version 2 → Version 3
Ví dụ:
Java Entity
↓
User.java
↓
JPA/Hibernate
↓
users table
Trong khi:
V1__create_users.sql
V2__add_email.sql
V3__add_index.sql
↓
Database Schema
JPA là specification, Hibernate thường là implementation.
Ví dụ:
@EntitypublicclassUser {
@IdprivateLongid;privateStringname;privateStringemail;
}
Hibernate map:
User
↓
users
id
name
email
Sau đó bạn có thể:
userRepository.findById(id);
Hibernate generate SQL:
SELECT*FROM usersWHERE id= ?;
Migration tool quản lý thay đổi schema theo version.
Ví dụ dùng Flyway:
V1__create_user.sql
V2__add_email.sql
V3__add_user_status.sql
CREATETABLE users (
id BIGINTPRIMARYKEY,
nameVARCHAR(255)
);
ALTERTABLE usersADDCOLUMN emailVARCHAR(255);
ALTERTABLE usersADDCOLUMN statusVARCHAR(50);
Database:
V1
↓
V2
↓
V3
↓
V4
Migration tool biết database đang ở version nào và apply migration còn thiếu.
Hibernate có thể generate/update schema:
spring:
jpa:
hibernate:
ddl-auto: update
Hoặc:
ddl-auto: create
ddl-auto: create-drop
ddl-auto: validate
ddl-auto: none
Nhưng:
ddl-auto: update không phải database migration management tốt cho production.
Ví dụ developer đổi:
privateStringname;
thành:
privateStringfullName;
Hibernate có thể không biết bạn muốn:
ALTERTABLE users
RENAMECOLUMN nameTO full_name;
hay:
DROP name;ADD full_name;
Và với schema production phức tạp, automatic schema mutation rất khó kiểm soát.
Đây là điểm quan trọng nhất.
Migration:
V1
CREATE users
V2
ADD email
V3
ADD status
V4
CREATE index
Có thể audit:
Database hiện tại = V4
Team biết:
Ai thay đổi?
Thay đổi gì?
Thứ tự thay đổi?
Database nào đã chạy migration?
JPA entity thì không phải migration history.
Ví dụ developer thêm field:
@EntityclassUser {
...privateStringphone;
}
Không nên chỉ commit Entity.
Nên:
1. Change Entity
↓
2. Create migration
↓
V5__add_user_phone.sql
↓
3. Commit both
↓
4. Deploy
↓
5. Migration runs
↓
6. JPA validates/uses schema
Ví dụ:
ALTERTABLE usersADDCOLUMN phoneVARCHAR(20);
Sau deployment:
Database
↓
V5 applied
↓
users.phone exists
↓
Hibernate User.phone works
ddl-auto nên dùng thế nào?
Có thể:
ddl-auto: update
hoặc thậm chí:
ddl-auto: create-drop
tùy workflow.
Mục đích:
nhanh, tiện cho local development.
Thường:
ddl-auto: validate
hoặc:
ddl-auto: none
và:
Flyway / Liquibase
↓
Schema changes
Ví dụ:
spring:
jpa:
hibernate:
ddl-auto: validate
Ý nghĩa:
Hibernate kiểm tra Entity có match DB schema không, nhưng không tự ý modify schema.
Đây mới là combination phổ biến:
Spring Boot
│
┌───────────┴───────────┐
↓ ↓
JPA Flyway
↓ ↓
Data Access Schema Migration
│ │
└───────────┬───────────┘
↓
PostgreSQL
Ví dụ:
Entity:
User.java
↓
Hibernate
↓
SELECT / INSERT / UPDATE
Migration:
V5__add_phone.sql
↓
ALTER TABLE
↓
PostgreSQL schema
JPA không thay thế migration. Migration không thay thế JPA.