@Immutable vs @Entity (mutable=false) в спящем режиме

в чем разница между этими двумя, если таковые имеются? Должен ли 1 или оба использоваться на объекте?

2 ответов


на сущности практически нет никакой разницы. @Immutable получает приоритет (то есть, если у вас есть сущность, которая помечается как @Immutable и @Entity(mutable = "true") он будет рассматриваться как неизменяемый).

@Immutable также может использоваться в коллекциях с почти такой же семантикой. Подробности здесь


на org.hibernate.annotations.Entity аннотация устарела и будет удалена в будущем выпуске Hibernate.

следовательно, вы всегда должны использовать @Immutabale аннотация, если у вас есть объекты, которые никогда не должны быть изменены Hibernate.

как я объяснил в в этой статье, the @Immutable аннотация сообщает Hibernate загружать объекты в режиме только для чтения, поэтому изменения сущности не могут быть отслежены грязные проверка механизм.

на @Immutable субъекты все еще могут быть обновлены через JPQL или критерии API массовое обновление запросов.

чтобы убедиться @Immutabale сущности никогда не изменяются для запросов массового обновления, начиная с Hibernate 5.2.17 и далее, вы можете установить следующее свойство конфигурации:

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

С этим свойством на месте запрос массового обновления в конечном итоге вызовет исключение, и обновление сущности будет предотвращено.