41 bài. Tìm theo nội dung hoặc lọc theo mạch đọc.
Hai bản mô tả chính xác ghép vừa khít mà vẫn hụt một bước. Trong lời kể, chỗ hết phần việc của tôi nghe hệt chỗ hết quy trình.
Bài cuối: bốn khuôn mặt của lớp trung gian xếp thẳng hàng trong đúng một dòng return, và vì sao nổ StackOverflowError lại là điều may mắn.
Biết một lời kể được kể trong hoàn cảnh nào thì mới chỉ biết thêm về hoàn cảnh. Nghi ngờ cũng là một kết luận, và nó cũng cần bằng chứng.
Auto-configuration nấu sau và chỉ nấu nếu thiếu. Một bean lạ xuất hiện là độc giả duy nhất của spring.jackson.* lặng lẽ rút lui.
Mọi lời kể đều được kể từ một chỗ nào đó. Câu hỏi định hình cái gì được kể ra, và người ngồi nghe định hình cái gì được ghi lại.
Environment không giữ một file mà giữ một List các nguồn. Nguồn đầu tiên có key thì thắng, vòng for dừng, không ai phía sau được hỏi.
Năm người rời cùng một cuộc họp và làm ra năm sản phẩm khác nhau. Thứ quyết định thiệt hại là quãng đường trước khi có ai đặt chúng cạnh nhau.
Đổi sang field injection thì hết lỗi, bật allow-circular-references thì chạy thật. Nhưng lúc mở cái cờ mà Spring chủ động khoá lại, bạn đang mở cái gì?
Mơ hồ không phải một câu chưa viết xong. Nó là chỗ chứa một cuộc đàm phán chưa diễn ra, và làm rõ là gọi cuộc đàm phán ấy về hiện tại.
Bật đủ mọi cờ batch mà Hibernate vẫn insert từng dòng, vì chiến lược sinh id đã quyết định xong trước khi cờ của bạn kịp có ý nghĩa.
Mọi người hiểu giống nhau, biên bản ghi đúng, chữ ký đủ. Cái thiếu không phải sự thống nhất, mà là đường làm cho nó có hiệu lực.
Hibernate ném exception không phải để làm khó bạn mà để chặn một tích Descartes. Đổi List sang Set là tắt chuông chứ không phải chữa cháy.
Phép đối chiếu tìm ra mâu thuẫn, không tìm ra khoảng trống. Khi một phía không có khái niệm tương ứng thì chẳng còn gì để đặt cạnh nhau.
Một trăm linh một câu SELECT cho hai mươi đơn hàng, và không một dòng lỗi nào để bạn lần theo.
Một định nghĩa được sửa đúng quy trình ở một chỗ, trong khi nó đang sống ở bảy chỗ. Thay đổi thì có người làm, lan truyền thì không.
Java có hai field, DB chỉ có một cột. Chỉ owning side cầm bút ký, bên mappedBy chỉ là tấm gương, và cuốn sổ không bao giờ nhìn gương.
Không ai phản đối thì coi như đã thống nhất. Ba tuần sau, ba người mang ba nghĩa khác nhau của cùng một dòng biên bản tới buổi demo.
size() bằng 1, iterate thì nhìn thấy nó, mà contains() trả false. Chuyện danh tính của entity khi id được cấp sau lúc nó vào Set.
Tắt open-in-view làm app nổ mười bảy chỗ, vì cả mười bảy chỗ đó lâu nay sống nhờ một cái filter mở sổ hộ bạn mà không ai biết.
Vì sao một entity từng được quản lý lại thành tội đồ ở request sau, và merge thật ra làm gì với nó.
Có một cuốn sổ đang theo dõi bạn kể cả khi bạn không gọi save. Chuyện dirty checking và thời điểm flush của persistence context.
Một trang đặc tả đi qua ba vòng rà soát và bốn chữ ký. Không dòng nào sai khi đọc một mình, vì chỗ hỏng nằm ở quan hệ giữa các dòng.
readOnly không phải cái khoá, nó là lời nhắn - và chỉ những ai chịu nghe mới nghe. Bài này hé lộ cuốn sổ của Hibernate.
Mười bốn phiếu thay đổi, không phiếu nào do ai đổi ý. Câu trả lời không sai đi, nó hết hạn, và không có khoảnh khắc nào để chỉ vào.
@Transactional không nói mở transaction, nó nói method này cần chạy trong một transaction. Quyền quyết định nằm ở cái vỏ, và cái vỏ thò tay vào túi của thread.
Một tính từ trong bản cam kết không mô tả mức chất lượng. Nó hoãn việc xác định mức ấy lại, và việc bị hoãn thì chờ tới bàn nghiệm thu.
Cái vỏ có đó, lời gọi có đi qua nó, mà vẫn không rollback: bảng luật mặc định của Spring chỉ rollback với unchecked exception.
Một con số ai cũng trích và không ai truy được ai đã đo. Con số đi tiếp vào mọi tài liệu sau, còn thủ tục đẻ ra nó thì ở lại.
Cache cũng chỉ là một cái Map, và khoá mặc định của nó chỉ gồm tham số. Hai method khác nhau cùng cacheNames là cùng một ô.
Một cái nút bị từ chối vì không khả thi, trong khi bài toán thật giải được trong nửa ngày. Nhu cầu đã được dịch thành giải pháp trước khi bạn nghe thấy.
Thiếu một dòng bật tính năng thì annotation chỉ còn là lời khai không ai đọc. Và khi nó chạy được rồi, exception lại chết ở một thread khác.
Hệ thống làm đúng mười bốn bước trong văn bản, và tới cuối tuần đầu hồ sơ tồn gấp bốn. Cái đang giữ cho công việc chạy thì không nằm trong quy trình.
Một trải nghiệm thiết kế phân quyền: cùng một lỗi quay lại bốn lần, ở bốn chất liệu khác nhau, và mỗi lần nó im lặng theo một kiểu riêng.
Lời gọi từ trong chính class không đi ra ngoài cái vỏ, nên không ai kịp làm gì cả. Bài này giải thích vì sao đừng bao giờ tin this.
AI làm đầu ra phần mềm tăng nhanh, nhưng review, ngữ cảnh và trách nhiệm không tăng cùng tốc độ. Vậy chuyên môn hóa còn lại gì?
Hai báo cáo lệch nhau 8%, không ai tính sai. Một chữ đi qua ranh giới hai phòng ban thì chỉ có chữ đi được; cái neo nghĩa của nó thì ở lại.
Vật được trao không phải vật bạn tưởng: vì sao Spring Boot đúc proxy bằng CGLIB kể cả khi đã có interface, và vì sao method final làm @Transactional bốc hơi.
Một tài liệu đúng, đủ, nộp sớm nửa ngày - và không ai mở lại. Vì cái task bạn nhận là bản nén của một quyết định, và bản nén thì không báo lỗi.
Dãy quầy có người nhận-tất: vì sao thiếu một annotation thì Spring nhìn thấy request nhưng không ai đọc body, và không ai báo cho bạn biết.
Kẻ đến quá sớm thì không được phục vụ - chuyện cái List được đổ đầy sau lưng bạn, và vì sao @Transactional trong @PostConstruct cũng im lặng vì cùng một lý do.
Một cái tên viết sai, một cách làm nghề và nguyên tắc đứng sau những câu chuyện trên blog.