Thẻ

#jpa

99 Ngày Spring — Ngày 40: Tổng kết tối ưu JPA

Checklist bảy vấn đề theo thứ tự đáng sửa trước: N+1 query và ba cách chữa, projection, keyset pagination, index khóa ngoại, transaction gọn, batch ghi — và nguyên tắc đo trước, cache cuối cùng.

5 thg 9, 20267 phút14
99 Ngày Spring — Ngày 39: Soft delete & entity patterns

Soft delete với @SQLDelete và bốn cái bẫy của nó, optimistic locking bằng @Version chống lost update, và mapping enum — vì sao ORDINAL mặc định là cái bẫy nguy hiểm nhất của tầng entity.

4 thg 9, 20269 phút16
99 Ngày Spring — Ngày 38: Nhiều datasource

Khai datasource thứ hai là tắt auto-config: ba bean phải tự dựng cho mỗi DB, @Primary và tách package entity, @Transactional gọi tên manager — cùng giới hạn không trải transaction qua hai database.

3 thg 9, 20268 phút15
99 Ngày Spring — Ngày 33: Projection — chỉ lấy cột cần

Chi phí ba tầng của SELECT cả entity, interface projection đổi mỗi kiểu trả về, record projection cho DTO đi xa, dynamic projection — và bẫy open projection.

29 thg 8, 20268 phút13
99 Ngày Spring — Ngày 32: Specification & dynamic query

Bộ lọc tùy chọn làm derived query bùng nổ 2ⁿ — Specification biến mỗi điều kiện thành mảnh LEGO ghép and/or lúc chạy, mẹo null-safe, 4 bẫy và ranh giới QueryDSL.

28 thg 8, 20269 phút17
99 Ngày Spring — Ngày 31: Pagination nâng cao

Hóa đơn count(*) sau mỗi Page, Slice với mẹo size+1, vì sao offset sâu vừa chậm vừa trôi dữ liệu — và keyset pagination bằng con trỏ (createdAt, id).

27 thg 8, 20269 phút19
99 Ngày Spring — Ngày 29: Auditing với Spring Data JPA

BaseEntity với @CreatedDate/@LastModifiedDate, AuditorAware cho @CreatedBy, những chỗ auditing không chạy (bulk update, JDBC) — và cách test tất định bằng DateTimeProvider.

25 thg 8, 20269 phút20
99 Ngày Spring — Ngày 28: Transaction & @Transactional

ACID, proxy đứng sau @Transactional, propagation REQUIRED vs REQUIRES_NEW, quy tắc rollback với bất ngờ checked exception — và bẫy self-invocation.

24 thg 8, 202612 phút32
99 Ngày Spring — Ngày 27: Lazy vs Eager & bài toán N+1

Ngày 27 của 99 Ngày Spring: FetchType và cơ chế proxy của LAZY (cùng LazyInitializationException và sự thật về open-in-view), tự tay tái hiện bài toán N+1 với 21 câu SQL cho 20 bài viết, sửa bằng JOIN FETCH với cặp LEFT + DISTINCT, @EntityGraph cho derived query, và bẫy phân trang trong bộ nhớ.

23 thg 8, 20267 phút44