From 8cc7be722e8222daf0f6041c3eefd6e34812e69f Mon Sep 17 00:00:00 2001 From: tiennm99 Date: Sat, 11 Apr 2026 10:52:16 +0700 Subject: [PATCH] feat(content): add post about getting entity ID after Hibernate merge --- content/post/2026/04/10/index.md | 34 ++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 content/post/2026/04/10/index.md diff --git a/content/post/2026/04/10/index.md b/content/post/2026/04/10/index.md new file mode 100644 index 0000000..0b725da --- /dev/null +++ b/content/post/2026/04/10/index.md @@ -0,0 +1,34 @@ +--- +title: "Hibernate merge: lấy ID của entity đúng cách" +date: 2026-04-10 +tags: ["AI-Assisted", "Hibernate", "JPA", "Java"] +categories: ["Sharing"] +--- + +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: + +```java +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()`: + +```java +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.