✅ Short Answer
You can reattach a detached object to a Hibernate session using either:
session.update(detachedEntity)
→ reattaches directly; expects no conflicting persistent instance with the same ID in the session.session.merge(detachedEntity)
→ copies the detached entity’s state into a new or existing persistent instance; always returns the managed instance.
🔎 Detailed Explanation
🔹 Using session.update()
- Reattaches the exact detached entity instance to the session.
- Hibernate starts tracking this object again → changes to it will be persisted on flush/commit.
- ⚠️ Important: if there’s already a persistent instance with the same identifier in the session,
update()
will throw aNonUniqueObjectException
. - Best used when you know the session is clean (no existing persistent instance with same ID).
🔹 Using session.merge()
- Safer alternative: creates or fetches a persistent instance, then copies the state of your detached object into it.
- Returns the managed persistent instance — you should use this object going forward.
- Avoids
NonUniqueObjectException
because it reconciles state with the session automatically. - Recommended when:
- You’re unsure about session state.
- Or working in high-concurrency environments.
🧑💻 Code Example
// Detached object from a previous session
MyEntity detachedEntity = ...;
// Open a new session
Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
// Option 1: Reattach directly
session.update(detachedEntity); // Now Hibernate tracks this instance again
// OR
// Option 2: Merge state into a managed instance
MyEntity managedEntity = (MyEntity) session.merge(detachedEntity); // Use managedEntity for further operations
tx.commit();
session.close();
📊 Quick Comparison Table
Method | Behavior | Returns | Notes |
---|---|---|---|
update() | Reattaches the same instance | void | Fails if persistent instance with same ID exists |
merge() | Copies state into a new/existing instance | Managed object | Handles conflicts safely |
📌 Key Takeaways
✅ Use update()
if you know the session is clear of the same entity ID.
✅ Use merge()
to safely reattach detached objects in any session state.
✅ Always use the returned object from merge()
— it’s the one Hibernate tracks after merging.