← Tất cả bài viết

Lombok @Data có nên dùng với JPA Entity không?

22/07/2026

Lombok giảm boilerplate rất tốt, và @Data là annotation tiện nhất — nó gói getter, setter, toString, equals, hashCode. Nhưng dùng @Data trên JPA Entity lại là một anti-pattern.

Vấn đề với equals/hashCode

@Data sinh equals/hashCode dựa trên tất cả field. Với Entity, điều này gây rắc rối: hashCode đổi khi field thay đổi (nguy hiểm nếu Entity nằm trong HashSet), và so sánh dựa trên field thay vì định danh (id) là sai bản chất.

Vấn đề với toString

toString mặc định in mọi field, bao gồm cả quan hệ lazy — chỉ cần log một Entity là kích hoạt tải quan hệ và có thể gây LazyInitializationException hoặc vòng lặp vô tận giữa hai Entity liên kết nhau.

Nên dùng gì thay thế

  • @Getter/@Setter thay cho @Data
  • @ToString có loại trừ quan hệ: @ToString(exclude = "orders")
  • Tự viết equals/hashCode chỉ dựa trên id (hoặc business key), hoặc dùng @EqualsAndHashCode(onlyExplicitlyIncluded = true)
@Entity
@Getter @Setter
@ToString(exclude = "orders")
class Customer {
    @Id Long id;
    @OneToMany(mappedBy = "customer") List<Order> orders;
}

👉 Dùng thử công cụ liên quan trên dev-hub: JSON Formatter — chạy hoàn toàn trong trình duyệt, không gửi dữ liệu lên server.