Chuyên mục
Backend
APIs, databases and distributed systems.

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.

Công thức lớp bất biến, vì sao final chưa đủ và defensive copy hai chiều, List.copyOf vs unmodifiableList — và món quà thread-safe không cần lock.

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.

Pattern & Matcher, cú pháp dùng hằng ngày, group có tên để trích xuất, replaceAll/split với các bẫy — và ranh giới nơi regex nên dừng lại.

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 27 của 99 Ngày Java: vì sao 0.1 + 0.2 không bằng 0.3 và ranh giới double-cho-đo-lường vs BigDecimal-cho-tiền, hai công cụ bị bỏ quên của Math là floorMod và addExact, Random tất định theo seed vs SecureRandom bắt buộc cho bảo mật, .....

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 26 của 99 Ngày Java: java.time thay thế trọn bộ Date/Calendar với thiết kế immutable — bộ ba LocalDate/LocalTime/LocalDateTime, cặp khái niệm giờ máy Instant vs giờ người ZonedDateTime cùng quy tắc vàng lưu UTC hiển thị theo múi giờ, Duration vs Period và DateTimeFormatter thread-safe.
