It depends on your needs — but in modern, portable code, persist()
is usually the better choice. Here’s why:
🔹 Why prefer persist()
✅ Standardized (JPA) — persist()
is part of the JPA specification, so it’s portable across any JPA implementation (Hibernate, EclipseLink, etc.).
✅ Safer behavior — persist()
requires an active transaction, ensuring you don’t accidentally “save” something without committing (which could silently fail with save()
).
✅ Consistent semantics — guarantees the entity will become managed/persistent if the transaction commits.
🔹 When might you use save()
✅ If you specifically need the generated ID immediately, because save()
returns it as a Serializable
.
✅ If you’re writing Hibernate-specific code, and you don’t care about JPA portability.
✅ When you don’t mind that save()
works outside transactions (but be careful: this can lead to inconsistent behavior).
🔹 Key differences summarized:
Feature | save() | persist() |
---|---|---|
Returns ID? | Yes (Serializable) | No (void) |
Requires transaction? | No (but recommended) | Yes (throws exception if missing) |
JPA-compliant? | No (Hibernate-specific) | Yes (standard JPA) |
Portability | Hibernate-only | Works with any JPA provider |
✅ Best practice:
Use persist()
for new projects or whenever you want portable, JPA-compliant code.
Use save()
only if you specifically need the returned ID and you’re OK with Hibernate-specific APIs.