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.