- "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 persistence (영속성 컨텍스트)... 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.
116 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
안승현
Tôi đang lắng nghe rất kỹ, tuy là ý kiến chủ quan nhưng đây là bài giảng dễ hiểu nhất đối với tôi.
5.0
부분적무료화
Khóa học này giải thích JPA một cách cực kỳ dễ hiểu, đồng thời giải thích rất tốt về sự khác biệt trong mô hình (paradigm) giữa đối tượng và bảng DB kèm theo các ví dụ cụ thể. Thay vì chỉ dừng lại ở việc liệt kê các tính năng của JPA, giảng viên còn đưa ra các ví dụ về những tính năng nên dùng và những tính năng nên hạn chế, đồng thời gợi ý cách sử dụng thực tế trong công việc. Đối với những người đã sử dụng JPA khá thành thạo trong thực tế, đây là một khóa học tốt để ôn lại kiến thức. Còn đối với những người mới bắt đầu hoặc đang cân nhắc áp dụng JPA, nếu sử dụng khóa học này như một cuốn sách hướng dẫn, tôi tin rằng các bạn có thể xây dựng dịch vụ mà không gặp quá nhiều khó khăn.
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ệnh save() thì chạy được, 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ì?". Thông qua phương pháp học tập “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ơ chế hoạt động bên trong.
Hầu hết các bài giảng JPA chỉ dạy 'làm thế nào' (how).
"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".
Không thể giải thích được nguyên lý của persistence context, N+1 và dirty checking.
Vì không trải qua nỗi khổ của 35 dòng mã JDBC, nên họ 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 · Association — Không chỉ là mã nguồn, chúng tôi sẽ giải thích tận gốc "Cái gì · Tại sao" thông qua những ví dụ so sánh sinh động.
"Persistence Context là gì?"
Giải thích như 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 thực hiện vậy?"
Trả lời rằng chúng ta 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. loads when real work arises.
"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 cách, bao gồm cả Fetch Join..
"Tại sao bạn lại thiết lập @ManyToOne như vậy?"
Giải thích rằng sự không khớp giữa đối tượng và bảng được giải quyết thông qua việc ánh xạ (mapping). is resolved through 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 qua cảm giác “khổ trước sướng sau”. 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ể.
Kế thừa các trường chung chỉ với một lần thiết lập BaseEntity.
Lỗi đánh máy trong chuỗi JPQL đã gây ra sự cố trong thời gian 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 đã gặp khó khăn với sự không đồng nhất giữa đối tượng và bảng."
- "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 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 lại tiếp tục gặp bế tắc khi phỏng vấn.
Tôi đã tạo được CRUD bằng JdbcTemplate. Tuy nhiên, kịch bản bị loại 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ị được những 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ó bao giờ bạn gặp tình huống như thế này chưa?
Bạn đã bao giờ cứng họng khi được yêu cầu "Hãy giải thích về Persistence Context (Ngữ cảnh bền vững)" chưa?
"Bạn đã từng giải quyết vấn đề N+1 chưa?" mà bạn chỉ có thể trả lời được duy nhất một cách chưa?
5 tuần 41 bài giảng · Từ Persistence Context đến QueryDSL.
Persistence Context → Entity Mapping → 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 → 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📦 Cache cấp 1: Bí mật của việc giảm thiểu 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õ hoàn toàn về @Entity·@Table·@Column
- 7🔑 Chiến lược mapping 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⚡ Eager Loading vs Lazy Loading: Tại sao LAZY là mặc định?
- 14🎭 Proxy: Đối tượng giả giúp thực hiệ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📚 Những hạn chế và giải pháp thay thế cho Value Type Collection
섹션 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
Nếu bạn có thể thực hiện CRUD nhưng không thể giải thích được cơ chế bên trong.
Đối tượng phù hợp
Những người đã thực hiện CRUD bằng JdbcTemplate nhưng không biết về "Persistence Context"
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 (Ngữ cảnh lưu trữ)" 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ỉ kiên trì với 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ẽ làm được bốn điều này.
Giải thích chi tiết về bộ nhớ đệm cấp 1 (1st level cache) 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., including the first-level cache and dirty checking.
Giải quyết vấn đề N+1 bằng 3 phương pháp bao gồm Fetch Join. using three methods, including 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 (compile-time).
Trực tiếp bởi 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.
Được giảng dạy trực tiếp bởi 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 của Coupang và Yanolja, đồng thời sở hữu câu chuyện nhảy việc qua 24 công ty.
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 trong 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 → đến cả 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ẽ gửi 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 chưa biết gì về 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ự tay 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 truy vấn bùng nổ thành 11 cái 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 đó rồi".
실습 환경은 어떻게 되나요?
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 cụ được sử dụng nhiều nhất trong thực tế, từ bối cảnh persistence (영속성 컨텍스트), quan hệ (연관관계), proxy, mapping kế thừa, kiểu giá trị (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 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ể trả lời bắt đầu bằng câu: "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
18,038
Học viên
1,845
Đánh giá
346
Trả lời
4.9
Xếp hạng
21
Các khóa học
Link giảm giá coupon 15% miễn phí!
🚀 Từng làm việc tại Toss, tốt nghiệp POSTECH | Nhà phát triển Backend hiện tại (+9 năm)
🎥 Youtuber 20.000 sub | Sáng tạo nội dung lập trình
📚 Giảng viên Inflearn | Tổng số học viên 18.000+
👥 Đang điều hành cộng đồng tuyển dụng lập trình viên (8.000+)
🧩 Contributor cho nhiều dự án mã nguồn mở (Gradle, Spring AI, v.v.)
📝 Kinh nghiệm đậu 38 bộ hồ sơ 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ế sống động từ ngành công nghiệp một cách dễ hiểu và có tính diễn dịch.
Chương trình giảng dạy
Tất cả
41 bài giảng ∙ (9giờ 39phút)
Đánh giá
Tất cả
8 đánh giá
5.0
8 đánh giá
trixielĐánh giá 6
∙
Đánh giá trung bình 5.0
tarrot1415Đánh giá 3
∙
Đánh giá trung bình 5.0
5
100% đã tham giaKhóa học này giải thích JPA một cách cực kỳ dễ hiểu, đồng thời giải thích rất tốt về sự khác biệt trong mô hình (paradigm) giữa đối tượng và bảng DB kèm theo các ví dụ cụ thể. Thay vì chỉ dừng lại ở việc liệt kê các tính năng của JPA, giảng viên còn đưa ra các ví dụ về những tính năng nên dùng và những tính năng nên hạn chế, đồng thời gợi ý cách sử dụng thực tế trong công việc. Đối với những người đã sử dụng JPA khá thành thạo trong thực tế, đây là một khóa học tốt để ôn lại kiến thức. Còn đối với những người mới bắt đầu hoặc đang cân nhắc áp dụng JPA, nếu sử dụng khóa học này như một cuốn sách hướng dẫn, tôi tin rằng các bạn có thể xây dựng dịch vụ mà không gặp quá nhiều khó khăn.
abeb30318Đá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!
- 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)



