When session.flush() is called, hibernate needs to scan all entities currently in session to see which ones are dirty. In some cases, this can become expensive due to the number of entities, especially since every field of each entity must be inspected. Unfortunately, while hibernate will avoid persisting changes made to an entity annotated with @Immutable, it makes the decision to do so only after invoking the getValues() method on DefaultFlushEntityEventListener (even though this method is invoked after making the call to requiresDirtyCheck(entity)).
I'm attaching a test case which demonstrates this behavior.
This bug report does not indicate that the reported issue affects version 5.x. Versions prior to 5.x are no longer maintained. It would be a great help to the Hibernate team and community for someone to verify that the reported issue still affects version 5.x. If so, please add the 5.x version that you verified with to the list of affected-versions and attach the (preferably SSCCE) test case you used to do the verification to the report; from there the issues will be looked at during our triage meetings.
For details, see http://in.relation.to/2015/10/27/great-jira-cleanup-2015/
As part of verifying that this issue affects 5.0, please just set the "Affects version". Leave the "verify-affects-5.0" label and leave the issue in "Awaiting Response" status; these are critical for us to be able to track these verifications and triage them. Thanks.