Welcome to MikeDaDev's Blog – notes on Java, backend & system design.

Explore
MikeDaDev's Blog

#jpa

Things I've written about #jpa
  • hibernate ORM

    Hibernate ORM bên trong chạy thế nào: 4 trạng thái vòng đời của Entity (Transient, Persistent, Detached, Removed), Dirty Checking tự động qua Loaded Snapshots, First-Level vs Second-Level Cache, và cách tiết kiệm bộ nhớ với @Transactional(readOnly = true).

  • Criteria API trong Hibernate

    Viết dynamic query trong Java enterprise cho đàng hoàng: Hibernate 6 SQM chạy bên dưới ra sao, JPA Metamodel Generator, Spring Data Specification, cái bẫy fetch join với N+1 và phân trang, kèm bảng so sánh Criteria API, Specification, QueryDSL và jOOQ.

  • @ManyToMany trong JPA

    @ManyToMany trong JPA/Hibernate hoạt động ra sao: vì sao Hibernate xóa sạch bảng nối rồi insert lại (Write Amplification), vì sao không thêm được thuộc tính phụ (metadata), và cách làm dùng được trên production: tách thành hai @OneToMany qua Explicit Join Entity với @EmbeddedId và @MapsId.

  • @OneToMany & @ManyToOne trong JPA

    Mấy cái bẫy hay gặp với @OneToMany và @ManyToOne trong JPA/Hibernate: EAGER ngầm, N+1 query và cách xử lý bằng EntityGraph hay BatchSize, lỗi MultipleBagFetchException do Cartesian Product, và StackOverflowError vì lỡ dùng Lombok @Data.

  • @OneToOne trong JPA

    Đào sâu quan hệ @OneToOne trong Hibernate & JPA: vì sao FetchType.LAZY "tịt" ở Non-Owning side và kéo theo N+1, cách dùng chung khoá chính với @MapsId, Bytecode Enhancement, và vì sao gắn Lombok @Data lên Entity là anti-pattern.