inflearn logo

[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.

50 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ế.

Học Spring như thế này thì sẽ bị đánh trượt khi 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, rồi mapping 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ó 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.

"Có cách nào khác để lưu vào DB 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ạ?"

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 nỗi khổ đó.


Hầu hết các bài giảng JPA chỉ dạy "cách sử dụng" như thế nào.

"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 lưu trữ)."

"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ì sẽ lưu được ạ..."

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

Bởi vì bạn chưa bao giờ thử làm mà không có JPA. Vì chưa từng viết 35 dòng mã bằng JDBC, nên bạn 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 bài bản, bạn không nên học save() trước. Bạn phải trải qua nỗi khổ của 35 dòng mã JDBC trước đã.

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

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

Vào khoảnh khắc này, nó sẽ trở nên như thế này: "À... hóa ra đây là lý do tại sao phải dùng JPA. Đây là lý do tại sao cần đến 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ẽ khắc sâu vào tận xương tủy của bạn.

Trải 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 trả lời trong buổi phỏng vấn như thế này.

❌ (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 đã từng trực tiếp phát triển bằng JDBC, và tôi nhận thấy vấn đề không chỉ nằm ở việc phải lặp đi lặp lại việc viết SQL, mà quan trọng hơn hết là sự bất đồng bộ xảy ra khi lưu trữ vào DB nếu chúng ta 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 thông qua 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 rồi'.

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

🧠 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 query để gửi đi một lần

  • Hiểu về trì hoãn ghi qua việc gom đơn giao hàng — Gửi từng cái thì không 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 thông qua 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.

  • Giải thích mọi khái niệm bắt đầu từ câu hỏi "Tại sao công nghệ này lại ra đời".

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


  • Lộ trình học tập thực chiến kết nối trực tiếp đến 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 bảo bạn "hãy làm thế này".

Bài giảng 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 nghiệm địa ngục 35 dòng SELECT bằng 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 bạn đã 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 "Khổ đau → 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 đó 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ự nhầm lẫ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 và dán createdAt cho tất cả các thực thể → Giải quyết triệt để bằng BaseEntity / Thảm họa xóa toàn bộ Value Type Collection → Mô hình nâng cấp thực thể (Entity Promotion)

Tuần 5: Lỗi đánh máy trong chuỗi JPQL 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 rá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ừ 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 phỏng vấn của khóa học tạo sự khác biệt cho CV Backend)

Rất đề xuất cho những người sau đây

Tôi vẫn chưa nắm rõ 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() sẽ lưu dữ liệu 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

Sử dụng JPA trong thực tế nhưng không biết nguyên nhân gây lỗi
✔ Người đã nghe về vấn đề N+1 nhưng không thể tìm ra khi nó "xảy ra trong code của mình"
✔ 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"
✔ Người luôn tìm kiếm Google đầu tiên 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 giải pháp cho câu hỏi "Bạn đã từng giải quyết 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 - thứ đượ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 với 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 E-commerce, MSA, DDD

Hãy trang bị những vũ khí thực chiến ngay trong khóa học 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 tiến bước theo từng giai đoạn nhé!

Thumbnail Spring Boot Lv3

🎁 SỰ KIỆN 🎁

Có một ư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ài liệu ôn tập này được cung cấp dưới dạng liên kết Notion!)

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

Hãy nhận tài liệu sau khi xác nhận đánh giá khóa học tại cộng đồng!

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


🎁 SỰ KIỆN 2 🎁

Nếu bạn gửi khảo sát Google thông qua liên kết tương ứng,,

🎟 Tôi sẽ gửi tặng bạn 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 lập trình 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 bất kỳ (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. Sau khi nhập mã, hãy chọn IDE bạn muốn

3.Kiểm tra giấy phép (license) đã đượ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ể làm vô hạn lần bằng cách tạo email Google mới)

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]

Dingcodingco(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 viên 🦈

  • 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 còn chút đắn đo nào trước khi đăng ký khóa học.

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

😍 Tôi sẽ cố gắng hết sức để giải đáp thắc mắc của bạn 😍 #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 không thành vấn đề.

  • Windows hay Mac đều không thành vấn đề! Chúng 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 dự án cho bạn!

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

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

  • Người có kinh nghiệm về 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

16,164

Học viên

1,627

Đánh giá

306

Trả lời

4.9

Xếp hạng

19

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ả

40 bài giảng ∙ (4giờ 10phú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!

Ưu đãi có thời hạn

8.867 ₫

29%

2.089.025 ₫