26

What is the difference between the two if any?

Should one or both be used on an entity?

Vlad Mihalcea
  • 142,745
  • 71
  • 566
  • 911
non sequitor
  • 18,296
  • 9
  • 45
  • 64

2 Answers2

26

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

naXa stands with Ukraine
  • 35,493
  • 19
  • 190
  • 259
ChssPly76
  • 99,456
  • 24
  • 206
  • 195
  • Yup I have a print out of the same doc but it does not distinguish btw the 2, just states what they are and what they can do, in this case they both do the same thing for entity(with `@immutable` applying to collections as well). – non sequitor Oct 19 '09 at 21:19
  • It's not well documented, no. `EntityBinder` source comments describe the above mentioned priority. – ChssPly76 Oct 19 '09 at 21:22
23

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.

Vlad Mihalcea
  • 142,745
  • 71
  • 566
  • 911