What is the difference between @Immutable and @Entity(mutable=false) when using Hibernate

For entity there's practically no difference. @Immutable gets priority (that is if you have entity that's annotated both as @Immutable and @Entity(mutable = "true") it is going to be treated as immutable).

@Immutable can also be used on collections with pretty much the same semantics. Details are here


The org.hibernate.annotations.Entity annotation is deprecated and will be removed in a future release of Hibernate.

Hence, you should always use the @Immutabale annotation if you have entities that should never be modified by Hibernate.

The @Immutable annotation tells Hibernate to load entities in read-only mode, hence entity modifications cannot be tracked by the dirty checking mechanism.

However, the @Immutable entities can still be updated via JPQL or Criteria API bulk update queries.

To make sure @Immutabale entities are never modified for bulk update queries, from Hibernate 5.2.17 onwards, you can set the following configuration property:

<property
    name="hibernate.query.immutable_entity_update_query_handling_mode"
    value="exception"
/>

With this property in place, a bulk update query will end up throwing an exception and the entity update will be prevented.