- "Tôi dùng JPA vì nó là ORM nên rất tiện lợi."
- Tôi biết rằng dùng save() thì sẽ được lưu lại.
- Về ngữ cảnh lưu trữ (persistence context)... tôi không rõ lắm.
[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.
113 học viên
Độ khó Cơ bản
Thời gian Không giới hạn


Đánh giá từ những học viên đầu tiên
5.0
5.0
Bruce Han
Điểm rất tốt của khóa học này - Giảng viên dạy JPA rất tốt, tập trung vào thực tế. - Giải thích lý thuyết thông qua các phép ẩn dụ giúp tôi hiểu bài rất nhanh. Lưu ý khi nghe giảng - Nếu chỉ nghe không thì sẽ không nhớ được lâu. Vì vậy, tôi nghĩ việc nghe xong mỗi bài giảng, thực hành gõ theo giáo trình và hiểu rõ rồi mới chuyển sang bài tiếp theo là rất quan trọng. Điểm cần cải thiện để tốt hơn - Thỉnh thoảng có lỗi đánh máy trong video. Ví dụ, có những trường hợp phụ đề hiển thị sai từ như tính đa hình (다형성) thành tính đa dạng (다양성), hay giải thích nhầm builder.and thành builder.end.
5.0
minjung0768
Trước đây tôi chỉ mới dừng lại ở việc gắn các annotation mà chưa hiểu rõ cơ chế hoạt động bên trong, nhưng thông qua việc đi sâu vào mã kiểm thử và triển khai thực tế, tôi đã hiểu rõ hơn về cách nó hoạt động một cách logic và lý do tại sao chúng ta sử dụng JPA!
5.0
techietaek
Đây là khóa học được thiết kế để bạn có thể giới thiệu và thực hành mọi thứ từ cơ bản đến mã nguồn cấp độ thực tế của JPA. Không chỉ dừng lại ở cách sử dụng đơn thuần, khóa học còn giúp tôi nắm vững nền tảng cơ bản chắc chắn hơn thông qua việc học hỏi các nguyên lý hoạt động bên trong! Cảm ơn vì một bài giảng tuyệt vời!
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ế.
Lưu được bằng save(), nhưng nếu không giải thích được
‘tại sao’ thì bạn sẽ bị đánh trượt.
Dành cho những ai đã thực hiện CRUD bằng JdbcTemplate nhưng lại bị khựng lại trước câu hỏi "Persistence Context là gì?". Với phương pháp học “Khổ trước → Sướng sau”, bạn sẽ trải qua nỗi đau của 35 dòng mã JDBC thuần túy trước khi nhận ra sự vĩ đại của JPA, từ đó trở thành một nhà phát triển có thể giải thích tường tận cả các cơ chế hoạt động bên trong.
Hầu hết các khóa học JPA đều chỉ dạy ‘làm thế nào’.
"Chỉ cần gắn @Entity và dùng save() là được." Làm theo thì chạy đấy. Nhưng người phỏng vấn sẽ hỏi: "Nguyên lý hoạt động của Persistence Context là gì?", "Bạn đã giải quyết vấn đề N+1 như thế nào?".
"Chỉ dừng lại ở việc gắn @Entity và sử dụng save() là xong".
Họ không thể giải thích được nguyên lý của persistence context, N+1 và dirty checking.
Không trải qua nỗi khổ của 35 dòng mã JDBC thì sẽ không biết trân trọng sự tiện lợi của JPA.
Các khái niệm cốt lõi, một khi đã nghe là không thể nào quên.
Persistence Context · Write-behind · Lazy Loading · Dynamic Query · N+1 · Mapping — Tôi sẽ giải thích cho bạn "Cái gì và Tại sao" thông qua những ví dụ ẩn dụ thay vì chỉ là những dòng code khô khan.
"Context persistence là gì?"
Giải thích đây là một thư ký làm việc bằng bộ nhớ đệm cấp 1 và phát hiện thay đổi.
"Khi nào lệnh INSERT được gửi đi vậy?"
Trả lời rằng sẽ gom lại rồi gửi đi cùng một lúc giống như gom hàng chuyển phát nhanh.
"Loading trễ hoạt động như thế nào vậy?"
Giải thích rằng nhân viên giả (proxy) sẽ tải dữ liệu khi công việc thực sự phát sinh.
"Bạn đã viết truy vấn động như thế nào?"
Lắp ráp QueryDSL như Lego giúp an toàn ngay tại thời điểm biên dịch (compile time).
"Bạn đã giải quyết vấn đề N+1 như thế nào?"
Trả lời bằng 3 phương pháp bao gồm Fetch Join.
"Tại sao bạn lại thiết lập @ManyToOne như vậy?"
Giải thích rằng sự bất đồng nhất giữa Đối tượng ↔ Bảng sẽ được giải quyết thông qua việc mapping.
Phải trực tiếp trải nghiệm thì mới khắc cốt ghi tâm.
Không nên học save() trước. Mỗi tuần bạn sẽ trực tiếp trải nghiệm quá trình “khổ đau → cứu rỗi”. Sau khi nếm trải địa ngục của 35 dòng code và sự bùng nổ của N+1, các nguyên lý đó sẽ tự khắc tuôn trào khi bạn đi phỏng vấn.
Tôi đã phải viết tới 35 dòng code chỉ cho một câu lệnh SELECT bằng JDBC.
Sau nỗi đau đó, tôi đã cảm nhận được cuộc cách mạng của 3 dòng ngữ cảnh bền vững (persistence context).
Dữ liệu đã bị ô nhiễm do thiếu EnumType và sử dụng merge().
EnumType.STRING·Phát hiện thay đổi giúp bảo vệ dữ liệu một cách an toàn.
Truy vấn 10 thành viên mà tốn tận 11 câu lệnh query.
Chỉ với một dòng Fetch Join, tôi đã cảm nhận được số lượng truy vấn giảm xuống còn 1.
Tôi đã sao chép và dán createdAt vào tất cả các thực thể.
BaseEntity một phát kế thừa các trường chung.
Lỗi đánh máy trong chuỗi JPQL đã gây ra sự cố trong lúc chạy (runtime).
QueryDSL giúp phát hiện lỗi ngay tại thời điểm biên dịch (compile time).
Cùng một câu hỏi, câu trả lời sẽ quyết định việc đậu hay trượt.
- "Khi trực tiếp làm bằng JDBC, tôi đã thấy sự bất đồng nhất giữa đối tượng và bảng rất khó khăn."
- "Bộ nhớ đệm cấp 1 (1st level cache) và cơ chế phát hiện thay đổi (dirty checking) của Persistence Context đã giải quyết được vấn đề này."
- Đối với N+1, tôi trả lời bằng 3 cách bao gồm cả Fetch Join.
Làm được CRUD rồi, nhưng đi phỏng vấn lại tiếp tục bị tắc nghẽn.
Tôi đã tạo được CRUD bằng JdbcTemplate. Tuy nhiên, kịch bản bị đánh trượt quen thuộc lại bắt đầu.
Khóa học này là trọng tâm của lộ trình, Lv.2.
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ế.
Xây dựng nền tảng cơ bản trước khi bắt đầu với Spring.
Tạo API bằng Spring và chuẩn bị cho phỏng vấn.
Từ bối cảnh bền vững (Persistence Context) cho đến QueryDSL.
Nếu đã trang bị đầy đủ vũ khí thực chiến, giờ là lúc tạo sự khác biệt bằng sơ yếu lý lịch để vượt qua vòng hồ sơ.
Có phải bạn đã từng như thế này không?
"Giải thích về Persistence Context" mà bạn từng bị ngắc ngứ không nói nên lời?
"Bạn đã bao giờ giải quyết vấn đề N+1 chưa?" mà chỉ có thể trả lời được duy nhất một cách?
5 tuần 41 bài giảng · Từ Persistence Context đến QueryDSL.
Persistence Context → Entity Mapping → Mối quan hệ & Proxy → Kế thừa & Value Type → QueryDSL. Trải nghiệm từng khái niệm theo lộ trình “Nỗi đau → Sự cứu rỗi”. Nhấn vào từng phần để xem mục lục chi tiết.
섹션 1. 🦸 1주차 · 영속성 컨텍스트, JDBC 고통 → 구원영속성 컨텍스트
- 1😱 Nỗi đau của JDBC thuần túy: 35 dòng code chỉ cho một câu lệnh SELECT
- 2🦸 Persistence Context: Vị cứu tinh giải quyết mọi nỗi đau
- 3📦 Bộ nhớ đệm cấp 1: Bí mật của việc tối thiểu hóa truy cập DB
- 4🔍 Phát hiện thay đổi: Tôi biết bạn đã thay đổi những gì
- 5📮 Trì hoãn ghi: Gom lại xử lý một lần
섹션 2. 🏷️ 2주차 · 엔티티 매핑과 Spring Data JPA엔티티 매핑
- 6🏷️ Hiểu rõ về @Entity·@Table·@Column
- 7🔑 Chiến lược ánh xạ khóa chính
- 8🚽 Flush: Khoảnh khắc nước xả xuống
- 9👻 Trạng thái Detached: Khi thư ký tan làm
- 10🎁 Spring Data JPA + Cạm bẫy của save()·merge()
섹션 3. 🌍 3주차 · 연관관계와 프록시·지연 로딩연관관계·프록시
- 11🌍 Thế giới đối tượng vs Thế giới bảng
- 12↔️ Quan hệ liên kết đơn hướng·song hướng và quy tắc của chủ sở hữu
- 13⚡ Tải tức thì (Eager) vs Tải trì hoãn (Lazy): Tại sao LAZY là mặc định?
- 14🎭 Proxy: Đối tượng giả giúp thực hiện Loading trì hoãn (Lazy Loading)
- 15👨👦 CASCADE·Loại bỏ đối tượng mồ côi (Orphan Removal)
섹션 4. 🧬 4주차 · 상속 매핑과 값 타입상속·값 타입
- 16🧬 Mapping quan hệ kế thừa: Chiến lược Join vs Bảng đơn
- 17📋 @MappedSuperclass: Các trường chung với BaseEntity
- 18💳 Thực tế: Kế thừa Domain thanh toán + AttributeConverter
- 19🎁 Kiểu giá trị: Embedded · Đối tượng bất biến
- 20📚 Hạn chế và giải pháp thay thế cho Collection loại giá trị
섹션 5. 🏗️ 5주차 · QueryDSL 실무QueryDSL
- 21🏗️ Thiết lập môi trường dự án và bí mật của Q-Class
- 22🔎 Cú pháp cơ bản: Tìm kiếm·Sắp xếp·Phân trang·Tập hợp
- 23🔗 Join và Fetch Join: Giải pháp cho vấn đề N+1
- 24🚦 Truy vấn động: BooleanBuilder·Đa tham số
- 25⚡ Tối ưu hóa hiệu suất: Truy vấn DTO · Thao tác Bulk
Làm được CRUD nhưng không thể giải thích được cơ chế bên trong.
Người phù hợp
Những người đã thực hiện CRUD bằng JdbcTemplate nhưng không biết về "Persistence Context" (Ngữ cảnh lưu trữ)
Những người biết save() nhưng không biết "điều gì xảy ra bên trong"
Những người không tìm ra được lỗi N+1 khi nó xảy ra trong code của mình
Những người muốn trả lời câu hỏi "Hãy giải thích về Persistence Context" bằng chính kinh nghiệm của mình
Những người cần điều chỉnh mức độ kỳ vọng
- Những người hoàn toàn chưa biết gì về Spring·JPA (Khuyên bạn nên học Lv.1 trước)
- Những người chưa quen với cú pháp Java
- Những người chỉ khăng khăng sử dụng SQL thuần túy mà không có ORM
Lv.2 — Nếu có kinh nghiệm ở mức độ Lv.1 thì có thể bắt đầu.
Kinh nghiệm sử dụng Spring dù chỉ là một chút (Khuyến nghị đã hoàn thành khóa học Nhập môn Spring Boot Lv.1).
Kinh nghiệm MySQL CRUD.
IntelliJ Community (miễn phí) là đủ — không quan trọng Windows hay Mac, có hướng dẫn cài đặt cho từng hệ điều hành.
Sau khi kết thúc khóa học, bạn sẽ đạt được bốn điều này.
Giải thích chi tiết về bộ nhớ đệm cấp 1 và cơ chế phát hiện thay đổi (dirty checking) của Persistence Context cho đến tận nguyên lý hoạt động bên trong.
Giải quyết vấn đề N+1 bằng 3 phương pháp bao gồm Fetch Join.
Ánh xạ quan hệ giúp giải quyết sự bất tương đồng giữa mô hình đối tượng và bảng biểu.
QueryDSL giúp tạo các truy vấn động an toàn trong thời gian biên dịch.
Đích thân nhà phát triển đang làm việc thực tế, người từng tham gia phỏng vấn vòng cuối tại Coupang và Yanolja.
Giảng viên là nhà phát triển 6 năm kinh nghiệm, từng vào đến vòng phỏng vấn cuối cùng tại Coupang và Yanolja, đồng thời sở hữu câu chuyện nhảy việc qua 24 công ty, sẽ trực tiếp giảng dạy.
Cựu nhà phát triển server tại Viva Republica (Toss) — giải thích lý do "tại sao" dưới góc nhìn đã được kiểm chứng qua thực tế.
"Không chỉ dừng lại ở việc chỉ dạy "cách làm", khóa học sẽ kết nối từ Khái niệm → Trải nghiệm trực tiếp → cho đến tận Câu trả lời phỏng vấn.
Tôi vận hành cộng đồng chinh phục việc làm cho nhà phát triển (KakaoTalk, Discord) và hỗ trợ học viên cho đến cuối cùng.
Nếu bạn để lại đánh giá khóa học, chúng tôi sẽ tặng bạn bộ câu hỏi phỏng vấn JPA.
Các câu hỏi phỏng vấn thường gặp và câu trả lời mẫu về Persistence Context, N+1, QueryDSL, v.v. — Đây là bộ câu hỏi trên Notion để bạn có thể trực tiếp luyện tập.
Chỉ mở rộng và kiểm tra những phần bạn thắc mắc.
JPA를 처음 보는데 들어도 되나요?
Khóa học này ở cấp độ Lv.2. Nội dung được xây dựng dựa trên giả định rằng bạn đã từng thực hiện CRUD với JdbcTemplate hoặc có kinh nghiệm ở mức độ nhập môn Spring Boot Lv.1. Nếu bạn hoàn toàn mới bắt đầu với JPA, tôi khuyên bạn nên bắt đầu từ Lv.1.
따라하기 강의랑 뭐가 다른가요?
Tôi cố tình mang đến sự khó khăn trước. Chỉ sau khi bạn tự mình viết 35 dòng mã cho một câu lệnh SELECT bằng JDBC thuần túy, và trải qua địa ngục khi 11 câu truy vấn bùng nổ do lỗi N+1, bạn mới thực sự cảm nhận được sự vĩ đại của 3 dòng mã Persistence Context và một dòng Fetch Join. Trải nghiệm này sẽ tạo nên những câu trả lời phỏng vấn bắt đầu bằng cụm từ "Tôi đã trực tiếp trải nghiệm việc đó".
실습 환경은 어떻게 되나요?
Sử dụng IntelliJ. Phiên bản Community (miễn phí) là đủ và có thể sử dụng trên cả Windows lẫn Mac. Tài liệu học tập (Notion·PDF) và mã nguồn dự án sẽ được chia sẻ.
이 강의를 들으면 어디까지 할 수 있나요?
Chinh phục JPA, công nghệ được sử dụng nhiều nhất trong thực tế, từ Persistence Context, Quan hệ (Association), Proxy, Mapping kế thừa, Value Type cho đến QueryDSL. Đây là Lv.2 trong lộ trình Backend, là bước tiếp theo sau Lv.1 (Nhập môn Spring Boot).
Đừng học thuộc lòng, hãy giải thích cả lý do 'tại sao' lại cần ngữ cảnh lưu trữ (persistence context).
Phải trải qua nỗi đau của 35 dòng mã JDBC thì mới thấy được cuộc cách mạng của 3 dòng mã JPA. Phải nếm trải địa ngục N+1 thì Fetch Join mới khắc sâu vào xương tủy. Sau 5 tuần nữa, bạn sẽ có thể bắt đầu câu trả lời bằng cụm từ: "Tôi đã trực tiếp trải nghiệm điều đó rồi...".
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
Xác minh Inflearn
Xác minh sự nghiệp
17,784
Học viên
1,810
Đánh giá
346
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.
Chương trình giảng dạy
Tất cả
41 bài giảng ∙ (9giờ 39phút)
Đánh giá
Tất cả
5 đánh giá
5.0
5 đánh giá
trixielĐánh giá 6
∙
Đánh giá trung bình 5.0
techietaekĐánh giá 5
∙
Đánh giá trung bình 5.0
5
100% đã tham giaĐây là khóa học được thiết kế để bạn có thể giới thiệu và thực hành mọi thứ từ cơ bản đến mã nguồn cấp độ thực tế của JPA. Không chỉ dừng lại ở cách sử dụng đơn thuần, khóa học còn giúp tôi nắm vững nền tảng cơ bản chắc chắn hơn thông qua việc học hỏi các nguyên lý hoạt động bên trong! Cảm ơn vì một bài giảng tuyệt vời!
gkdldhĐánh giá 6
∙
Đánh giá trung bình 5.0
asdfasdfasdf1Đánh giá 19
∙
Đánh giá trung bình 5.0
- brucehan
Đánh giá 94
∙
Đánh giá trung bình 4.4
Đã chỉnh sửa
5
100% đã tham giaĐiểm rất tốt của khóa học này - Giảng viên dạy JPA rất tốt, tập trung vào thực tế. - Giải thích lý thuyết thông qua các phép ẩn dụ giúp tôi hiểu bài rất nhanh. Lưu ý khi nghe giảng - Nếu chỉ nghe không thì sẽ không nhớ được lâu. Vì vậy, tôi nghĩ việc nghe xong mỗi bài giảng, thực hành gõ theo giáo trình và hiểu rõ rồi mới chuyển sang bài tiếp theo là rất quan trọng. Điểm cần cải thiện để tốt hơn - Thỉnh thoảng có lỗi đánh máy trong video. Ví dụ, có những trường hợp phụ đề hiển thị sai từ như tính đa hình (다형성) thành tính đa dạng (다양성), hay giải thích nhầm builder.and thành builder.end.
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!


![[Phần mềm hậu trường/Kịch bản xử lý ngoại lệ/Tối ưu hóa tổng hợp] Chiến lược tăng cường danh mục đầu tư phần mềm hậu trường và kinh nghiệm thực tế. Phần 1 toàn diệnHình thu nhỏ khóa học](https://cdn.inflearn.com/public/courses/335091/cover/1a19a4de-ec2e-4e26-a84e-28691e777020/335091.jpg?w=420)




