Сущности гибернации в одной таблице базы данных для чтения и записи - PullRequest
1 голос
/ 12 июля 2020

В нашем приложении Spring Boot у нас есть две сущности для одной и той же таблицы.

@Entity
@Table(name = "TBL_DATA")
@Immutable
public class DataReadEntity {

   // getters only
   ...
   // specific @OneToMany and @OneToOne relations only present in this entity
}

@Entity
@Table(name = "TBL_DATA")
@DynamicUpdate
public class DataWriteEntity {

  // getters and setters
}

DataReadEntity используется только для поиска данных и всегда используется в отдельном API. DataWriteEntity используется для выборки всего объекта и его обновления.

Проблема в том, что спящий режим по-прежнему показывает предупреждение при обновлении DataWriteEntity с помощью API критериев JPA SessionImpl - HHH000487: The query: [here goes update query] attempts to update an immutable entity: [TBL_DATA] и обновление выполнено успешно.

Итак, вопрос есть - следует ли нам удалить аннотацию @Immutable или просто проигнорировать это предупреждение, потому что оно работает должным образом? Считается, что DataReadEntity никогда не будет использоваться для операций обновления (сеттеры даже не реализованы).

Приложение Spring Boot работает с конфигурацией по умолчанию - spring.jpa.open-in-view is enabled by default.

1 Ответ

0 голосов
/ 12 июля 2020

Базовый объект базы данных является изменяемым, но вам нужны два представления объекта для одной и той же таблицы. Но hibernate знает, какую таблицу он обновляет, и сбит с толку, поскольку в одном месте он говорит, что он неизменен.

Я не буду игнорировать предупреждения из-за этого в do c. Возможно, он уже игнорирует обновления DataWriteEntity в автоматическом режиме, и даже если это не так, это может произойти, когда у вас есть более новая версия.

Неизменяемый объект может не обновляться приложением. Обновления неизменяемой сущности игнорируются, но исключение не создается. @Immutable должен использоваться только для root сущностей.

  • Почему бы вам не создать view для TBL_DATA в базе данных и не передать его DataReadEntity в качестве имени таблицы и оставить @Immutable тоже? Итак, спящий режим сбит с толку, и вы тоже не получите предупреждений, а также вам не нужно беспокоиться о неожиданном поведении при изменении версии?

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

Ссылка

https://docs.jboss.org/hibernate/orm/5.2/javadocs/org/hibernate/annotations/Immutable.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...