[Lv2] Chinh phục hoàn toàn JPA dành cho nhà phát triển thực thụ - Từ Persistence Context đến các mô hình thực tế

Bạn chắc hẳn đã từng viết SQL bằng JdbcTemplate rồi đúng không? Chắc hẳn ai cũng từng có trải nghiệm thở dài khi mỗi lần thay đổi một cột là phải sửa đồng thời cả SQL lẫn RowMapper. Khóa học này bắt đầu từ chính nỗi đau đó. Nếu dùng JDBC thuần để thực hiện một lệnh SELECT, bạn sẽ mất 35 dòng code. Mở Connection, tạo PreparedStatement, duyệt ResultSet, và nếu lỡ quên một lệnh close() thôi là server sẽ bị sập. Sau khi tự tay gõ qua những dòng code địa ngục này và chạm đến duy nhất một dòng save() của JPA, bạn sẽ cảm nhận được "tại sao phải dùng JPA" không chỉ bằng cái đầu mà bằng chính đôi bàn tay của mình.

83 học viên đang tham gia khóa học này

Độ khó Cơ bản

Thời gian Không giới hạn

JPA
JPA
spring-jpa
spring-jpa
Java
Java
Spring
Spring
Spring Boot
Spring Boot
JPA
JPA
spring-jpa
spring-jpa
Java
Java
Spring
Spring
Spring Boot
Spring Boot

Bạn sẽ nhận được điều này sau khi học.

  • Khả năng giải thích trôi chảy về bộ nhớ đệm cấp 1 (first-level cache), cơ chế phát hiện thay đổi (dirty checking) và trì hoãn ghi (write-behind) dựa trên kinh nghiệm thực tế.

  • Kinh nghiệm cảm nhận sâu sắc lý do tại sao JPA lại cần thiết sau khi trực tiếp nếm trải nỗi đau của 35 dòng mã JDBC

  • Khả năng debug thực tế để tìm ra nguyên nhân bằng cách xem log khi vấn đề N+1 xảy ra, và lựa chọn giải pháp phù hợp với tình huống giữa Fetch Join / @EntityGraph / @BatchSize.

  • Khả năng thiết kế truy vấn động gọn gàng mà không bị vướng vào "spaghetti if-else" bằng BooleanExpression của QueryDSL, đồng thời tích hợp JPA và QueryDSL thành cấu trúc tiêu chuẩn thực tế thông qua Custom Repository pattern.

  • Từ việc thiết kế thực thể (entity) đến ánh xạ quan hệ kế thừa, BaseEntity (Auditing), và cả kiểu nhúng (embedded type) — đây là tư duy thiết kế giúp bạn không còn phải thắc mắc "Nên thiết kế bảng như thế nào?" mà có thể quyết định ngay "Hãy làm theo mô hình này" khi bắt đầu một dự án thực tế.

JPA, học như thế này thì sẽ trượt phỏng vấn đấy your interview

Tôi đã tạo API bằng Spring Boot ở cấp độ Lv.1.

Viết SQL bằng JdbcTemplate, ánh xạ kết quả bằng RowMapper... Ồ, CRUD chạy rồi này!... Oh, the CRUD is working!

Nhưng khi nhìn vào mã nguồn, bạn sẽ nảy ra suy nghĩ như thế này.

"Tại sao phải viết SQL dưới dạng chuỗi bên trong mã Java?"

"Mỗi khi thêm một cột mới, mình lại phải sửa lại toàn bộ SQL và RowMapper..."

"Nếu có tới 10 cái bảng như thế này thì phải làm sao đây?"

Và trong buổi phỏng vấn, họ sẽ hỏi như thế này.

"Khi lưu trữ DB, có phương pháp nào khác ngoài JdbcTemplate không ạ?"

"Ừm... Tôi có nghe nói là có cái gọi là JPA... nhưng thật lòng thì tôi chưa dùng thử nên..."

Rớt rồi.

"Ngữ cảnh bền vững (Persistence Context) của JPA là gì?"

"... Dạ?"

Tôi có kinh nghiệm tự viết SQL trực tiếp, nhưng lại không biết kỹ thuật để giải quyết những nỗi đau (khó khăn) đó.


Hầu hết các khóa học JPA chỉ dạy "cách sử dụng".

"JPA là ORM. Chỉ cần gắn @Entity và dùng save() là được."

Làm theo thì sẽ chạy được. Nhưng người phỏng vấn sẽ hỏi "tại sao".

"Tại sao lại sử dụng JPA?"

"Hãy giải thích nguyên lý hoạt động của Persistence Context (ngữ cảnh bền vững)."

"Bạn đã giải quyết vấn đề N+1 như thế nào?"

Những người chỉ học "Làm thế nào" (How) sẽ trả lời như thế này.

"JPA là... một ORM... dùng save() thì nó sẽ lưu lại ạ..."

Chỉ vậy thôi. Không còn gì để nói thêm nữa.

Bởi vì họ chưa bao giờ làm thử mà không có JPA. Vì chưa từng viết 35 dòng mã bằng JDBC, nên họ không biết tại sao JPA lại cần thiết.


Vì vậy, bài giảng này sẽ mang đến cho bạn "nỗi đau" trước tiên

Để học JPA một cách đúng đắn, không được học save() trước. Bạn phải trải qua nỗi đau của 35 dòng mã JDBC trước đã.

Nếu dùng JDBC thuần để thực hiện một lệnh SELECT thì mất tận 35 dòng. Mở Connection, tạo PreparedStatement, chạy ResultSet, rồi nếu không close() thì sập server... Bạn sẽ phải tự tay gõ hết những thứ này.

Sau khi trải qua nỗi đau này, bạn thấy một dòng save() của JPA thì sao? Cảm giác thật phấn khích.

Khoảnh khắc này, nó sẽ như thế này: "À... hóa ra đây là lý do tại sao người ta dùng JPA. Đây là lý do tại sao cần có Persistence Context."

N+1 cũng tương tự như vậy. Sau khi trực tiếp trải qua cảnh địa ngục khi truy vấn 10 thành viên mà có đến 11 câu lệnh query được thực thi, rồi nhìn thấy nó giảm xuống còn 1 câu duy nhất chỉ với một dòng Fetch Join, nguyên lý đó sẽ được khắc sâu vào xương tủy của bạn.

Kinh nghiệm "đau khổ → cứu rỗi" này sẽ biến bạn trở thành một "lập trình viên có khả năng giải thích".

Sau 5 tuần nữa, các bạn sẽ có thể tự tin nói như thế này tại phòng phỏng vấn.

❌ (Câu trả lời thông thường) "Tôi dùng JPA vì nó là công nghệ ORM nên rất tiện lợi."

⭕ (Câu trả lời dựa trên kinh nghiệm) "Tôi đã trực tiếp phát triển bằng JDBC, và vấn đề không chỉ là việc lặp đi lặp lại khi phải viết SQL mỗi lần, mà quan trọng hơn hết là sự bất nhất xảy ra khi lưu trữ vào DB nếu viết code theo hướng đối tượng. Tuy nhiên, Persistence Context của JPA đã giải quyết vấn đề này bằng First-level Cache và Dirty Checking."

Nếu trả lời như thế này, người phỏng vấn cũng có thể cảm nhận được rằng 'À, người này đã trực tiếp trải nghiệm qua rồi'.

✅ Bạn sẽ học được những nội dung sau.

🧠 Các khái niệm cốt lõi của JPA được thấu hiểu qua các phép ẩn dụ

  • Hiểu về Persistence Context qua hình ảnh thư ký - Một người thư ký giúp lưu bộ nhớ đệm khi truy vấn, phát hiện thay đổi và gom các câu lệnh truy vấn để gửi đi cùng lúc

  • Hiểu về trì hoãn ghi (write-behind) thông qua việc gom hàng chuyển phát — Gửi từng cái một thì kém hiệu quả, gọi xe tải để vận chuyển tất cả cùng một lúc

  • Hiểu về Lazy Loading qua hình ảnh nhân viên giả (Proxy) — Đối tượng giả chỉ chờ đợi cho đến khi công việc thực sự phát sinh

  • Hiểu về truy vấn động qua việc lắp ráp Lego — QueryDSL giúp lắp ghép từng điều kiện một cách linh hoạt


🌱 Bước tiếp theo dành cho những bạn đã hoàn thành Lv.1

  • Bắt đầu bằng việc trực tiếp trải nghiệm những hạn chế của JdbcTemplate mà bạn đã học ở Lv.1.

  • "이 기술이 왜 탄생했는가"부터 시작하는 모든 개념 설명.

  • Phương pháp học tập "Khổ trước → Sướng sau": Phải trải qua địa ngục của 35 dòng mã JDBC mới hiểu được cuộc cách mạng của 3 dòng mã JPA.


  • Lộ trình học tập thực tế kết nối trực tiếp đến cả các câu trả lời phỏng vấn.


✨ Đặc điểm của bài giảng này

📌 Liên tục đặt câu hỏi "Tại sao?"

Khóa học này không chỉ dừng lại ở việc "hãy làm như thế này".

Khóa học thông thường: "Persistence Context quản lý các entity. Chỉ cần dùng save() là được." (X)

Khóa học này: Sau khi trực tiếp trải qua địa ngục 35 dòng SELECT với JDBC thuần túy, bạn sẽ cảm nhận sâu sắc tại sao bộ nhớ đệm cấp 1 (1st level cache) của Persistence Context lại là một cuộc cách mạng.

Mọi khái niệm đều bắt đầu từ "tại sao công nghệ này lại ra đời". Khi đã thấu hiểu được lý do (Why), cách thức thực hiện (How) sẽ tự khắc theo sau.


📌 Phương pháp học tập "Nỗi đau → Sự cứu rỗi"

Đây không chỉ đơn thuần là một bài giảng chỉ đưa ra đáp án. Tôi sẽ để bạn trải nghiệm sự đau khổ một cách có chủ đích, sau đó mới giúp bạn cảm nhận được sự vĩ đại của giải pháp.

Tuần 1: Địa ngục SELECT 35 dòng của JDBC → Persistence Context của JPA kết thúc chỉ trong 3 dòng

Tuần 2: Thảm họa ô nhiễm dữ liệu do thiếu EnumType → Phương pháp phòng vệ EnumType.STRING / Thảm họa ghi đè null của merge() → Chỉnh sửa an toàn dựa trên Dirty Checking (phát hiện thay đổi)

Tuần 3: Sự hỗn loạn do bất đồng quan điểm giữa đối tượng và bảng → Giải quyết gọn gàng bằng ánh xạ quan hệ / Bùng nổ truy vấn do lỗi N+1 → Giải quyết chỉ với một dòng Fetch Join

Tuần 4: Địa ngục sao chép createdAt vào mọi thực thể → Giải quyết triệt để bằng BaseEntity / Thảm họa xóa sạch bộ sưu tập kiểu giá trị → Mô hình nâng cấp thực thể

Tuần 5: Lỗi đánh máy JPQL dạng chuỗi dẫn đến sự cố runtime → Xác thực thời gian biên dịch với QueryDSL / Spaghetti truy vấn động với câu lệnh if → Lắp ghép Lego với BooleanExpression

Kinh nghiệm này sẽ giúp bạn có thể bắt đầu câu trả lời trong buổi phỏng vấn bằng cụm từ "Tôi đã trực tiếp trải qua việc này...".

Bạn sẽ có thể giải thích được các cơ chế hoạt động bên trong, từ ngữ cảnh lưu trữ (persistence context) của JPA cho đến QueryDSL.


📌 Cách trả lời dẫn dắt người phỏng vấn đặt thêm câu hỏi phụ

Những khóa học chỉ đưa ra khái niệm rồi kết thúc, những khóa học mà bạn không biết phải áp dụng thế nào trong phỏng vấn… Tôi ghét nhất là những khóa học như vậy.

Khóa học này kết nối từ khái niệm → trải nghiệm → câu trả lời phỏng vấn.
(Hình ảnh bên dưới là nội dung đã trúng tủ trong buổi phỏng vấn của Khóa học tạo sự khác biệt cho CV Backend)

Dành cho những người như thế này

Tôi vẫn chưa hình dung được JPA là gì
✔ Những bạn đã thực hiện CRUD bằng JdbcTemplate nhưng không biết "Persistence Context" là gì
✔ Những bạn biết rằng gọi save() thì sẽ được lưu trữ, nhưng không biết "điều gì xảy ra bên trong"
✔ Những bạn muốn trở thành nhà phát triển có thể giải thích được "tại sao" phải sử dụng JPA

Đang dùng JPA trong thực tế nhưng không rõ nguyên nhân gây lỗi
✔ Những người đã nghe về vấn đề N+1 nhưng không tìm ra được khi nó "xảy ra trong code của mình"
✔ Những người gắn @ManyToOne, @OneToMany nhưng không thể giải thích "tại sao phải viết như thế này"
✔ Những người luôn tìm kiếm Google ngay khi gặp lỗi "không nhận diện được thay đổi (dirty checking)"

Tôi muốn vừa chuẩn bị phỏng vấn vừa thực hành cùng lúc
✔ Những bạn muốn trả lời câu hỏi "Hãy giải thích về Persistence Context" dựa trên kinh nghiệm thực tế
✔ Những bạn muốn thành thạo JPA thông qua thực chiến chứ không phải lý thuyết
✔ Những bạn muốn trở thành nhà phát triển có thể nêu ra 3 cách giải quyết cho câu hỏi "Bạn đã từng xử lý vấn đề N+1 chưa?"

🗺️ Khóa học này ở cấp độ Lv.2

Khóa học này là giai đoạn cốt lõi của lộ trình. Nếu bạn đã nắm vững kiến thức cơ bản về Spring Boot ở Lv.1, thì bây giờ là lúc để chinh phục JPA - công nghệ được sử dụng nhiều nhất trong thực tế.

Lv.0 Khái niệm cốt lõi về cơ sở dữ liệu - Củng cố nền tảng trước khi bắt đầu với Spring

Lv.1 Nhập môn Spring Boot - Tạo API bằng Spring, chuẩn bị phỏng vấn

👉 Lv.2 Chinh phục hoàn toàn JPA từ nhà phát triển thực thụ (Khóa học này) - Từ Persistence Context đến QueryDSL

Lv.3 Triển khai (AWS, CI/CD) - Công khai ra thế giới thực thay vì chỉ ở localhost

Lv.5~6 Kiến trúc & Dự án thực tế - Xây dựng hệ thống thương mại điện tử, MSA, DDD

Hãy trang bị những vũ khí thực chiến từ bài giảng này và cùng nhau tiến bước theo từng giai đoạn nhé!


Hãy bắt đầu từ bài giảng này và cùng nhau đi từng bước một nhé!

Thumbnail Spring Boot Lv3

🎁 SỰ KIỆN 🎁

ưu đãi đặc biệt chỉ dành riêng cho những người tham gia khóa học.

Cung cấp Bộ câu hỏi phỏng vấn JPA [Lv.2]

(Tập tài liệu câu hỏi này sẽ được cung cấp dưới dạng liên kết Notion!)

Tôi sẽ tặng giáo trình này cho những bạn viết đánh giá khóa học!

Hãy xác nhận đánh giá khóa học trên cộng đồng và nhận quà nhé!

(Cách thức xác nhận đã được ghi lại ở bài giảng cuối cùng __)


🎁 SỰ KIỆN 2 🎁

Nếu bạn gửi biểu mẫu Google thông qua liên kết tương ứng,

🎟 Chúng tôi sẽ gửi tặng phiếu giảm giá 15% 🎟

🎁 EVENT 3 🎁

Tặng mã sử dụng miễn phí IntelliJ IDE trong 3 tháng!

Với mong muốn ủng hộ việc học tập phát triển của các bạn, mình đã chuẩn bị một ưu đãi đặc biệt thông qua sự hợp tác với JetBrains.
Bạn có thể sử dụng IntelliJ miễn phí trong 3 tháng thông qua mã khuyến mãi dưới đây!


Mã khuyến mãi: HYUNJOONPARKxJB
Nội dung ưu đãi: Gói sử dụng miễn phí 3 tháng cho một IDE JetBrains đơn lẻ (ví dụ: IntelliJ, PyCharm, WebStorm, v.v.)
Hạn sử dụng: Đến ngày 13 tháng 5 năm 2026
Cách sử dụng😀

1. Truy cập trang đăng ký mã giảm giá chính thức của JetBrains

2. Nhập mã và chọn IDE mong muốn

3. Kiểm tra giấy phép đã được cấp qua email


Lưu ý:
Mã này chỉ dành cho người dùng mới sử dụng JetBrains lần đầu.
(Chỉ những người chưa từng có lịch sử sử dụng bản quyền trả phí của JetBrains mới có thể đăng ký)
(Bạn có thể tạo email Google mới để sử dụng vô hạn lần)

Người đã tạo ra bài giảng này

Kể chuyện hậu trường đi phỏng vấn vòng cuối tại Coupang, Yanolja - Câu chuyện nhảy việc qua 24 công ty của lập trình viên 6 năm kinh nghiệm [tập 5]

Dingco Dingco(Giảng viên chính)

  • 2021 ~ 2022: Gia sư thuật toán (data-structure) tại S Coding Club

  • 2022 ~ : Vận hành kênh YouTube về lập trình Dingco Dingco (Sở hữu nhiều nội dung đa dạng liên quan đến việc làm của nhà phát triển)

  • 2022 ~ 2023 : Nhà phát triển server tại Viva Republica


  • Tuyệt đối không từ bỏ học sinh 🦈

  • Vận hành cộng đồng chinh phục việc làm lập trình viên và tổ chức các buổi gặp mặt offline


Lưu ý trước khi đăng ký khóa học

Nếu!! bạn vẫn còn chút đắn đo trước khi đăng ký khóa học.

Liệu tôi có nên học khóa học này ngay bây giờ không?? Nếu bạn đang băn khoăn, đừng ngần ngại liên hệ với chúng tôi qua phòng chat mở bất cứ lúc nào nhé!!

😍 Tôi sẽ cố gắng trả lời thật nhiệt tình 😍 #Java #Spring #Spring Boot #JPA #spring-jpa

Môi trường thực hành

  • Sử dụng intellij. Phiên bản Community (miễn phí) cũng hoàn toàn không có vấn đề gì.

  • Windows hay Mac đều không thành vấn đề! Tôi cung cấp đầy đủ phương pháp cài đặt cho từng hệ điều hành.


Tài liệu học tập

  • Tất cả sẽ được chia sẻ qua Notion và tệp PDF!

  • Tôi sẽ chia sẻ mã nguồn của dự án cho bạn!

Kiến thức tiên quyết và lưu ý

  • Người đã học qua một chút về Spring

  • Người có kinh nghiệm với MySQL CRUD


Khuyến nghị cho
những người này

Khóa học này dành cho ai?

  • Dành cho những ai muốn nắm bắt khái niệm JPA là gì và tại sao nên sử dụng nó.

  • Những người muốn thu hút thêm câu hỏi từ người phỏng vấn bằng các câu trả lời dựa trên kinh nghiệm thực tế.

  • Dành cho những ai đã hiểu @ManyToOne nhưng vẫn chưa rõ tại sao cần quan hệ hai chiều và mappedBy là gì.

  • Những ai muốn biết nguyên lý về thời điểm truy vấn được gửi đi, cơ chế hoạt động của việc phát hiện thay đổi (dirty checking), và tại sao không cần sử dụng update().

  • Những người cần kỹ năng thực tế để có thể đọc log truy vấn và trực tiếp giải quyết vấn đề.

Cần biết trước khi bắt đầu?

  • Ngữ pháp Java cơ bản (câu lệnh if, vòng lặp for, lớp, giao diện)

  • Kinh nghiệm tạo REST API đơn giản bằng Spring Boot

  • Kinh nghiệm thực hiện CRUD DB bằng JdbcTemplate (cơ bản như SQL SELECT, INSERT, v.v.)

Xin chào
Đây là dingcodingco

17,161

Học viên

1,717

Đánh giá

330

Trả lời

4.9

Xếp hạng

21

Các khóa học

🚀 Từng làm việc tại Toss, tốt nghiệp POSTECH | Nhà phát triển Backend hiện tại (+8 năm)
🎥 YouTuber 20.000 người đăng ký | Sản xuất nội dung về lập trình
📚 Giảng viên Inflearn | Tổng số học viên 15.000+
👥 Đang vận hành cộng đồng tuyển dụng lập trình viên (8.000+)
🧩 Người đóng góp (Contributor) cho nhiều dự án mã nguồn mở (Gradle, Spring AI, v.v.)
📝 Kinh nghiệm vượt qua vòng hồ sơ tại 38 công ty và hơn 100 lần chỉnh sửa CV trên Kmong (Đánh giá 5.0 sao)

Tôi truyền đạt những thông tin thực tế từ ngành công nghiệp một cách dễ hiểu và có tính diễn dịch.
I deliver vivid, real-world industry insights in an easy-to-understand and deductive manner.

Link phỏng vấn Inflearn!

Thêm

Chương trình giảng dạy

Tất cả

41 bài giảng ∙ (9giờ 39phút)

Ngày đăng: 
Cập nhật lần cuối: 

Đánh giá

Chưa có đủ đánh giá.
Hãy trở thành tác giả của một đánh giá giúp mọi người!

Khóa học khác của dingcodingco

Hãy khám phá các khóa học khác của giảng viên!

Khóa học tương tự

Khám phá các khóa học khác trong cùng lĩnh vực!