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

В чем разница между ними, если они есть?

Должен ли один или оба использоваться на предприятии?

Ответ 1

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

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

Ответ 2

Аннотации org.hibernate.annotations.Entity устарели и будут удалены в будущей версии Hibernate.

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

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

Тем не менее, @Immutable сущности все еще могут быть обновлены с помощью запросов JPQL или Criteria API для массового обновления.

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

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

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