Hibernate merge: lấy ID của entity đúng cách

Một lỗi nhỏ mà mình từng mất kha khá thời gian debug.

Vấn đề

Khi dùng EntityManager.merge() để lưu một entity mới, nhiều người có thói quen gọi:

1
2
entityManager.merge(entity);
Long id = entity.getId(); // null hoặc giá trị cũ!

Và… id không có giá trị như mong đợi.

Nguyên nhân

merge() không update object bạn truyền vào. Nó copy state từ object đó sang một managed instance mới rồi trả về instance đó. Object gốc vẫn ở trạng thái detached, không được Hibernate gán ID.

Cách đúng

Dùng object trả về từ merge():

1
2
MyEntity managed = entityManager.merge(entity);
Long id = managed.getId();

Đơn giản vậy thôi. Khác với persist() — cái đó modify trực tiếp object truyền vào nên không có vấn đề này.

Made by miti99 with ❤️
Built with Hugo
Theme Stack thiết kế bởi Jimmy