save() returns the generated identifier, persist() returns nothing, and saveOrUpdate() either saves a new object or updates an existing one.
save() saves the entity and returns its identifier. With an identity column, where the database generates the id, it runs the INSERT at once, even outside a transaction.
persist() is the Java Persistence API (JPA) method. It does not promise to assign the identifier at once, and it never runs the INSERT outside a transaction.
saveOrUpdate() checks the identifier, then saves a new entity or updates a detached one, an object whose session has closed.
// save() - returns ID
Long id = (Long) session.save(user);
// persist() - no return value
session.persist(user);
// saveOrUpdate() - smart save/update
session.saveOrUpdate(user);
Hibernate 7 removed save() and saveOrUpdate(). Use persist() for a new object and merge() for a detached one.
Rewriting in plainer words…
This answer doesn't lend itself to a diagram - it reads best . No credits were charged.