What is the difference between the two if any?
Should one or both be used on an entity?
What is the difference between the two if any?
Should one or both be used on an entity?
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.