เช เชฒเซเช เชเชฎเชพเชตเชเชฎเชพเช เชกเซเชเชพเชฌเซเช เชธเซเชธเชเชเชคเชคเชพ เชธเชฎเชธเซเชฏเชพเชเชจเซ เชเซเชตเซ เชฐเซเชคเซ เชเชเซเชฒเชตเชพ เชคเซ เชตเชฟเชเชคเชตเชพเชฐ เชธเชฎเชเชพเชตเซ เชเซ. เช เชฎเซ เชคเชฎเชจเซ เชเชฃเชพเชตเซเชถเซเช เชเซ เชเซ เชคเชฎเซ เชชเซเชฐเชพเชฐเชเชญเชฟเช เชคเซเชฏเชพเชฐเซ เชตเชฟเชจเชพ เชเชชเชฏเซเช เชเชฐเชตเชพเชจเซ เชชเซเชฐเชฏเชพเชธ เชเชฐเชถเซ เชคเซ เชคเชฎเชพเชฐเซ เชชเซเชฐเซเชกเชเซเชถเชจ เชเชชเซเชฒเชฟเชเซเชถเชจเซเชธเชจเซเช เชถเซเช เชฅเช เชถเชเซ เชเซ. เชชเชเซ เช เชฎเซ เชเชชเซเชฒเชฟเชเซเชถเชจ เชเซเชตเชจเชเชเซเชฐเชจเชพ เชคเชฌเชเซเชเชพเชเชฎเชพเชเชฅเซ เชชเชธเชพเชฐ เชฅเชเชถเซเช เชเซ เชถเซเชจเซเชฏ เชกเชพเชเชจเชเชพเชเชฎ (เชเชถเชฐเซ เชฒเซเชจ: เชเชเชณ - เชถเซเชจเซเชฏ เชกเชพเชเชจเชเชพเชเชฎ). เช เชฎเชพเชฐเซ เชเชพเชฎเชเซเชฐเซเชจเซเช เชชเชฐเชฟเชฃเชพเชฎ เชชเชพเชเชณเชจเซ-เช เชธเชเชเชค เชกเซเชเชพเชฌเซเช เชซเซเชฐเชซเชพเชฐเชจเซ เชชเชพเชเชณเชจเซ-เชธเซเชธเชเชเชค เชฐเซเชคเซ เชฒเชพเชเซ เชเชฐเชตเชพเชจเซเช เชนเชถเซ.
เชเซ เชคเชฎเซ เชฒเซเชเชฎเชพเชเชฅเซ เชเซเชก เชเชฆเชพเชนเชฐเชฃเซ เชธเชฎเชเชตเชพ เชฎเชพเชเชเชคเชพ เชนเซ, เชคเซ เชคเชฎเซ เชคเซเชจเซ เช
เชนเซเชเชฅเซ เชถเซเชงเซ เชถเชเซ เชเซ
เชชเชฐเชฟเชเชฏ
เชถเซเชจเซเชฏ เชกเชพเชเชจเชเชพเชเชฎ เชเชฎเชพเชตเช
เชถเซเช เชฐเชนเชธเซเชฏเชตเชพเชฆเซ เชถเซเชจเซเชฏ เชกเชพเชเชจเชเชพเชเชฎ เชเชฎเชพเชตเช? เชคเชฎเซ เช เชคเซเชฏเชพเชฐเซ เชเชนเซ เชถเชเซ เชเซ เชเซเชฏเชพเชฐเซ เชคเชฎเชพเชฐเซ เชเชชเซเชฒเชฟเชเซเชถเชจ เชเชตเซ เชฐเซเชคเซ เชเชฎเชพเชตเชตเชพเชฎเชพเช เชเชตเซ เชเซ เชเซ เชคเชฎเซ เชเชคเซเชชเชพเชฆเชจเชฎเชพเช เชเชชเซเชฒเชฟเชเซเชถเชจเชจเชพ เชจเชตเชพ เชธเชเชธเซเชเชฐเชฃเชจเซ เชธเชซเชณเชคเชพเชชเซเชฐเซเชตเช เชฐเชเซ เชเชฐเซ เชถเชเซ เชเซ, เชเซเชฏเชพเชฐเซ เชตเชชเชฐเชพเชถเชเชฐเซเชคเชพ เชคเซเชจเซ เช เชจเซเชชเชฒเชฌเซเชงเชคเชพเชจเซ เชจเซเชเชง เชฒเซเชคเซ เชจเชฅเซ. เชตเชชเชฐเชพเชถเชเชฐเซเชคเชพ เช เชจเซ เชเชเชชเชจเซเชจเชพ เชชเชฐเชฟเชชเซเชฐเซเชเซเชทเซเชฏเชฎเชพเช, เช เชถเซเชฐเซเชทเซเช เชธเชเชญเชตเชฟเชค เชกเชฟเชชเซเชฒเซเชฏเชฎเซเชจเซเช เชฆเซเชถเซเชฏ เชเซ เชเชพเชฐเชฃ เชเซ เชคเซ เชจเชตเซ เชธเซเชตเชฟเชงเชพเช เชฐเชเซ เชเชฐเชตเชพเชจเซ เชฎเชเชเซเชฐเซ เชเชชเซ เชเซ เช เชจเซ เชฌเชเซเชธเชจเซ เชตเชฟเชเซเชทเซเชช เชตเชฟเชจเชพ เช เซเช เชเชฐเชตเชพเชจเซ เชฎเชเชเซเชฐเซ เชเชชเซ เชเซ.
เช เชเซเชตเซ เชฐเซเชคเซ เชนเชพเชเชธเชฒ เชเชฐเชตเซเช? เชคเซเชฏเชพเช เชเชฃเซ เชฐเซเชคเซ เชเซ, เชคเซเชฎเชพเชเชฅเซ เชเช เช เชนเซเช เชเซ:
- เชคเชฎเชพเชฐเซ เชธเซเชตเชพเชจเชพ เชธเชเชธเซเชเชฐเชฃ เชจเชเชฌเชฐ 1 เชจเซ เชเชชเชฏเซเช เชเชฐเซ
- เชกเซเชเชพเชฌเซเช เชธเซเชฅเชณเชพเชเชคเชฐ เชเชฐเซ
- เชธเชเชธเซเชเชฐเชฃ #2 เชจเซ เชธเชฎเชพเชเชคเชฐ เชคเชฎเชพเชฐเซ เชธเซเชตเชพเชจเชพ เชธเชเชธเซเชเชฐเชฃ #1 เชจเซ เชเชชเชฏเซเช เชเชฐเซ
- เชเชฒเชฆเซ เชคเชฎเซ เชเซเช เชเซ เชธเชเชธเซเชเชฐเชฃ เชจเชเชฌเชฐ 2 เชคเซ เชเซเชเช เชคเซ เชชเซเชฐเชฎเชพเชฃเซ เชเชพเชฐเซเชฏ เชเชฐเซ เชเซ, เชธเชเชธเซเชเชฐเชฃ เชจเชเชฌเชฐ 1 เชฆเซเชฐ เชเชฐเซ
- เชฅเช เชเชฏเซเช!
เชธเชฐเชณ, เชคเซ เชจเชฅเซ? เชเชฎเชจเชธเซเชฌเซ, เชคเซ เชเชเชฒเซเช เชธเชฐเชณ เชจเชฅเซ, เช เชจเซ เช เชฎเซ เชคเซเชจเซ เชชเชเซเชฅเซ เชตเชฟเชเชคเชตเชพเชฐ เชเซเชเชถเซเช. เชนเชตเซ เชเชพเชฒเซ เชฌเซเชเซ เชเชเชฆเชฎ เชธเชพเชฎเชพเชจเซเชฏ เชเชฎเชพเชตเช เชชเซเชฐเชเซเชฐเชฟเชฏเชพ เชคเชชเชพเชธเซเช - เชตเชพเชฆเชณเซ เชฒเซเชฒเชพ เชเชฎเชพเชตเช.
เชถเซเช เชคเชฎเซ เชเซเชฏเชพเชฐเซเชฏ เชธเชพเชเชญเชณเซเชฏเซเช เชเซ
- เชเชพเชคเชฐเซ เชเชฐเซ เชเซ เชคเชฎเชพเชฐเชพ เชเชคเซเชชเชพเชฆเชจ เชเซเชกเชจเซ เชฌเซ เชจเชเชฒเซ ("เชตเชพเชฆเชณเซ" เช เชจเซ "เชฒเซเชฒเซ") เชเชพเชฎ เชเชฐเซ เชเซ;
- เชคเชฎเชพเชฎ เชเซเชฐเชพเชซเชฟเชเชจเซ เชตเชพเชฆเชณเซ เชตเชพเชคเชพเชตเชฐเชฃ เชคเชฐเชซ เชฆเชฟเชถเชพเชฎเชพเชจ เชเชฐเซ, เชเชเชฒเซ เชเซ. เชเซเชฅเซ เชเชคเซเชชเชพเชฆเชจ URL เชคเซเชฏเชพเช เชจเชฟเชฐเซเชฆเซเชถ เชเชฐเซ เชเซ;
- เชเซเชฐเซเชจ เชเชจเซเชตเชพเชฏเชฐเซเชจเชฎเซเชจเซเชเชฎเชพเช เชเชชเซเชฒเชฟเชเซเชถเชจเชจเชพ เชคเชฎเชพเชฎ เชซเซเชฐเชซเชพเชฐเซเชจเซ เชเชชเชฏเซเช เช เชจเซ เชชเชฐเซเชเซเชทเชฃ เชเชฐเซ;
- เชฏเซเชเชฐเชเชฒเชจเซ เชตเชพเชฆเชณเซเชฎเชพเชเชฅเซ เชฒเซเชฒเชพ เชตเชพเชคเชพเชตเชฐเชฃเชฎเชพเช เชธเซเชตเชฟเช เชเชฐเซ
เชฌเซเชฒเซ เชเซเชฐเซเชจ เชกเชฟเชชเซเชฒเซเชฏเชฎเซเชจเซเช เช เชเช เช เชญเชฟเชเชฎ เชเซ เชเซ เชคเชฎเชจเซ เชชเซเชฐเซเชกเชเซเชถเชจ เชฌเซเชฐเซเชเชฟเชเช เชตเชฟเชถเซ เชเชฟเชเชคเชพ เชเชฐเซเชฏเชพ เชตเชฟเชจเชพ เชธเชฐเชณเชคเชพเชฅเซ เชจเชตเซ เชธเซเชตเชฟเชงเชพเช เชฐเชเซ เชเชฐเชตเชพเชจเซ เชฎเชเชเซเชฐเซ เชเชชเซ เชเซ. เช เช เชนเชเซเชเชคเชจเซ เชเชพเชฐเชฃเซ เชเซ เชเซ เชเซ เชเชเชเช เชฅเชพเชฏ เชคเซ เชชเชฃ, เชคเชฎเซ "เชธเซเชตเซเชเชจเซ เชซเซเชฒเชฟเช เชเชฐเซเชจเซ" เชธเชฐเชณเชคเชพเชฅเซ เชชเชพเชเชฒเชพ เชตเชพเชคเชพเชตเชฐเชฃเชฎเชพเช เชชเชพเชเชพ เชซเชฐเซ เชถเชเซ เชเซ.
เชเชชเชฐเซเชเซเชค เชคเชฎเชพเชฎ เชตเชพเชเชเซเชฏเชพ เชชเชเซ, เชคเชฎเซ เชชเซเชฐเชถเซเชจ เชชเซเชเซ เชถเชเซ เชเซ: เชตเชพเชฆเชณเซ เชฒเซเชฒเชพ เชเชฎเชพเชตเช เชธเชพเชฅเซ เชถเซเชจเซเชฏ เชกเชพเชเชจเชเชพเชเชฎเชจเซ เชถเซเช เชธเชเชฌเชเชง เชเซ?
เช เซเช เชเซ, เชคเซเชเชฎเชพเช เชเชฃเซเช เชธเชพเชฎเซเชฏ เชเซ, เชเชพเชฐเชฃ เชเซ เชธเชฎเชพเชจ เชตเชพเชคเชพเชตเชฐเชฃเชจเซ เชฌเซ เชจเชเชฒเซ เชเชพเชณเชตเชตเชพ เชฎเชพเชเซ เชคเซเชฎเชจเซ เชเชพเชณเชตเชตเชพ เชฎเชพเชเซ เชฌเชฎเชฃเชพ เชชเซเชฐเชฏเชคเซเชจเซเชจเซ เชเชฐเซเชฐ เชชเชกเซ เชเซ. เช เชเชพเชฐเชฃเซ เชเซเชเชฒเซเช เชเซเชฎเซ เชฆเชพเชตเซ เชเชฐเซ เชเซ
เชฌเซเชเซ เชตเชฟเชเชฒเซเชช เช เช เชกเซเชเชพเชฌเซเชเชจเซ เชเชชเชฏเซเช เชเชฐเชตเชพเชจเซ เชเซ, เชตเซเชฌ เช เชจเซ เชกเซเชฎเซเชจ เชธเซเชคเชฐเซ เชฎเชพเชเซ เชตเชพเชฆเชณเซ-เชฒเซเชฒเชพ เชธเซเชตเซเชเซ เชฌเชจเชพเชตเซเชจเซ. เช เช เชญเชฟเชเชฎเชฎเชพเช, เชกเซเชเชพเชฌเซเช เชเชฃเซเชตเชพเชฐ เชธเชฎเชธเซเชฏเชพ เชฌเชจเซ เชถเชเซ เชเซ, เชเชพเชธ เชเชฐเซเชจเซ เชเซเชฏเชพเชฐเซ เชคเชฎเชพเชฐเซ เชธเซเชซเซเชเชตเซเชฐเชจเชพ เชจเชตเชพ เชธเชเชธเซเชเชฐเชฃเชจเซ เชธเชฎเชฐเซเชฅเชจ เชเชชเชตเชพ เชฎเชพเชเซ เชคเซเชจเซ เชธเซเชเซเชฎเชพ เชฌเชฆเชฒเชตเชพเชจเซ เชเชฐเซเชฐ เชนเซเชฏ.
เช เชจเซ เช เชนเซเช เชเชชเชฃเซ เช เชฒเซเชเชฎเชพเช เชฎเซเชเซเชฏ เชธเชฎเชธเซเชฏเชพ เชชเชฐ เชเชตเซเช เชเซเช. เชกเซเชเชพเชฌเซเช. เชเชพเชฒเซ เช เชตเชพเชเซเชฏ เชชเชฐ เชฌเซเชเซ เชจเชเชฐ เชเชฐเซเช.
เชกเซเชเชพเชฌเซเช เชธเซเชฅเชณเชพเชเชคเชฐ เชเชฐเซ.
เชนเชตเซ เชคเชฎเชพเชฐเซ เชคเชฎเชพเชฐเซ เชเชพเชคเชจเซ เชชเซเชฐเชถเซเชจ เชชเซเชเชตเซ เชชเชกเชถเซ - เชเซ เชกเซเชเชพเชฌเซเช เชซเซเชฐเชซเชพเชฐ เชชเชพเชเชณเชจเซ เชคเชฐเชซ เชธเซเชธเชเชเชค เชจ เชนเซเชฏ เชคเซ เชถเซเช? เชถเซเช เชเชชเซเชฒเชฟเชเซเชถเชจเชจเซเช เชฎเชพเชฐเซเช เชชเซเชฐเชฅเชฎ เชธเชเชธเซเชเชฐเชฃ เชคเซเชเซ เชเชถเซ เชจเชนเซเช? เชตเชพเชธเซเชคเชตเชฎเชพเช, เชเชตเซเช เช เชฅเชถเซ...
เชคเซเชฅเซ, เชถเซเชจเซเชฏ เชกเชพเชเชจเชเชพเชเชฎ / เชฌเซเชฒเซ เชเซเชฐเซเชจ เชกเชฟเชชเซเชฒเซเชฏเชฎเซเชจเซเชเชจเชพ เชตเชฟเชถเชพเชณ เชฒเชพเชญเซ เชนเซเชตเชพ เชเชคเชพเช, เชเชเชชเชจเซเช เชคเซเชฎเชจเซ เชเชชเซเชฒเชฟเชเซเชถเชจเซ เชเชฎเชพเชตเชตเชพ เชฎเชพเชเซ เชจเซเชเซเชจเซ เชธเซเชฐเชเซเชทเชฟเชค เชชเซเชฐเชเซเชฐเชฟเชฏเชพเชจเซ เช เชจเซเชธเชฐเชตเชพเชจเซเช เชตเชฒเชฃ เชงเชฐเชพเชตเซ เชเซ:
- เชเชชเซเชฒเชฟเชเซเชถเชจเชจเชพ เชจเชตเชพ เชธเชเชธเซเชเชฐเชฃ เชธเชพเชฅเซ เชชเซเชเซเช เชคเซเชฏเชพเชฐ เชเชฐเซ
- เชเชพเชฒเซ เชฐเชนเซเชฒ เชเชชเซเชฒเชฟเชเซเชถเชจเชจเซ เชฌเชเชง เชเชฐเซ
- เชกเซเชเชพเชฌเซเชเชจเซ เชธเซเชฅเชพเชจเชพเชเชคเชฐเชฟเชค เชเชฐเชตเชพ เชฎเชพเชเซ เชธเซเชเซเชฐเชฟเชชเซเชเซ เชเชฒเชพเชตเซ
- เชเชชเซเชฒเชฟเชเซเชถเชจเชจเซเช เชจเชตเซเช เชตเชฐเซเชเชจ เชเชฎเชพเชตเชตเซเช เช เชจเซ เชฒเซเชจเซเช เชเชฐเชตเซเช
เช เชฒเซเชเชฎเชพเช, เช เชฎเซ เชตเชฟเชเชค เชเชชเซเชถเซเช เชเซ เชคเชฎเซ เชถเซเชจเซเชฏ เชกเชพเชเชจเชเชพเชเชฎ เชเชฎเชพเชตเชเชจเซ เชฒเชพเชญ เชฒเซเชตเชพ เชฎเชพเชเซ เชคเชฎเชพเชฐเชพ เชกเซเชเชพเชฌเซเช เช เชจเซ เชเซเชก เชธเชพเชฅเซ เชเซเชตเซ เชฐเซเชคเซ เชเชพเชฐเซเชฏ เชเชฐเซ เชถเชเซ เชเซ.
เชกเซเชเชพเชฌเซเช เชธเชฎเชธเซเชฏเชพเช
เชเซ เชคเชฎเชพเชฐเซ เชชเชพเชธเซ เชธเซเชเซเชเชฒเซเชธ เชเชชเซเชฒเชฟเชเซเชถเชจ เชเซ เชเซ เชกเซเชเชพเชฌเซเชเชฎเชพเช เชเซเชเชชเชฃ เชกเซเชเชพ เชธเซเชเซเชฐ เชเชฐเชคเซ เชจเชฅเซ, เชคเซ เชคเชฎเซ เชคเชฐเชค เช เชถเซเชจเซเชฏ เชกเชพเชเชจเชเชพเชเชฎ เชเชฎเชพเชตเช เชฎเซเชณเชตเซ เชถเชเซ เชเซ. เชเชฎเชจเชธเซเชฌเซ, เชฎเซเชเชพเชญเชพเชเชจเชพ เชธเซเชซเซเชเชตเซเชฐเชจเซ เชเซเชฏเชพเชเช เชกเซเชเชพ เชธเซเชเซเชฐ เชเชฐเชตเชพเชจเซ เชเชฐเซเชฐ เชเซ. เชเชฅเซ เชคเชฎเชพเชฐเซ เชธเชฐเซเชเชฟเชเชฎเชพเช เชเซเชเชชเชฃ เชซเซเชฐเชซเชพเชฐ เชเชฐเชคเชพ เชชเชนเซเชฒเชพ เชฌเซ เชตเชพเชฐ เชตเชฟเชเชพเชฐเชตเซเช เชเซเชเช. เชธเซเชเซเชฎเชพ เชเซเชตเซ เชฐเซเชคเซ เชฌเชฆเชฒเชตเซ เชคเซเชจเซ เชตเชฟเชเชคเซเชฎเชพเช เชชเซเชฐเชตเซเชถเชคเชพ เชชเชนเซเชฒเชพ, เชเซเชฅเซ เชจเซ-เชกเชพเชเชจเชเชพเชเชฎ เชกเชฟเชชเซเชฒเซเชฏเชฎเซเชจเซเช เชถเชเซเชฏ เชฌเชจเซ, เชเชพเชฒเซ เชชเชนเซเชฒเชพ เชตเชฐเซเชเชจเชฟเชเช เชธเซเชเซเชฎเชพ เชชเชฐ เชงเซเชฏเชพเชจ เชเซเชจเซเชฆเซเชฐเชฟเชค เชเชฐเซเช.
เชธเชเชธเซเชเชฐเชฃ เชฏเซเชเชจเชพ
เช เชฒเซเชเชฎเชพเช เชเชชเชฃเซ เชเชชเชฏเซเช เชเชฐเซเชถเซเช classpath:db/migration
). เช
เชนเซเช เชคเชฎเซ เชเชตเซ เชธเซเชฅเชณเชพเชเชคเชฐ เชซเชพเชเชฒเซเชจเซเช เชเชฆเชพเชนเชฐเชฃ เชเซเช เชถเชเซ เชเซ
โโโ db
โโโ migration
โโโ V1__init.sql
โโโ V2__Add_surname.sql
โโโ V3__Final_migration.sql
โโโ V4__Remove_lastname.sql
เช เชเชฆเชพเชนเชฐเชฃเชฎเชพเช เชเชชเชฃเซ 4 เชธเซเชฅเชณเชพเชเชคเชฐ เชธเซเชเซเชฐเชฟเชชเซเชเซ เชเซเชเช เชเซเช เชเซ, เชเซ เช
เชเชพเช เชเชเซเชเชฟเชเซเชฏเซเช เชเชฐเชตเชพเชฎเชพเช เชเชตเซ เชจ เชนเซเชฏ, เชคเซ เชเซเชฏเชพเชฐเซ เชเชชเซเชฒเชฟเชเซเชถเชจ เชถเชฐเซ เชฅเชถเซ เชคเซเชฏเชพเชฐเซ เชเช เชชเชเซ เชเช เชเชฒเชพเชตเชตเชพเชฎเชพเช เชเชตเชถเซ. เชเชพเชฒเซ เชเช เชซเชพเชเชฒเซ เชเซเชเช (V1__init.sql
) เชเชฆเชพเชนเชฐเชฃ เชคเชฐเซเชเซ.
CREATE TABLE PERSON (
id BIGINT GENERATED BY DEFAULT AS IDENTITY,
first_name varchar(255) not null,
last_name varchar(255) not null
);
insert into PERSON (first_name, last_name) values ('Dave', 'Syer');
เชฌเชงเซเช เชธเชเชชเซเชฐเซเชฃเชชเชฃเซ เชธเซเชต-เชธเซเชชเชทเซเชเซเชเชฐเชฃ เชเซ: เชคเชฎเซ เชคเชฎเชพเชฐเชพ เชกเซเชเชพเชฌเซเชเชจเซ เชเซเชตเซ เชฐเซเชคเซ เชธเชเชถเซเชงเชฟเชค เชเชฐเชตเซเช เชเซเชเช เชคเซ เชตเซเชฏเชพเชเซเชฏเชพเชฏเชฟเชค เชเชฐเชตเชพ เชฎเชพเชเซ SQL เชจเซ เชเชชเชฏเซเช เชเชฐเซ เชถเชเซ เชเซ. เชธเซเชชเซเชฐเชฟเชเช เชฌเซเช เช
เชจเซ เชซเซเชฒเชพเชฏเชตเซ เชตเชฟเชถเซ เชตเชงเซ เชฎเชพเชนเชฟเชคเซ เชฎเชพเชเซ, เชคเชชเชพเชธเซ
เชธเซเชชเซเชฐเชฟเชเช เชฌเซเช เชธเชพเชฅเซ เชธเซเชคเซเชฐเซเชค เชจเชฟเชฏเชเชคเซเชฐเชฃ เชธเชพเชงเชจเชจเซ เชเชชเชฏเซเช เชเชฐเซเชจเซ, เชคเชฎเชจเซ 2 เชฎเซเชเชพ เชฒเชพเชญเซ เชฎเชณเซ เชเซ:
- เชคเชฎเซ เชกเซเชเชพเชฌเซเชเชจเชพ เชซเซเชฐเชซเชพเชฐเซเชจเซ เชเซเชก เชซเซเชฐเชซเชพเชฐเซเชฅเซ เช เชฒเช เชเชฐเซ เชเซ
- เชกเซเชเชพเชฌเซเช เชธเซเชฅเชณเชพเชเชคเชฐ เชคเชฎเชพเชฐเซ เชเชชเซเชฒเชฟเชเซเชถเชจเชจเชพ เชฐเซเชฒเชเชเช เชธเชพเชฅเซ เชฅเชพเชฏ เชเซ, เชเชเชฒเซ เชเซ. เชคเชฎเชพเชฐเซ เชเชฎเชพเชตเช เชชเซเชฐเชเซเชฐเชฟเชฏเชพ เชธเชฐเชณ เชเซ
เชกเซเชเชพเชฌเซเช เชธเชฎเชธเซเชฏเชพเชเชจเซเช เชจเชฟเชตเชพเชฐเชฃ
เชฒเซเชเชจเชพ เชเชเชฒเชพ เชตเชฟเชญเชพเชเชฎเชพเช, เช เชฎเซ เชกเซเชเชพเชฌเซเช เชซเซเชฐเชซเชพเชฐเซ เชฎเชพเชเซเชจเชพ เชฌเซ เช เชญเชฟเชเชฎเซ เชชเชฐ เชงเซเชฏเชพเชจ เชเซเชจเซเชฆเซเชฐเชฟเชค เชเชฐเซเชถเซเช.
- เชชเชเชพเชค เช เชธเชเชเชคเชคเชพ
- เชชเชเชพเชค เชธเซเชธเชเชเชคเชคเชพ
เชชเซเชฐเชฅเชฎ เชเซเชคเชตเชฃเซ เชคเชฐเซเชเซ เชเชฃเชตเชพเชฎเชพเช เชเชตเชถเซ เชเซ เชคเชฎเชพเชฐเซ เชชเซเชฐเชพเชฐเชเชญเชฟเช เชคเซเชฏเชพเชฐเซ เชตเชฟเชจเชพ เชถเซเชจเซเชฏ เชกเชพเชเชจเชเชพเชเชฎ เชเชฎเชพเชตเช เชเชฐเชตเซ เชเซเชเช เชจเชนเซเช... เชฌเซเชเซ เชเช เชเชเซเชฒ เชเชชเซ เชเซ เชเซ เชคเชฎเซ เชเซเชตเซ เชฐเซเชคเซ เชกเชพเชเชจเชเชพเชเชฎ เชตเชฟเชจเชพ เชเชฎเชพเชตเช เชเชฐเซ เชถเชเซ เชเซ เช เชจเซ เชคเซ เช เชธเชฎเชฏเซ เชชเชเชพเชค เชธเซเชธเชเชเชคเชคเชพ เชเชพเชณเชตเซ เชถเชเซ เชเซ.
เช
เชฎเชพเชฐเซ เชชเซเชฐเซเชเซเชเซเช เช
เชฎเซ เชเซเชจเชพ เชชเชฐ เชเชพเชฎ เชเชฐเซเชถเซเช เชคเซ เชเช เชธเชฐเชณ เชธเซเชชเซเชฐเชฟเชเช เชฌเซเช เชซเซเชฒเชพเชฏเชตเซ เชเชชเซเชฒเชฟเชเซเชถเชจ เชนเชถเซ เชเซเชฎเชพเช เชเซ Person
ั first_name
ะธ last_name
เชกเซเชเชพเชฌเซเชเชฎเชพเช (เชเชถเชฐเซ เช
เชจเซเชตเชพเชฆ: Person
เชเช เชเซเชฌเชฒ เชเซ เช
เชจเซ เชเชซirst_name
ะธ last_name
- เช เชคเซเชฎเชพเชเชจเชพ เชเซเชทเซเชคเซเชฐเซ เชเซ). เช
เชฎเซ เชจเชพเชฎ เชฌเชฆเชฒเชตเชพ เชฎเชพเชเชเซเช เชเซเช last_name
ะฒ surname
.
เชงเชพเชฐเชฃเชพ
เช เชฎเซ เชตเชฟเชเชคเซเชฎเชพเช เชชเซเชฐเชตเซเชถเชคเชพ เชชเชนเซเชฒเชพ, เช เชฎเชพเชฐเซ เช เชฐเชเซเช เชตเชฟเชถเซ เช เชฎเชพเชฐเซ เชเซเชเชฒเซเช เชงเชพเชฐเชฃเชพเช เชเชฐเชตเชพเชจเซ เชเชฐเซเชฐ เชเซ. เช เชฎเซ เชเซ เชฎเซเชเซเชฏ เชชเชฐเชฟเชฃเชพเชฎ เชชเซเชฐเชพเชชเซเชค เชเชฐเชตเชพ เชฎเชพเชเชเซเช เชเซเช เชคเซ เชเชเชฆเชฎ เชธเชฐเชณ เชชเซเชฐเชเซเชฐเชฟเชฏเชพ เชนเชถเซ.
เชจเซเชเชง. เชตเซเชฏเชตเชธเชพเชฏ เชชเซเชฐเซ-เชเซเชช. เชชเซเชฐเชเซเชฐเชฟเชฏเชพเชเชจเซ เชธเชฐเชณ เชฌเชจเชพเชตเชตเชพเชฅเซ เชคเชฎเซ เชธเชชเซเชฐเซเช เชชเชฐ เชเชฃเชพ เชชเซเชธเชพ เชฌเชเชพเชตเซ เชถเชเซ เชเซ (เชคเชฎเซ เชคเชฎเชพเชฐเซ เชเชเชชเชจเซ เชฎเชพเชเซ เชเซเชเชฒเชพ เชตเชงเซ เชฒเซเชเซ เชเชพเชฎ เชเชฐเชถเซ, เชคเซเชเชฒเชพ เชตเชงเซ เชชเซเชธเชพ เชคเชฎเซ เชฌเชเชพเชตเซ เชถเชเชถเซ)!
เชกเซเชเชพเชฌเซเชเชจเซ เชฐเซเชฒเชฌเซเช เชเชฐเชตเชพเชจเซ เชเชฐเซเชฐ เชจเชฅเซ
เช เชเชฎเชพเชตเช เชชเซเชฐเชเซเชฐเชฟเชฏเชพเชจเซ เชธเชฐเชณ เชฌเชจเชพเชตเซ เชเซ (เชเซเชเชฒเชพเช เชกเซเชเชพเชฌเซเช เชฐเซเชฒเชฌเซเช เชฒเชเชญเช เช เชถเชเซเชฏ เชเซ, เชเซเชฎ เชเซ เชเชพเชขเซ เชจเชพเชเชตเซเช เชฐเซเชฒเชฌเซเช). เช เชฎเซ เชซเชเซเชค เชเชชเซเชฒเชฟเชเซเชถเชเชธเชจเซ เชฐเซเชฒ เชฌเซเช เชเชฐเชตเชพเชจเซเช เชชเชธเชเชฆ เชเชฐเซเช เชเซเช. เช เชฐเซเชคเซ, เชเซ เชคเชฎเชพเชฐเซ เชชเชพเชธเซ เช เชฒเช เช เชฒเช เชกเซเชเชพเชฌเซเช เชนเซเชฏ เชคเซ เชชเชฃ (เชเชฆเชพเชนเชฐเชฃ เชคเชฐเซเชเซ, SQL เช เชจเซ NoSQL), เชคเชฎเชพเชฐเซ เชกเชฟเชชเซเชฒเซเชฏเชฎเซเชจเซเช เชชเชพเชเชชเชฒเชพเชเชจ เชธเชฎเชพเชจ เชฆเซเชเชพเชถเซ.
เชเชชเซเชฒเชฟเชเซเชถเชจเชจเซ เชเช เชตเชฐเซเชเชจ เชชเชพเชเซเช เชฐเซเชฒ เชฌเซเช เชเชฐเชตเซเช เชนเชเชฎเซเชถเชพ เชถเชเซเชฏ เชนเซเชตเซเช เชเซเชเช (เชตเชงเซ เชจเชนเซเช)
เชเซเชฏเชพเชฐเซ เชเชฐเซเชฐเซ เชนเซเชฏ เชคเซเชฏเชพเชฐเซ เช เชฐเซเชฒเชฌเซเช เชเชฐเชตเซเช เชเซเชเช. เชเซ เชตเชฐเซเชคเชฎเชพเชจ เชธเชเชธเซเชเชฐเชฃเชฎเชพเช เชเซเช เชญเซเชฒ เชเซ เชเซ เชธเชฐเชณเชคเชพเชฅเซ เชธเซเชงเชพเชฐเซเชฒ เชจเชฅเซ, เชคเซ เช เชฎเซ เชจเชตเซเชจเชคเชฎ เชเชพเชฐเซเชฏเชเชพเชฐเซ เชธเชเชธเซเชเชฐเชฃ เชชเชฐ เชชเชพเชเชพ เชซเชฐเชตเชพ เชธเชเซเชทเชฎ เชนเซเชตเชพ เชเซเชเช. เช เชฎเซ เชงเชพเชฐเซเช เชเซเช เชเซ เช เชจเชตเซเชจเชคเชฎ เชเชพเชฐเซเชฏเชเชพเชฐเซ เชธเชเชธเซเชเชฐเชฃ เช เชเชพเชเชจเซเช เชเซ. เชเช เชเชฐเชคเชพเช เชตเชงเซ เชฐเซเชฒเชเชเช เชฎเชพเชเซ เชเซเชก เช เชจเซ เชกเซเชเชพเชฌเซเช เชธเซเชธเชเชเชคเชคเชพ เชเชพเชณเชตเชตเซ เช เชคเซเชฏเชเชค เชฎเซเชถเซเชเซเชฒ เช เชจเซ เชเชฐเซเชเชพเชณ เชนเชถเซ.
เชจเซเชเชง. เชตเชงเซ เชตเชพเชเชเชจเชเซเชทเชฎเชคเชพ เชฎเชพเชเซ, เช เชฒเซเชเชฎเชพเช เช เชฎเซ เชเชชเซเชฒเชฟเชเซเชถเชจเชจเชพ เชฎเซเชเซเชฏ เชธเชเชธเซเชเชฐเชฃเชจเซ เชฌเชฆเชฒเซเชถเซเช.
เชชเชเชฒเซเช 1: เชชเซเชฐเชพเชฐเชเชญเชฟเช เชธเซเชฅเชฟเชคเชฟ
เชเชชเซเชฒเชฟเชเซเชถเชจ เชธเชเชธเซเชเชฐเชฃ: 1.0.0
DB เชธเชเชธเซเชเชฐเชฃ: v1
เชเชฟเชชเซเชชเชฃเซ
เช เชเชชเซเชฒเชฟเชเซเชถเชจเชจเซ เชชเซเชฐเชพเชฐเชเชญเชฟเช เชธเซเชฅเชฟเชคเชฟ เชนเชถเซ.
เชกเซเชเชพเชฌเซเช เชซเซเชฐเชซเชพเชฐเซ
DB เชธเชฎเชพเชตเซ เชเซ last_name.
CREATE TABLE PERSON (
id BIGINT GENERATED BY DEFAULT AS IDENTITY,
first_name varchar(255) not null,
last_name varchar(255) not null
);
insert into PERSON (first_name, last_name) values ('Dave', 'Syer');
เชเซเชก เชซเซเชฐเชซเชพเชฐเซ
เชเชชเซเชฒเชฟเชเซเชถเชจ เชตเซเชฏเชเซเชคเชฟเชจเชพ เชกเซเชเชพเชจเซ เชคเซเชฎเชพเช เชธเชเชเซเชฐเชนเชฟเชค เชเชฐเซ เชเซ last_name
:
/*
* Copyright 2012-2016 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package sample.flyway;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
@Entity
public class Person {
@Id
@GeneratedValue
private Long id;
private String firstName;
private String lastName;
public String getFirstName() {
return this.firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return this.lastName;
}
public void setLastName(String lastname) {
this.lastName = lastname;
}
@Override
public String toString() {
return "Person [firstName=" + this.firstName + ", lastName=" + this.lastName
+ "]";
}
}
เชชเชพเชเชณเชจเซ เชคเชฐเชซ เช เชธเชเชเชค เชเซเชฒเชฎเชจเซเช เชจเชพเชฎ เชฌเชฆเชฒเชตเซเช
เชเชพเชฒเซ เชเซเชฒเชฎเชจเซเช เชจเชพเชฎ เชเซเชตเซ เชฐเซเชคเซ เชฌเชฆเชฒเชตเซเช เชคเซเชจเซเช เชเชฆเชพเชนเชฐเชฃ เชเซเชเช:
เชงเซเชฏเชพเชจ. เชจเซเชเซเชจเซเช เชเชฆเชพเชนเชฐเชฃ เชเชฐเชพเชฆเชพเชชเซเชฐเซเชตเช เชตเชธเซเชคเซเชเชจเซ เชคเซเชกเซ เชจเชพเชเชถเซ. เช เชฎเซ เชกเซเชเชพเชฌเซเช เชธเซเชธเชเชเชคเชคเชพเชจเซ เชธเชฎเชธเซเชฏเชพเชจเซ เชฆเชฐเซเชถเชพเชตเชตเชพ เชฎเชพเชเซ เช เชฌเชคเชพเชตเซเช เชเซเช.
เชเชชเซเชฒเชฟเชเซเชถเชจ เชธเชเชธเซเชเชฐเชฃ: 2.0.0.BAD
DB เชธเชเชธเซเชเชฐเชฃ: v2bad
เชเชฟเชชเซเชชเชฃเซ
เชตเชฐเซเชคเชฎเชพเชจ เชซเซเชฐเชซเชพเชฐเซ เช เชฎเชจเซ เชเช เช เชธเชฎเชฏเซ เชฌเซ เชเชฆเชพเชนเชฐเชฃเซ (เชเซเชจเชพ เช เชจเซ เชจเชตเชพ) เชเชฒเชพเชตเชตเชพเชจเซ เชฎเชเชเซเชฐเซ เชเชชเชคเชพ เชจเชฅเซ. เชเชฎ, เชถเซเชจเซเชฏ เชกเชพเชเชจเชเชพเชเชฎ เชเชฎเชพเชตเช เชนเชพเชเชธเชฒ เชเชฐเชตเซ เชฎเซเชถเซเชเซเชฒ เชนเชถเซ (เชเซ เชงเชพเชฐเชฃเชพเชเชจเซ เชงเซเชฏเชพเชจเชฎเชพเช เชฒเซเชตเชพเชฎเชพเช เชเชตเซ, เชคเซ เชคเซ เชเชฐเซเชเชฐ เช เชถเชเซเชฏ เชเซ).
A/B เชชเชฐเซเชเซเชทเชฃ
เชตเชฐเซเชคเชฎเชพเชจ เชชเชฐเชฟเชธเซเชฅเชฟเชคเชฟ เช เชเซ เชเซ เช
เชฎเชพเชฐเซ เชชเชพเชธเซ เชเชชเซเชฒเชฟเชเซเชถเชจ เชธเชเชธเซเชเชฐเชฃ เชเซ 1.0.0,
เชเชคเซเชชเชพเชฆเชจ เช
เชจเซ เชกเซเชเชพเชฌเซเชเชฎเชพเช เชคเซเชจเชพเชค v1
. เช
เชฎเชพเชฐเซ เชเชชเซเชฒเชฟเชเซเชถเชจ, เชธเชเชธเซเชเชฐเชฃเชจเซ เชฌเซเชเซ เชฆเชพเชเชฒเซ เชเชฎเชพเชตเชตเชพเชจเซ เชเชฐเซเชฐ เชเซ 2.0.0.BAD
, เช
เชจเซ เชกเซเชเชพเชฌเซเชเชจเซ เช
เชชเชกเซเช เชเชฐเซ v2bad
.
เชชเชเชฒเชพเช:
- เชธเชเชธเซเชเชฐเชฃ เชเชชเซเชฒเชฟเชเซเชถเชจเชจเซ เชจเชตเซ เชฆเชพเชเชฒเซ เชเชฎเชพเชตเชตเชพเชฎเชพเช เชเชตเซเชฏเซ เชเซ
2.0.0.BAD
เชเซ เชกเซเชเชพเชฌเซเชเชจเซ เช เชชเชกเซเช เชเชฐเซ เชเซv2bad
- เชกเซเชเชพเชฌเซเชเชฎเชพเช
v2bad
เช columnเชฒเชฎlast_name
เชนเชตเซ เช เชธเซเชคเชฟเชคเซเชตเชฎเชพเช เชจเชฅเซ - เชคเซ เชฌเชฆเชฒเชพเช เชเชฏเซเช เชนเชคเซเชsurname
- เชกเซเชเชพเชฌเซเช เช
เชจเซ เชเชชเซเชฒเชฟเชเซเชถเชจ เช
เชชเชกเซเช เชธเชซเชณ เชฅเชฏเซเช เช
เชจเซ เชเซเชเชฒเชพเช เชเชฆเชพเชนเชฐเชฃเซ เชเชพเชฒเซ เชฐเชนเซเชฏเชพ เชเซ
1.0.0
, เช เชจเซเชฏ - เชฎเชพเช2.0.0.BAD
. เชฌเชงเซเช เชกเซเชเชพเชฌเซเช เชธเชพเชฅเซ เชเซเชกเชพเชฏเซเชฒ เชเซv2bad
- เชธเชเชธเซเชเชฐเชฃเชจเชพ เชคเชฎเชพเชฎ เชเชฆเชพเชนเชฐเชฃเซ
1.0.0
เชญเซเชฒเซ เชซเซเชเชเชตเชพเชจเซเช เชถเชฐเซ เชเชฐเชถเซ เชเชพเชฐเชฃ เชเซ เชคเซเช เชเซเชฒเชฎเชฎเชพเช เชกเซเชเชพ เชฆเชพเชเชฒ เชเชฐเชตเชพเชจเซ เชชเซเชฐเชฏเชพเชธ เชเชฐเชถเซlast_name
เชเซเช เชนเชตเซ เช เชธเซเชคเชฟเชคเซเชตเชฎเชพเช เชจเชฅเซ - เชธเชเชธเซเชเชฐเชฃเชจเชพ เชคเชฎเชพเชฎ เชเชฆเชพเชนเชฐเชฃเซ
2.0.0.BAD
เชธเชฎเชธเซเชฏเชพ เชตเชฟเชจเชพ เชเชพเชฎ เชเชฐเชถเซ
เชเซเชฎ เชคเชฎเซ เชเซเช เชถเชเซ เชเซ, เชเซ เชเชชเชฃเซ เชกเซเชเชพเชฌเซเช เช เชจเซ เชเชชเซเชฒเชฟเชเซเชถเชจเชฎเชพเช เชชเชพเชเชณเชจเซ เชคเชฐเชซ เช เชธเชเชเชค เชซเซเชฐเชซเชพเชฐเซ เชเชฐเซเช, เชคเซ A/B เชชเชฐเซเชเซเชทเชฃ เช เชถเชเซเชฏ เชเซ.
เชเชชเซเชฒเชฟเชเซเชถเชจ เชฐเซเชฒเชฌเซเช
เชเชพเชฒเซ เชงเชพเชฐเซเช เชเซ A/B เชเชฎเชพเชตเช เชเชฐเชตเชพเชจเซ เชชเซเชฐเชฏเชพเชธ เชเชฐเซเชฏเชพ เชชเชเซ (เชเชถเชฐเซ เชชเซเชฐเชคเชฟ.: เชฒเซเชเชเชจเซ เช
เชฐเซเชฅ เชเชฆเชพเช เช
เชนเซเช A/B เชชเชฐเซเชเซเชทเชฃ เชเชฐเชตเชพเชจเซ เชเซ) เช
เชฎเซ เชจเชเซเชเซ เชเชฐเซเชฏเซเช เชเซ เชเซ เช
เชฎเชพเชฐเซ เชเชชเซเชฒเซเชเซเชถเชจเชจเซ เชตเชฐเซเชเชจ เชชเชฐ เชชเชพเชเซเช เชซเซเชฐเชตเชตเชพเชจเซ เชเชฐเซเชฐ เชเซ 1.0.0.
เชเชพเชฒเซ เชเชนเซเช เชเซ เช
เชฎเซ เชกเซเชเชพเชฌเซเชเชจเซ เชฐเซเชฒเชฌเซเช เชเชฐเชตเชพ เชฎเชพเชเชเชคเชพ เชจเชฅเซ.
เชชเชเชฒเชพเช:
- เช
เชฎเซ เชธเชเชธเซเชเชฐเชฃ เชเชชเซเชฒเชฟเชเซเชถเชจ เชฆเชพเชเชฒเชพเชจเซ เชฌเชเชง เชเชฐเซเช เชเซเช
2.0.0.BAD
- เชกเซเชเชพเชฌเซเช เชนเชเซ เชชเชฃ เชเซ
v2bad
- เชเชตเซเชคเซเชคเชฟ เชฅเซ
1.0.0
เชคเซ เชถเซเช เชเซ เชคเซ เชธเชฎเชเชพเชคเซเช เชจเชฅเซsurname
, เชเชชเชฃเซ เชญเซเชฒเซ เชเซเชถเซเช - เชจเชฐเช เชเซเชเซ เชเชฏเซ เชเซ, เช เชฎเซ เชนเชตเซ เชชเชพเชเชพ เชเช เชถเชเชคเชพ เชจเชฅเซ
เชเซเชฎ เชคเชฎเซ เชเซเช เชถเชเซ เชเซ, เชเซ เช เชฎเซ เชกเซเชเชพเชฌเซเช เช เชจเซ เชเชชเซเชฒเชฟเชเซเชถเชจเชฎเชพเช เชชเชพเชเชณเชจเซ เชคเชฐเชซ เช เชธเชเชเชค เชซเซเชฐเชซเชพเชฐเซ เชเชฐเซเช เชเซเช, เชคเซ เช เชฎเซ เชชเชพเชเชฒเชพ เชธเชเชธเซเชเชฐเชฃ เชชเชฐ เชชเชพเชเชพ เชซเชฐเซ เชถเชเชคเชพ เชจเชฅเซ.
เชธเซเชเซเชฐเชฟเชชเซเช เชเชเซเชเซเชเซเชฏเซเชถเชจ เชฒเซเชเซเชธ
Backward incompatible scenario:
01) Run 1.0.0
02) Wait for the app (1.0.0) to boot
03) Generate a person by calling POST localhost:9991/person to version 1.0.0
04) Run 2.0.0.BAD
05) Wait for the app (2.0.0.BAD) to boot
06) Generate a person by calling POST localhost:9991/person to version 1.0.0 <-- this should fail
07) Generate a person by calling POST localhost:9992/person to version 2.0.0.BAD <-- this should pass
Starting app in version 1.0.0
Generate a person in version 1.0.0
Sending a post to 127.0.0.1:9991/person. This is the response:
{"firstName":"b73f639f-e176-4463-bf26-1135aace2f57","lastName":"b73f639f-e176-4463-bf26-1135aace2f57"}
Starting app in version 2.0.0.BAD
Generate a person in version 1.0.0
Sending a post to 127.0.0.1:9991/person. This is the response:
curl: (22) The requested URL returned error: 500 Internal Server Error
Generate a person in version 2.0.0.BAD
Sending a post to 127.0.0.1:9995/person. This is the response:
{"firstName":"e156be2e-06b6-4730-9c43-6e14cfcda125","surname":"e156be2e-06b6-4730-9c43-6e14cfcda125"}
เชกเซเชเชพเชฌเซเช เชซเซเชฐเชซเชพเชฐเซ
เชธเซเชฅเชณเชพเชเชคเชฐ เชธเซเชเซเชฐเชฟเชชเซเช เชเซ เชเซ เชจเชพเชฎ เชฌเชฆเชฒเชพเชฏ เชเซ last_name
ะฒ surname
เชธเซเชคเซเชฐเซเชค เชซเซเชฒเชพเชฏเชตเซ เชธเซเชเซเชฐเชฟเชชเซเช:
CREATE TABLE PERSON (
id BIGINT GENERATED BY DEFAULT AS IDENTITY,
first_name varchar(255) not null,
last_name varchar(255) not null
);
insert into PERSON (first_name, last_name) values ('Dave', 'Syer');
เชจเชพเชฎ เชฌเชฆเชฒเชคเซ เชธเซเชเซเชฐเชฟเชชเซเช last_name
.
-- This change is backward incompatible - you can't do A/B testing
ALTER TABLE PERSON CHANGE last_name surname VARCHAR;
เชเซเชก เชซเซเชฐเชซเชพเชฐเซ
เช
เชฎเซ เชเซเชทเซเชคเซเชฐเชจเซเช เชจเชพเชฎ เชฌเชฆเชฒเซเชฏเซเช เชเซ lastName
เชชเชฐ surname
.
เชชเชพเชเชณเชจเซ-เชธเซเชธเชเชเชค เชฐเซเชคเซ เชเซเชฒเชฎเชจเซเช เชจเชพเชฎ เชฌเชฆเชฒเชตเซเช
เช เชธเซเชฅเซ เชธเชพเชฎเชพเชจเซเชฏ เชชเชฐเชฟเชธเซเชฅเชฟเชคเชฟ เชเซ เชเซเชจเซ เชเชชเชฃเซ เชธเชพเชฎเชจเซ เชเชฐเซ เชถเชเซเช เชเซเช. เชเชชเชฃเซ เชชเชพเชเชณเชจเซ เชคเชฐเชซ เช เชธเชเชเชค เชซเซเชฐเชซเชพเชฐเซ เชเชฐเชตเชพเชจเซ เชเชฐเซเชฐ เชเซ. เช เชฎเซ เชชเชนเซเชฒเซเชฅเซ เช เชธเชพเชฌเชฟเชค เชเชฐเซเชฏเซเช เชเซ เชเซ เชถเซเชจเซเชฏ-เชกเชพเชเชจเชเชพเชเชฎ เชเชฎเชพเชตเช เชฎเชพเชเซ, เชเชชเชฃเซ เชตเชงเชพเชฐเชพเชจเชพ เชชเชเชฒเชพเช เชตเชฟเชจเชพ เชกเซเชเชพเชฌเซเช เชธเซเชฅเชพเชจเชพเชเชคเชฐเชฃเชจเซ เชซเชเซเชค เชฒเชพเชเซ เชจ เชเชฐเชตเซเช เชเซเชเช. เชฒเซเชเชจเชพ เช เชตเชฟเชญเชพเชเชฎเชพเช, เช เชฎเซ เชชเชเชพเชค เชธเซเชธเชเชเชคเชคเชพ เชเชพเชณเชตเซ เชฐเชพเชเซเชจเซ เชเชเซเชเชฟเชค เชชเชฐเชฟเชฃเชพเชฎ เชชเซเชฐเชพเชชเซเชค เชเชฐเชตเชพ เชฎเชพเชเซ เชกเซเชเชพเชฌเซเช เชธเซเชฅเชณเชพเชเชคเชฐ เชธเชพเชฅเซ เชเชชเซเชฒเชฟเชเซเชถเชจเชจเซ 3 เชเชฎเชพเชตเช เชเชฐเซเชถเซเช.
เชจเซเชเชง. เชฏเชพเชฆ เชเชฐเซ เชเซ เช เชฎเชพเชฐเซ เชชเชพเชธเซ เชตเชฐเซเชเชจ เชกเซเชเชพเชฌเซเช เชเซ
v1
. เชคเซเชฎเชพเช เชเซเชฒเชฎ เชเซfirst_name
ะธlast_name
. เชเชชเชฃเซ เชฌเชฆเชฒเชตเซเช เชชเชกเชถเซlast_name
เชชเชฐsurname
. เช เชฎเชพเชฐเซ เชชเชพเชธเซ เชเชช เชตเชฐเซเชเชจ เชชเชฃ เชเซ1.0.0,
เชเซเชจเซ เชนเชเซ เชเชชเชฏเซเช เชฅเชฏเซ เชจเชฅเซsurname
.
เชชเชเชฒเซเช 2: เช เชเช เชเชฎเซเชฐเซ
เชเชชเซเชฒเชฟเชเซเชถเชจ เชธเชเชธเซเชเชฐเชฃ: 2.0.0
DB เชธเชเชธเซเชเชฐเชฃ: v2
เชเชฟเชชเซเชชเชฃเซ
เชจเชตเซ เชเซเชฒเชฎ เชเชฎเซเชฐเซเชจเซ เช เชจเซ เชคเซเชจเชพ เชธเชฎเชพเชตเชฟเชทเซเชเซเชจเซ เชจเชเชฒ เชเชฐเซเชจเซ, เช เชฎเซ เชชเชพเชเชณเชจเซ เชคเชฐเชซ เชธเซเชธเชเชเชค เชกเซเชเชพเชฌเซเช เชซเซเชฐเชซเชพเชฐเซ เชฌเชจเชพเชตเซเช เชเซเช. เชคเซ เช เชธเชฎเชฏเซ, เชเซ เชเชชเชฃเซ JAR เชจเซ เชฐเซเชฒเชฌเซเช เชเชฐเซเช เช เชฅเชตเชพ เชเซเชจเซ JAR เชเชพเชฒเซ เชฐเชนเซ เชนเซเชฏ, เชคเซ เชคเซ เช เชฎเชฒ เชฆเชฐเชฎเชฟเชฏเชพเชจ เชคเซเชเซ เชเชถเซ เชจเชนเซเช.
เช เชฎเซ เชเช เชจเชตเซเช เชธเชเชธเซเชเชฐเชฃ เชฐเชเซ เชเชฐเซ เชฐเชนเซเชฏเชพเช เชเซเช
เชชเชเชฒเชพเช:
- เชจเชตเซ เชเซเชฒเชฎ เชฌเชจเชพเชตเชตเชพ เชฎเชพเชเซ เชกเซเชเชพเชฌเซเช เชธเซเชฅเชณเชพเชเชคเชฐ เชเชฐเซ
surname
. เชนเชตเซ เชคเชฎเชพเชฐเซเช DB เชธเชเชธเซเชเชฐเชฃv2
- เชจเชพ เชกเซเชเชพเชจเซ เชจเชเชฒ เชเชฐเซ
last_name
ะฒsurname
. เชงเซเชฏเชพเชจ เชเชชเซเชเซ เชเซ เชคเชฎเชพเชฐเซ เชชเชพเชธเซ เชเชเชฒเซ เชเชฃเซ เชกเซเชเชพ เชนเซเชฏ, เชคเซ เชคเชฎเชพเชฐเซ เชฌเซเช เชธเซเชฅเชพเชจเชพเชเชคเชฐเชฃเชจเซ เชงเซเชฏเชพเชจเชฎเชพเช เชฒเซเชตเซเช เชเซเชเช! - เชเซเชก เชฒเชเซ เชเซเชฏเชพเช เชคเซเช เชตเชชเชฐเชพเชฏ เชเซ เชฌเชเชจเซ ะธ ะฝะพะฒัะนเช
เชจเซ เชตเซเชฆเซเชง เชเซเชฒเชฎ เชนเชตเซ เชคเชฎเชพเชฐเซเช เชเชช เชตเชฐเซเชเชจ
2.0.0
- เชเซเชฒเชฎเชฎเชพเชเชฅเซ เชฎเซเชฒเซเชฏ เชตเชพเชเชเซ
surname
, เชเซ เชคเซ เชจเชฅเซnull
, เช เชฅเชตเชพ l เชฅเซast_name
เชเซsurname
เชเชฒเซเชฒเซเช เชจเชฅเซ. เชคเชฎเซ เชเชพเชขเซ เชถเชเซ เชเซgetLastName()
เชเซเชกเชฎเชพเชเชฅเซ, เชเชพเชฐเชฃ เชเซ เชคเซ เชเชเชเชชเซเช เชเชฐเชถเซnull
เชเซเชฏเชพเชฐเซ เชฅเซ เชคเชฎเชพเชฐเซ เช เชฐเชเซ เชชเชพเชเซ เชเซเชเชเซ3.0.0
เชฎเชพเชเซ2.0.0
.
เชเซ เชคเชฎเซ เชธเซเชชเซเชฐเชฟเชเช เชฌเซเช เชซเซเชฒเชพเชฏเชตเซเชจเซ เชเชชเชฏเซเช เชเชฐเซ เชฐเชนเซเชฏเชพเช เชเซ, เชคเซ เช เชฌเซ เชชเชเชฒเชพเช เชตเชฐเซเชเชจ เชธเซเชเชพเชฐเซเชเช
เชช เชฆเชฐเชฎเชฟเชฏเชพเชจ เชเชฐเชตเชพเชฎเชพเช เชเชตเชถเซ 2.0.0
เชเชชเซเชฒเชฟเชเซเชถเชจเซเชธ เชเซ เชคเชฎเซ เชกเซเชเชพเชฌเซเช เชตเชฐเซเชเชจเชฟเชเช เชเซเชฒ เชฎเซเชจเซเชฏเซเช
เชฒเซ เชเชฒเชพเชตเซ เชเซ, เชคเซ เชคเชฎเชพเชฐเซ เช เชเชฐเชตเชพ เชฎเชพเชเซ เชฌเซ เช
เชฒเช-เช
เชฒเช เชตเชธเซเชคเซเช เชเชฐเชตเซ เชชเชกเชถเซ (เชชเชนเซเชฒเชพ เชกเซเชฌเซ เชตเชฐเซเชเชจเชจเซ เชฎเซเชจเซเชฏเซเช
เชฒเซ เช
เชชเชกเซเช เชเชฐเซ เช
เชจเซ เชชเชเซ เชจเชตเซ เชเชชเซเชฒเชฟเชเซเชถเชจเชจเซ เชเชชเชฏเซเช เชเชฐเซ).
เชคเซ เชฎเชนเชคเซเชตเชจเซเช เชเซ. เชฏเชพเชฆ เชฐเชพเชเซ เชเซ เชจเชตเซ เชฌเชจเชพเชตเซเชฒเซ เชเซเชฒเชฎ เชจ เชเซเชเช เชนเซเช เชจเชฅเซ. เชเซ เชคเชฎเซ เชฐเซเชฒเชฌเซเช เชเชฐเซ เชเซ, เชคเซ เชเซเชจเซ เชเชชเซเชฒเชฟเชเซเชถเชจ เชจเชตเซ เชเซเชฒเชฎ เชตเชฟเชถเซ เชเชพเชฃเชคเซ เชจเชฅเซ เช เชจเซ เชคเซ เชฆเชฐเชฎเชฟเชฏเชพเชจ เชคเซเชจเซ เชเชจเซเชธเซเชเซเชฒ เชเชฐเชถเซ เชจเชนเซเช
Insert.
เชชเชฐเชเชคเซ เชเซ เชคเชฎเซ เช เช เชตเชฐเซเชง เชเชฎเซเชฐเชถเซ เช เชจเซ เชคเชฎเชพเชฐเซเช เชกเซเชฌเซ เชนเชถเซv2
, เชเชจเซ เชจเชตเซ เชเซเชฒเชฎเชจเซ เชเชฟเชเชฎเชค เชธเซเช เชเชฐเชตเชพเชจเซ เชเชฐเซเชฐ เชชเชกเชถเซ. เชเซ เชชเซเชฐเชคเชฟเชฌเชเชงเซเชจเชพ เชเชฒเซเชฒเชเชเชจ เชคเชฐเชซ เชฆเซเชฐเซ เชเชถเซ.เชคเซ เชฎเชนเชคเซเชตเชจเซเช เชเซ. เชคเชฎเชพเชฐเซ เชชเชฆเซเชงเชคเชฟ เชฆเซเชฐ เชเชฐเชตเซ เชเซเชเช
getLastName()
, เชเชพเชฐเชฃ เชเซ เชธเชเชธเซเชเชฐเชฃเชฎเชพเช3.0.0
เชเซเชกเชฎเชพเช เชเซเชฒเชฎเชจเซ เชเซเช เชเซเชฏเชพเชฒ เชจเชฅเซlast_name
. เชเชจเซ เช เชฐเซเชฅ เช เชเซ เชเซ เชคเซเชฏเชพเช เชจเชฒ เชธเซเช เชเชฐเชตเชพเชฎเชพเช เชเชตเชถเซ. เชคเชฎเซ เชชเชฆเซเชงเชคเชฟ เชเซเชกเซ เชถเชเซ เชเซ เช เชจเซ เชฎเชพเชเซ เชเซเช เชเชฎเซเชฐเซ เชถเชเซ เชเซnull
, เชชเชฐเชเชคเซ เชตเชงเซ เชธเชพเชฐเซ เชเชเซเชฒ เช เชเซ เชเซ เชคเชฐเซเชเชฎเชพเช เชคเซเชจเซ เชเชพเชคเชฐเซ เชเชฐเชตเซgetSurname()
เชคเชฎเซ เชฏเซเชเซเชฏ เชฌเชฟเชจ-เชถเซเชจเซเชฏ เชฎเซเชฒเซเชฏ เชชเชธเชเชฆ เชเชฐเซเชฏเซเช เชเซ.
A/B เชชเชฐเซเชเซเชทเชฃ
เชตเชฐเซเชคเชฎเชพเชจ เชชเชฐเชฟเชธเซเชฅเชฟเชคเชฟ เช เชเซ เชเซ เช
เชฎเชพเชฐเซ เชชเชพเชธเซ เชเชชเซเชฒเชฟเชเซเชถเชจ เชธเชเชธเซเชเชฐเชฃ เชเซ 1.0.0
, เชเชคเซเชชเชพเชฆเชจ เชชเชฐ เชคเซเชจเชพเชค, เช
เชจเซ เชกเซเชเชพเชฌเซเชเชฎเชพเช v1
. เช
เชฎเชพเชฐเซ เชธเชเชธเซเชเชฐเชฃ เชเชชเซเชฒเชฟเชเซเชถเชจเชจเซ เชฌเซเชเซ เชฆเชพเชเชฒเซ เชเชฎเชพเชตเชตเชพเชจเซ เชเชฐเซเชฐ เชเซ 2.0.0
เชเซ เชกเซเชเชพเชฌเซเชเชจเซ เช
เชชเชกเซเช เชเชฐเชถเซ v2
.
เชชเชเชฒเชพเช:
- เชธเชเชธเซเชเชฐเชฃ เชเชชเซเชฒเชฟเชเซเชถเชจเชจเซ เชจเชตเซ เชฆเชพเชเชฒเซ เชเชฎเชพเชตเชตเชพเชฎเชพเช เชเชตเซเชฏเซ เชเซ
2.0.0
เชเซ เชกเซเชเชพเชฌเซเชเชจเซ เช เชชเชกเซเช เชเชฐเซ เชเซv2
- เช เชฆเชฐเชฎเชฟเชฏเชพเชจ เชเซเชเชฒเซเช เชตเชฟเชจเชเชคเซเช เชเชตเซเชคเซเชคเชฟ เชฆเชพเชเชฒเชพเช เชฆเซเชตเชพเชฐเชพ เชชเซเชฐเชเซเชฐเชฟเชฏเชพ เชเชฐเชตเชพเชฎเชพเช เชเชตเซ เชนเชคเซ
1.0.0
- เช
เชชเชกเซเช เชธเชซเชณ เชฅเชฏเซเช เช
เชจเซ เชคเชฎเชพเชฐเซ เชชเชพเชธเซ เชตเชฐเซเชเชจ เชเชชเซเชฒเชฟเชเซเชถเชจเชจเชพ เชฌเชนเซเชตเชฟเชง เชเชพเชฒเซ เชฐเชนเซเชฒเชพ เชเชฆเชพเชนเชฐเชฃเซ เชเซ
1.0.0
เช เชจเซ เช เชจเซเชฏ เชเชตเซเชคเซเชคเชฟเช2.0.0.
เชฆเชฐเซเช เชตเซเชฏเชเซเชคเชฟ เชกเซเชเชพเชฌเซเช เชธเชพเชฅเซ เชตเชพเชคเชเซเชค เชเชฐเซ เชเซv2
- เชเชตเซเชคเซเชคเชฟ
1.0.0
เชกเซเชเชพเชฌเซเชเชฎเชพเช เช เชเช เชเซเชฒเชฎเชจเซ เชเชชเชฏเซเช เชเชฐเชคเซเช เชจเชฅเซ, เชชเชฐเชเชคเซ เชธเชเชธเซเชเชฐเชฃ2.0.0
เชเชชเชฏเซเช เชเชฐเซ เชเซ. เชคเซเช เชเชเชฌเซเชเชพ เชธเชพเชฅเซ เชฆเชเชฒ เชเชฐเชคเชพ เชจเชฅเซ, เช เชจเซ เชคเซเชฏเชพเช เชเซเช เชญเซเชฒเซ เชจ เชนเซเชตเซ เชเซเชเช. - เชเชตเซเชคเซเชคเชฟ
2.0.0
เชชเชเชพเชค เชธเซเชธเชเชเชคเชคเชพ เชธเซเชจเชฟเชถเซเชเชฟเชค เชเชฐเซเชจเซ เชเซเชจเชพ เช เชจเซ เชจเชตเชพ เชฌเชเชจเซ เชเซเชฒเชฎเชฎเชพเช เชกเซเชเชพ เชธเซเชเซเชฐ เชเชฐเซ เชเซ
เชคเซ เชฎเชนเชคเซเชตเชจเซเช เชเซ. เชเซ เชคเชฎเชพเชฐเซ เชชเชพเชธเซ เชเซเชจเซ/เชจเชตเซ เชเซเชฒเชฎเชจเชพ เชฎเซเชฒเซเชฏเซเชจเชพ เชเชงเชพเชฐเซ เชเชเชเชฎเซเชธเชจเซ เชเชฃเชคเชฐเซ เชเชฐเชคเซ เชเซเชเชชเชฃ เชเซเชตเซเชฐเซ เชนเซเชฏ, เชคเซ เชคเชฎเชพเชฐเซ เชฏเชพเชฆ เชฐเชพเชเชตเซเช เชเซเชเช เชเซ เชคเชฎเชพเชฐเซ เชชเชพเชธเซ เชนเชตเซ เชกเซเชชเซเชฒเชฟเชเซเช เชฎเซเชฒเซเชฏเซ เชเซ (เชฎเซเชเชพ เชญเชพเชเซ เชคเซเช เชนเชเซ เชชเชฃ เชธเซเชฅเชพเชจเชพเชเชคเชฐเชฟเชค เชฅเช เชฐเชนเซเชฏเชพเช เชเซ). เชเชฆเชพเชนเชฐเชฃ เชคเชฐเซเชเซ, เชเซ เชคเชฎเซ เชเชตเชพ เชตเชชเชฐเชพเชถเชเชฐเซเชคเชพเชเชจเซ เชธเชเชเซเชฏเชพเชจเซ เชเชฃเชตเชพ เชฎเชพเชเชเชคเชพ เชนเซเชต เชเซ เชเซเชฎเชจเซเช เชเซเชฒเซเชฒเซเช เชจเชพเชฎ (เชเซเชฒเชฎ เชเชฎเซ เชคเซ เชเชนเซเชตเชพเชฏ) เช เชเซเชทเชฐเชฅเซ เชถเชฐเซ เชฅเชฏเซเช เชนเซเชฏ
A
, เชชเชเซ เชกเซเชเชพ เชธเซเชฅเชณเชพเชเชคเชฐ เชชเซเชฐเซเชฃ เชฅเชพเชฏ เชคเซเชฏเชพเช เชธเซเชงเซ (old
โnew
เชเซเชฒเชฎ) เชเซ เชคเชฎเซ เชจเชตเซ เชเซเชฒเชฎ เชฎเชพเชเซ เชเซเชตเซเชฐเซ เชเชฐเซ เชเซ เชคเซ เชคเชฎเชพเชฐเซ เชชเชพเชธเซ เช เชธเชเชเชค เชกเซเชเชพ เชนเซเช เชถเชเซ เชเซ.
เชเชชเซเชฒเชฟเชเซเชถเชจ เชฐเซเชฒเชฌเซเช
เชนเชตเซ เช
เชฎเชพเชฐเซ เชชเชพเชธเซ เชเชช เชตเชฐเซเชเชจ เชเซ 2.0.0
เช
เชจเซ เชกเซเชเชพเชฌเซเช เชฎเชพเช v2
.
เชชเชเชฒเชพเช:
- เชคเชฎเชพเชฐเซ เชเชชเซเชฒเชฟเชเซเชถเชจเชจเซ เชธเชเชธเซเชเชฐเชฃ เชชเชฐ เชชเชพเชเชพ เชซเซเชฐเชตเซ
1.0.0
. - เชเชตเซเชคเซเชคเชฟ
1.0.0
เชกเซเชเชพเชฌเซเชเชฎเชพเช เชเซเชฒเชฎเชจเซ เชเชชเชฏเซเช เชเชฐเชคเซเช เชจเชฅเซsurname
, เชคเซเชฅเซ เชฐเซเชฒเชฌเซเช เชธเชซเชณ เชนเซเชตเซเช เชเซเชเช
DB เชซเซเชฐเชซเชพเชฐเซ
เชกเซเชเชพเชฌเซเช เชจเชพเชฎเชจเซ เชเซเชฒเชฎ เชงเชฐเชพเชตเซ เชเซ last_name
.
เชซเซเชฒเชพเชฏเชตเซ เชธเซเชคเซเชฐเซเชค เชธเซเชเซเชฐเชฟเชชเซเช:
CREATE TABLE PERSON (
id BIGINT GENERATED BY DEFAULT AS IDENTITY,
first_name varchar(255) not null,
last_name varchar(255) not null
);
insert into PERSON (first_name, last_name) values ('Dave', 'Syer');
เชธเซเชเซเชฐเชฟเชชเซเช เชเชฎเซเชฐเซ surname
.
เชงเซเชฏเชพเชจ. เชฏเชพเชฆ เชฐเชพเชเซ เชเซ เชคเชฎเซ เชเซ เชเซเชฒเชฎ เชเชฎเซเชฐเซ เชฐเชนเซเชฏเชพ เชเซ เชคเซเชฎเชพเช เชคเชฎเซ เชเซเชเชชเชฃ NOT NULL เช เชตเชฐเซเชงเซ เชเชฎเซเชฐเซ เชถเชเชคเชพ เชจเชฅเซ. เชเซ เชคเชฎเซ JAR เชจเซ เชฐเซเชฒเชฌเซเช เชเชฐเซ เชเซ, เชคเซ เชเซเชจเชพ เชธเชเชธเซเชเชฐเชฃเชจเซ เชเชฎเซเชฐเชตเชพเชฎเชพเช เชเชตเซเชฒเซ เชเซเชฒเชฎ เชตเชฟเชถเซ เชเซเช เชเซเชฏเชพเชฒ เชนเชถเซ เชจเชนเซเช เช เชจเซ เชคเซ เชเชชเชฎเซเชณเซ NULL เชชเชฐ เชธเซเช เชฅเช เชเชถเซ. เชเซ เชเชตเซ เชฎเชฐเซเชฏเชพเชฆเชพ เชนเซเชฏ, เชคเซ เชเซเชจเซ เชเชชเซเชฒเชฟเชเซเชถเชจ เชเชพเชฒเซ เชคเซเชเซ เชเชถเซ.
-- NOTE: This field can't have the NOT NULL constraint cause if you rollback, the old version won't know about this field
-- and will always set it to NULL
ALTER TABLE PERSON ADD surname varchar(255);
-- WE'RE ASSUMING THAT IT'S A FAST MIGRATION - OTHERWISE WE WOULD HAVE TO MIGRATE IN BATCHES
UPDATE PERSON SET PERSON.surname = PERSON.last_name
เชเซเชก เชซเซเชฐเชซเชพเชฐเซ
เช
เชฎเซ เชกเซเชเชพ เชคเชฐเซเชเซ เชธเชเชเซเชฐเชน เชเชฐเซเช เชเซเช last_name
, เช
เชจเซ เชฎเชพเช surname
. เชคเซ เช เชธเชฎเชฏเซ เช
เชฎเซ เชฅเซ เชตเชพเชเชเซเช เชเซเช last_name
, เชเชพเชฐเชฃ เชเซ เช เชเซเชฒเชฎ เชธเซเชฅเซ เชธเซเชธเชเชเชค เชเซ. เชเชฎเชพเชตเช เชชเซเชฐเชเซเชฐเชฟเชฏเชพ เชฆเชฐเชฎเชฟเชฏเชพเชจ, เชเซเชเชฒเซเช เชตเชฟเชจเชเชคเซเช เชเชชเซเชฒเชฟเชเซเชถเชจเชจเชพ เชฆเชพเชเชฒเชพ เชฆเซเชตเชพเชฐเชพ เชชเซเชฐเชเซเชฐเชฟเชฏเชพ เชเชฐเชตเชพเชฎเชพเช เชเชตเซ เชนเซเช เชถเชเซ เชเซ เชเซ เชนเชเซ เชธเซเชงเซ เช
เชชเชกเซเช เชเชฐเชตเชพเชฎเชพเช เชเชตเซ เชจเชฅเซ.
/*
* Copyright 2012-2016 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package sample.flyway;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
@Entity
public class Person {
@Id
@GeneratedValue
private Long id;
private String firstName;
private String lastName;
private String surname;
public String getFirstName() {
return this.firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
/**
* Reading from the new column if it's set. If not the from the old one.
*
* When migrating from version 1.0.0 -> 2.0.0 this can lead to a possibility that some data in
* the surname column is not up to date (during the migration process lastName could have been updated).
* In this case one can run yet another migration script after all applications have been deployed in the
* new version to ensure that the surname field is updated.
*
* However it makes sense since when looking at the migration from 2.0.0 -> 3.0.0. In 3.0.0 we no longer
* have a notion of lastName at all - so we don't update that column. If we rollback from 3.0.0 -> 2.0.0 if we
* would be reading from lastName, then we would have very old data (since not a single datum was inserted
* to lastName in version 3.0.0).
*/
public String getSurname() {
return this.surname != null ? this.surname : this.lastName;
}
/**
* Storing both FIRST_NAME and SURNAME entries
*/
public void setSurname(String surname) {
this.lastName = surname;
this.surname = surname;
}
@Override
public String toString() {
return "Person [firstName=" + this.firstName + ", lastName=" + this.lastName + ", surname=" + this.surname
+ "]";
}
}
เชชเชเชฒเซเช 3: เชเซเชกเชฎเชพเชเชฅเซ เชเซเชฒเซเชฒเซเช_เชจเชพเชฎ เชฆเซเชฐ เชเชฐเชตเซเช
เชเชชเซเชฒเชฟเชเซเชถเชจ เชธเชเชธเซเชเชฐเชฃ: 3.0.0
DB เชธเชเชธเซเชเชฐเชฃ:v3
เชเชฟเชชเซเชชเชฃเซ
เชจเซเซ
เชง เชชเซเชฐเชคเชฟ.: เชฆเซเชเซเชคเซ เชฐเซเชคเซ, เชฎเซเชณ เชฒเซเชเชฎเชพเช เชฒเซเชเชเซ เชญเซเชฒเชฅเซ เชชเชเชฒเซเช 2 เชฎเชพเชเชฅเซ เช เชฌเซเชฒเซเชเชจเชพ เชเซเชเซเชธเซเชเชจเซ เชจเชเชฒ เชเชฐเซ เชเซ. เช เชชเชเชฒเชพ เชชเชฐ, เชเซเชฒเชฎเชจเซ เชเชชเชฏเซเช เชเชฐเชคเซ เชเชพเชฐเซเชฏเชเซเชทเชฎเชคเชพเชจเซ เชฆเซเชฐ เชเชฐเชตเชพเชจเชพ เชนเซเชคเซเชฅเซ เชเชชเซเชฒเชฟเชเซเชถเชจ เชเซเชกเชฎเชพเช เชซเซเชฐเชซเชพเชฐเซ เชเชฐเชตเชพ เชเซเชเช. last_name
.
เชจเชตเซ เชเซเชฒเชฎ เชเชฎเซเชฐเซเชจเซ เช เชจเซ เชคเซเชจเซ เชธเชพเชฎเชเซเชฐเซเชจเซ เชจเชเชฒ เชเชฐเซเชจเซ, เช เชฎเซ เชชเชพเชเชณเชจเซ เชคเชฐเชซ เชธเซเชธเชเชเชค เชกเซเชเชพเชฌเซเช เชซเซเชฐเชซเชพเชฐเซ เชฌเชจเชพเชตเซเชฏเชพ เชเซ. เชเชชเชฐเชพเชเชค, เชเซ เชเชชเชฃเซ JAR เชจเซ เชฐเซเชฒเชฌเซเช เชเชฐเซเช เช เชฅเชตเชพ เชเซเชจเซ JAR เชเชพเชฒเซ เชฐเชนเซ เชนเซเชฏ, เชคเซ เชคเซ เช เชฎเชฒ เชฆเชฐเชฎเชฟเชฏเชพเชจ เชคเซเชเซ เชเชถเซ เชจเชนเซเช.
เชเชชเซเชฒเชฟเชเซเชถเชจ เชฐเซเชฒเชฌเซเช
เชนเชพเชฒเชฎเชพเช เช
เชฎเชพเชฐเซ เชชเชพเชธเซ เชเชช เชตเชฐเซเชเชจ เชเซ 3.0.0
เช
เชจเซ เชกเซเชเชพเชฌเซเช v3
. เชธเชเชธเซเชเชฐเชฃ 3.0.0
เชฎเชพเชเซ เชกเซเชเชพ เชธเชพเชเชตเชคเซ เชจเชฅเซ last_name
. เชเชจเซ เช
เชฐเซเชฅ เช เชเซ เชเซ เชฎเชพเช surname
เชธเซเชฅเซ เช
เชฆเซเชฏเชคเชจ เชฎเชพเชนเชฟเชคเซ เชธเชเชเซเชฐเชนเชฟเชค เชเซ.
เชชเชเชฒเชพเช:
- เชคเชฎเชพเชฐเซ เชเชชเซเชฒเชฟเชเซเชถเชจเชจเซ เชธเชเชธเซเชเชฐเชฃ เชชเชฐ เชชเชพเชเชพ เชซเซเชฐเชตเซ
2.0.0
. - เชเชตเซเชคเซเชคเชฟ
2.0.0
เชเชชเชฏเซเช เชเชฐเซ เชเซ เช เชจเซlast_name
ะธsurname
. - เชเชตเซเชคเซเชคเชฟ
2.0.0
เชฒเซเชถเซsurname
, เชเซ เชคเซ เชถเซเชจเซเชฏ เชจเชฅเซ, เช เชจเซเชฏเชฅเชพ -last_name
เชกเซเชเชพเชฌเซเช เชซเซเชฐเชซเชพเชฐเซ
เชกเซเชเชพเชฌเซเชเชฎเชพเช เชเซเช เชฎเชพเชณเชเชพเชเซเชฏ เชซเซเชฐเชซเชพเชฐเซ เชจเชฅเซ. เชเซเชจเชพ เชกเซเชเชพเชจเซเช เช เชเชคเชฟเชฎ เชธเซเชฅเชณเชพเชเชคเชฐ เชเชฐเชตเชพ เชฎเชพเชเซ เชจเซเชเซเชจเซ เชธเซเชเซเชฐเชฟเชชเซเช เชเชฒเชพเชตเชตเชพเชฎเชพเช เชเชตเซ เชเซ:
-- WE'RE ASSUMING THAT IT'S A FAST MIGRATION - OTHERWISE WE WOULD HAVE TO MIGRATE IN BATCHES
-- ALSO WE'RE NOT CHECKING IF WE'RE NOT OVERRIDING EXISTING ENTRIES. WE WOULD HAVE TO COMPARE
-- ENTRY VERSIONS TO ENSURE THAT IF THERE IS ALREADY AN ENTRY WITH A HIGHER VERSION NUMBER
-- WE WILL NOT OVERRIDE IT.
UPDATE PERSON SET PERSON.surname = PERSON.last_name;
-- DROPPING THE NOT NULL CONSTRAINT; OTHERWISE YOU WILL TRY TO INSERT NULL VALUE OF THE LAST_NAME
-- WITH A NOT_NULL CONSTRAINT.
ALTER TABLE PERSON MODIFY COLUMN last_name varchar(255) NULL DEFAULT NULL;
เชเซเชก เชซเซเชฐเชซเชพเชฐเซ
เชจเซเซ
เชง เชชเซเชฐเชคเชฟ.: เช เชฌเซเชฒเซเชเชจเซเช เชตเชฐเซเชฃเชจ เชชเชฃ เชญเซเชฒเชฅเซ เชฒเซเชเช เชฆเซเชตเชพเชฐเชพ เชชเชเชฒเซเช 2 เชฎเชพเชเชฅเซ เชจเชเชฒ เชเชฐเชตเชพเชฎเชพเช เชเชตเซเชฏเซเช เชนเชคเซเช. เชฒเซเชเชจเชพ เชคเชฐเซเช เช
เชจเซเชธเชพเชฐ, เช เชชเชเชฒเชพเชฎเชพเช เชเซเชกเชฎเชพเช เชซเซเชฐเชซเชพเชฐเชจเซ เชนเซเชคเซ เชคเซเชฎเชพเชเชฅเซ เชคเชคเซเชตเซเชจเซ เชฆเซเชฐ เชเชฐเชตเชพเชจเซ เชนเซเชตเซ เชเซเชเช เชเซ เชเซเชฒเชฎ เชธเชพเชฅเซ เชเชพเชฎ เชเชฐเซ เชเซ. last_name
.
เช
เชฎเซ เชกเซเชเชพ เชคเชฐเซเชเซ เชธเชเชเซเชฐเชน เชเชฐเซเช เชเซเช last_name
, เช
เชจเซ เชฎเชพเช surname.
เชตเชงเซเชฎเชพเช, เช
เชฎเซ เชเซเชฒเชฎเชฎเชพเชเชฅเซ เชตเชพเชเชเซเช เชเซเช last_name
, เชเชพเชฐเชฃ เชเซ เชคเซ เชธเซเชฅเซ เชธเซเชธเชเชเชค เชเซ. เชเชฎเชพเชตเช เชชเซเชฐเชเซเชฐเชฟเชฏเชพ เชฆเชฐเชฎเชฟเชฏเชพเชจ, เชเซเชเชฒเซเช เชตเชฟเชจเชเชคเซเช เชเชตเชพ เชเชฆเชพเชนเชฐเชฃ เชฆเซเชตเชพเชฐเชพ เชชเซเชฐเชเซเชฐเชฟเชฏเชพ เชเชฐเชตเชพเชฎเชพเช เชเชตเซ เชถเชเซ เชเซ เชเซ เชเซ เชนเชเซ เชธเซเชงเซ เช
เชชเชเซเชฐเซเชก เชเชฐเชตเชพเชฎเชพเช เชเชตเซ เชจเชฅเซ.
/*
* Copyright 2012-2016 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package sample.flyway;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
@Entity
public class Person {
@Id
@GeneratedValue
private Long id;
private String firstName;
private String surname;
public String getFirstName() {
return this.firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getSurname() {
return this.surname;
}
public void setSurname(String lastname) {
this.surname = lastname;
}
@Override
public String toString() {
return "Person [firstName=" + this.firstName + ", surname=" + this.surname
+ "]";
}
}
เชชเชเชฒเซเช 4: เชกเซเชเชพเชฌเซเชเชฎเชพเชเชฅเซ เชเซเชฒเซเชฒเซเช_เชจเชพเชฎ เชฆเซเชฐ เชเชฐเชตเซเช
เชเชชเซเชฒเชฟเชเซเชถเชจ เชธเชเชธเซเชเชฐเชฃ: 4.0.0
DB เชธเชเชธเซเชเชฐเชฃ: v4
เชเชฟเชชเซเชชเชฃเซ
เชนเชเซเชเชค เช เชเซ เชเซ เชเชตเซเชคเซเชคเชฟ เชเซเชก เชเชพเชฐเชฃเซ 3.0.0
เชเซเชฒเชฎเชจเซ เชเชชเชฏเซเช เชเชฐเซเชฏเซ เชจเชฅเซ last_name
, เชเซ เชเชชเชฃเซ เชชเชพเชเชพ เชฐเซเชฒ เชเชฐเซเช เชคเซ เช
เชฎเชฒ เชฆเชฐเชฎเชฟเชฏเชพเชจ เชเชเชเชชเชฃ เชเชฐเชพเชฌ เชฅเชถเซ เชจเชนเซเช 3.0.0
เชกเซเชเชพเชฌเซเชเชฎเชพเชเชฅเซ เชเซเชฒเชฎ เชฆเซเชฐ เชเชฐเซเชฏเชพ เชชเชเซ.
เชธเซเชเซเชฐเชฟเชชเซเช เชเชเซเชเซเชเซเชฏเซเชถเชจ เชฒเซเชเซเชธ
We will do it in the following way:
01) Run 1.0.0
02) Wait for the app (1.0.0) to boot
03) Generate a person by calling POST localhost:9991/person to version 1.0.0
04) Run 2.0.0
05) Wait for the app (2.0.0) to boot
06) Generate a person by calling POST localhost:9991/person to version 1.0.0
07) Generate a person by calling POST localhost:9992/person to version 2.0.0
08) Kill app (1.0.0)
09) Run 3.0.0
10) Wait for the app (3.0.0) to boot
11) Generate a person by calling POST localhost:9992/person to version 2.0.0
12) Generate a person by calling POST localhost:9993/person to version 3.0.0
13) Kill app (3.0.0)
14) Run 4.0.0
15) Wait for the app (4.0.0) to boot
16) Generate a person by calling POST localhost:9993/person to version 3.0.0
17) Generate a person by calling POST localhost:9994/person to version 4.0.0
Starting app in version 1.0.0
Generate a person in version 1.0.0
Sending a post to 127.0.0.1:9991/person. This is the response:
{"firstName":"52b6e125-4a5c-429b-a47a-ef18bbc639d2","lastName":"52b6e125-4a5c-429b-a47a-ef18bbc639d2"}
Starting app in version 2.0.0
Generate a person in version 1.0.0
Sending a post to 127.0.0.1:9991/person. This is the response:
{"firstName":"e41ee756-4fa7-4737-b832-e28827a00deb","lastName":"e41ee756-4fa7-4737-b832-e28827a00deb"}
Generate a person in version 2.0.0
Sending a post to 127.0.0.1:9992/person. This is the response:
{"firstName":"0c1240f5-649a-4bc5-8aa9-cff855f3927f","lastName":"0c1240f5-649a-4bc5-8aa9-cff855f3927f","surname":"0c1240f5-649a-4bc5-8aa9-cff855f3927f"}
Killing app 1.0.0
Starting app in version 3.0.0
Generate a person in version 2.0.0
Sending a post to 127.0.0.1:9992/person. This is the response:
{"firstName":"74d84a9e-5f44-43b8-907c-148c6d26a71b","lastName":"74d84a9e-5f44-43b8-907c-148c6d26a71b","surname":"74d84a9e-5f44-43b8-907c-148c6d26a71b"}
Generate a person in version 3.0.0
Sending a post to 127.0.0.1:9993/person. This is the response:
{"firstName":"c6564dbe-9ab5-40ae-9077-8ae6668d5862","surname":"c6564dbe-9ab5-40ae-9077-8ae6668d5862"}
Killing app 2.0.0
Starting app in version 4.0.0
Generate a person in version 3.0.0
Sending a post to 127.0.0.1:9993/person. This is the response:
{"firstName":"cbe942fc-832e-45e9-a838-0fae25c10a51","surname":"cbe942fc-832e-45e9-a838-0fae25c10a51"}
Generate a person in version 4.0.0
Sending a post to 127.0.0.1:9994/person. This is the response:
{"firstName":"ff6857ce-9c41-413a-863e-358e2719bf88","surname":"ff6857ce-9c41-413a-863e-358e2719bf88"}
DB เชซเซเชฐเชซเชพเชฐเซ
เชชเซเชฐเชฎเชพเชฃเชฎเชพเช v3
เช
เชฎเซ เชซเชเซเชค เชเซเชฒเชฎ เชฆเซเชฐ เชเชฐเซเช เชเซเช last_name
เช
เชจเซ เชเซเชเชคเชพ เชชเซเชฐเชคเชฟเชฌเชเชงเซ เชเชฎเซเชฐเซ.
-- REMOVE THE COLUMN
ALTER TABLE PERSON DROP last_name;
-- ADD CONSTRAINTS
UPDATE PERSON SET surname='' WHERE surname IS NULL;
ALTER TABLE PERSON ALTER COLUMN surname VARCHAR NOT NULL;
เชเซเชก เชซเซเชฐเชซเชพเชฐเซ
เชเซเชกเชฎเชพเช เชเซเช เชซเซเชฐเชซเชพเชฐ เชจเชฅเซ.
เชจเชฟเชทเซเชเชฐเซเชท
เช เชฎเซ เชธเชซเชณเชคเชพเชชเซเชฐเซเชตเช เชชเชพเชเชณเชจเซ-เช เชธเชเชเชค เชเซเชฒเชฎเชจเชพ เชจเชพเชฎเชฎเชพเช เชซเซเชฐเชซเชพเชฐเชจเซ เชเชฃเชพ เชชเชพเชเชณเชจเซ-เชธเซเชธเชเชเชค เชเชฎเชพเชตเช เชเชฐเซเชจเซ เชฒเชพเชเซ เชเชฐเซเชฏเซ. เชจเซเชเซ เชเชฐเชตเชพเชฎเชพเช เชเชตเซเชฒ เชเซเชฐเชฟเชฏเชพเชเชจเซ เชธเชพเชฐเชพเชเชถ เชเซ:
- เชเชชเซเชฒเชฟเชเซเชถเชจ เชธเชเชธเซเชเชฐเชฃเชจเซ เชเชฎเชพเชตเช
1.0.0
ัv1
เชกเซเชเชพเชฌเซเช เชธเซเชเซเชฎเชพ (เชเซเชฒเชฎเชจเซเช เชจเชพเชฎ =last_name
) - เชเชชเซเชฒเชฟเชเซเชถเชจ เชธเชเชธเซเชเชฐเชฃเชจเซ เชเชฎเชพเชตเช
2.0.0,
เชเซ เชกเซเชเชพ เชธเซเชเซเชฐ เชเชฐเซ เชเซlast_name
ะธsurname
. เชเชชเซเชฒเชฟเชเซเชถเชจเชฎเชพเชเชฅเซ เชตเชพเชเชเซ เชเซlast_name
. เชกเซเชเชพเชฌเซเช เชธเชเชธเซเชเชฐเชฃเชฎเชพเช เชเซv2
เชเซเชตเซ เชเซเชฒเชฎ เชงเชฐเชพเชตเซ เชเซlast_name
, เช เชจเซsurname. surname
l เชจเซ เชจเชเชฒ เชเซast_name
. (เชจเซเชเชง: เช เชเซเชฒเชฎเชฎเชพเช เชจเชฒ เช เชตเชฐเซเชง เชจ เชนเซเชตเซ เชเซเชเช) - เชเชชเซเชฒเชฟเชเซเชถเชจ เชธเชเชธเซเชเชฐเชฃเชจเซ เชเชฎเชพเชตเช
3.0.0
, เชเซ เชซเชเซเชค เชกเซเชเชพ เชธเซเชเซเชฐ เชเชฐเซ เชเซsurname
เช เชจเซ เช เชเช เชชเชฐเชฅเซ เชตเชพเชเชเซ เชเซ. เชกเซเชเชพเชฌเซเช เชฎเชพเชเซ, เชเซเชฒเซเชฒเซเช เชธเซเชฅเชณเชพเชเชคเชฐ เชฅเช เชฐเชนเซเชฏเซเช เชเซlast_name
ะฒsurname
. เชเช เชฎเชฐเซเชฏเชพเชฆเชพ เชชเชฃ เชจเชฅเซ เชฎเชพเชเชฅเซ เชฆเซเชฐ เชเชฐเชตเชพเชฎเชพเช เชเชตเซ เชเซlast_name
. เชกเซเชเชพเชฌเซเช เชนเชตเซ เชธเชเชธเซเชเชฐเชฃเชฎเชพเช เชเซv3
- เชเชชเซเชฒเชฟเชเซเชถเชจ เชธเชเชธเซเชเชฐเชฃเชจเซ เชเชฎเชพเชตเช
4.0.0
- เชเซเชกเชฎเชพเช เชเซเช เชซเซเชฐเชซเชพเชฐ เชเชฐเชตเชพเชฎเชพเช เชเชตเซเชฏเซ เชจเชฅเซ. เชกเซเชเชพเชฌเซเช เชเชฎเชพเชตเชv4
, เชเซ เชฆเซเชฐ เชเชฐเซ เชเซlast_name
. เช เชนเซเช เชคเชฎเซ เชกเซเชเชพเชฌเซเชเชฎเชพเช เชเซเชเชชเชฃ เชเซเชเชคเชพ เช เชตเชฐเซเชงเซ เชเชฎเซเชฐเซ เชถเชเซ เชเซ.
เช เช เชญเชฟเชเชฎเชจเซ เช เชจเซเชธเชฐเซเชจเซ, เชคเชฎเซ เชกเซเชเชพเชฌเซเช/เชเชชเซเชฒเชฟเชเซเชถเชจ เชธเซเชธเชเชเชคเชคเชพเชจเซ เชคเซเชกเซเชฏเชพ เชตเชฟเชจเชพ เชนเชเชฎเซเชถเชพ เชเช เชธเชเชธเซเชเชฐเชฃเชจเซ เชฐเซเชฒ เชฌเซเช เชเชฐเซ เชถเชเซ เชเซ.
เชเซเชก
เช เชฒเซเชเชฎเชพเช เชตเชชเชฐเชพเชฏเซเชฒ เชคเชฎเชพเชฎ เชเซเชก เช
เชนเซเช เชเชชเชฒเชฌเซเชง เชเซ
เชชเซเชฐเซเชเซเชเซเชเซเชธ
เชฐเซเชชเซเชเซเชเชฐเซ เชเซเชฒเซเชจ เชเชฐเซเชฏเชพ เชชเชเซ, เชคเชฎเซ เชจเซเชเซเชจเซเช เชซเซเชฒเซเชกเชฐ เชฎเชพเชณเชเซเช เชเซเชถเซ.
โโโ boot-flyway-v1 - 1.0.0 version of the app with v1 of the schema
โโโ boot-flyway-v2 - 2.0.0 version of the app with v2 of the schema (backward-compatible - app can be rolled back)
โโโ boot-flyway-v2-bad - 2.0.0.BAD version of the app with v2bad of the schema (backward-incompatible - app cannot be rolled back)
โโโ boot-flyway-v3 - 3.0.0 version of the app with v3 of the schema (app can be rolled back)
โโโ boot-flyway-v4 - 4.0.0 version of the app with v4 of the schema (app can be rolled back)
เชธเซเชเซเชฐเชฟเชชเซเชเซ
เชคเชฎเซ เชจเซเชเซเชจเซ เชธเซเชเซเชฐเชฟเชชเซเชเซเชฎเชพเช เชตเชฐเซเชฃเชตเซเชฒ เชธเซเชเซเชฐเชฟเชชเซเชเซ เชเชฒเชพเชตเซ เชถเชเซ เชเซ, เชเซ เชกเซเชเชพเชฌเซเชเชฎเชพเช เชชเชเชพเชค-เชธเซเชธเชเชเชค เช เชจเซ เช เชธเชเชเชค เชซเซเชฐเชซเชพเชฐเซ เชฆเชฐเซเชถเชพเชตเชถเซ.
เชเซเชตเชพ เชฎเชพเชเซ เชชเชพเชเชณเชจเซ เชคเชฐเชซ เชธเซเชธเชเชเชค เชซเซเชฐเชซเชพเชฐเซ เชธเชพเชฅเซเชจเซ เชเซเชธ, เชเชฒเชพเชตเซ:
./scripts/scenario_backward_compatible.sh
เช เชจเซ เชเซเชตเชพ เชฎเชพเชเซ เชชเชพเชเชณเชจเซ เชคเชฐเชซ เช เชธเชเชเชค เชซเซเชฐเชซเชพเชฐเซ เชธเชพเชฅเซเชจเซ เชเซเชธ, เชเชฒเชพเชตเซ:
./scripts/scenario_backward_incompatible.sh
เชตเชธเชเชค เชฌเซเช เชจเชฎเซเชจเชพ เชซเซเชฒเชพเชฏเชตเซ
เชฌเชงเชพ เชเชฆเชพเชนเชฐเชฃเซ เชฎเชพเชเชฅเซ เชฒเซเชตเชพเชฎเชพเช เชเชตเซเชฏเชพ เชเซ Spring Boot Sample Flyway.
เชคเชฎเซ เชเช เชจเชเชฐ เชเชฐเซ เชถเชเซ เชเซ http://localhost:8080/flyway
, เชคเซเชฏเชพเช เชธเซเชเซเชฐเชฟเชชเซเชเซเชจเซ เชฏเชพเชฆเซ เชเซ.
เช เชเชฆเชพเชนเชฐเชฃเชฎเชพเช H2 เชเชจเซเชธเซเชฒเชจเซ เชชเชฃ เชธเชฎเชพเชตเซเชถ เชฅเชพเชฏ เชเซ http://localhost:8080/h2-console
) เชเซเชฅเซ เชคเชฎเซ เชกเซเชเชพเชฌเซเช เชธเซเชฅเชฟเชคเชฟ เชเซเช เชถเชเซ (เชกเชฟเชซเซเชฒเซเช jdbc URL เชเซ jdbc:h2:mem:testdb
).
เชตเชงเซเชฎเชพเช
เชกเซเชเชพเชฌเซเช เชฐเชฟเชซเซเชเซเชเชฐเซเชเช เชชเซเชเชฐเซเชจ เชธเชคเชค เชกเชฟเชฒเชฟเชตเชฐเซ
เช เชฎเชพเชฐเชพ เชฌเซเชฒเซเช เชชเชฐ เช เชจเซเชฏ เชฒเซเชเซ เชชเชฃ เชตเชพเชเชเซ:
เชเซเชฌเชฐเชจเซเชเซเชธ: เชธเชฟเชธเซเชเชฎ เชฐเชฟเชธเซเชฐเซเชธ เชฎเซเชจเซเชเชฎเซเชจเซเชเชจเซ เชเซเช เชตเชตเซเช เชถเชพ เชฎเชพเชเซ เชเชเชฒเซเช เชฎเชนเชคเซเชตเชชเซเชฐเซเชฃ เชเซ? เชเซเชเชเชจ เชชเชพเชเชชเชฒเชพเชเชจ - เชเซเชฌเชฐเชจเซเชเชธ-เชจเซเชเชฟเชต เชชเชพเชเชชเชฒเชพเชเชจ Nginx เชฎเชพเชเซ เชกเชพเชฏเชจเซเชฎเชฟเช เชฎเซเชกเซเชฏเซเชฒ เชฌเชจเชพเชตเชตเซเช เชนเชพเชถเชฟเชเซเชฐเซเชช เชเซเชจเซเชธเซเชฏเซเชฒเชจเชพ เชเซเชฌเชฐเชจเซเชเซเชธ เชเชฅเซเชฐเชพเชเชเซเชถเชจเชจเซ เชชเชฐเชฟเชเชฏ เช เชงเชฟเชเซเชคเชคเชพ เชธเชพเชฅเซ เชเซเชฒเชฟเชเชนเชพเชเชธเชฎเชพเชเชฅเซ เช เชงเชฟเชเซเชคเชคเชพ เชตเชฟเชจเชพ เชเซเชฒเชฟเชเชนเชพเชเชธเชฎเชพเช เชธเซเชฅเชพเชจเชพเชเชคเชฐเชฃ เชถเซเช เชคเชฐเชซ เชฆเซเชฐเซ เชเชฏเซเช? Nginx เชตเซเชฌ เชธเชฐเซเชตเชฐ เชธเชพเชฅเซ เชตเชธเชเชค เชเชชเซเชฒเชฟเชเซเชถเชจเซเชจเซ เชฌเซเชฒเซ-เชเซเชฐเซเชจ เชกเชฟเชชเซเชฒเซเชฏเชฎเซเชจเซเช
เชธเซเชฐเซเชธ: www.habr.com