Thẻ
#spring

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.

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

Task API gom Ngày 11–29 vào một: DTO + validation, ProblemDetail, phân trang, transaction ở service, auditing — và checklist review để tự chấm mọi CRUD API.

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.

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.

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

Ngày 26 của 99 Ngày Spring: quan hệ N-N luôn sống trong bảng trung gian — @ManyToMany với @JoinTable cho quan hệ thuần túy, owning side và Set với luật cascade cấm REMOVE trên tài nguyên chia sẻ, và entity trung gian tách N-N thành hai lần 1-N khi quan hệ cần cột riêng, ....

Ngày 25 của 99 Ngày Spring: ánh xạ quan hệ với @ManyToOne giữ khóa ngoại ở phía nhiều (và vì sao phải LAZY từ đầu), @OneToMany với mappedBy làm tấm gương đọc, owning side — phía duy nhất JPA lắng nghe khi ghi, cùng cascade và orphanRemoval cho quan hệ sở hữu trọn vẹn.

Ngày 24 của 99 Ngày Spring: vượt ranh giới derived query với @Query — JPQL truy vấn trên entity với lưới an toàn fail-fast lúc khởi động, bind tham số theo tên làm hàng rào chống SQL injection, native query cho tính năng riêng của DB kèm đánh đổi, và @Modifying cho bulk update đi thẳng xuống DB.