2015-05-27 5 views
0

Background-> У меня есть таблица сотрудников, которая представлена ​​многими объектами JPA в коде - EmployeeBasic и EmployeeDetails. Каждый из этих сущностей JPA имеет разные уровни детализации - основной объект имеет только имя сотрудника и идентификатор. Детальный объект имеет другие данные, такие как startdate, department и т. Д., В дополнение к имени и идентификатору.Обновление нескольких версий объекта JPA

Теперь подходит к проблеме -> У меня есть место в коде, который обновляет имя объекта с использованием объекта EmployeeBasic. В другой части кода используется объект EmployeeDetails. Но он не синхронизируется с обновленным именем автоматически. Есть ли способ обработать его в JPA, чтобы обе версии объекта синхронизировались?

ответ

0

Нет, такого поведения в JPA/Hibernate нет.

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

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

0

JPA позволяет кэшировать на разных уровнях, так что, даже если все процессы используют один и тот же объект Employee, потребуется тщательный дизайн, чтобы убедиться, что все процессы были синхронизированы с обновленным именем автоматически. Причина этого заключается в том, что EntityManager предназначен для обработки транзакций; чтение из него даст вам управляемый экземпляр объектов, которые затем изолированы от изменений, внесенных в другие EntityManager. Данные в базе данных являются лишь проблемой, когда приходит время писать. Это позволяет вам работать с ними, не беспокоясь о переходе данных из-под вас и управлять любыми проблемами самостоятельно (рекомендуется оптимизировать оптимизацию).

Ваш случай также осложняется тем фактом, что хотя EmployeeBasic и EmployeeDetails могут повторно использовать одну и ту же таблицу базы данных, JPA также позволяет использовать общий кеш. Поэтому внесение изменений в EmployeeBasic будет обновлять его кеш и общий кэш, но кеш EmployeeDetails будет устаревшим. Это похоже на то, что несколько единиц непрерывности получают доступ к тем же таблицам.

Способ, которым это выполняется, заключается в том, что приложение отвечает и может контролировать, когда они хотят обновить свои объекты, уровень кэширования и аннулирование кешей. JPA позволяет отключить общий кэш (используя изолированные кеши), чтобы при чтении из нового EntityManager он всегда переходил к базе данных для данных и видел изменения в любом из объектов. Он также обновляет api (и большинство провайдеров имеют подсказки обновления), которые позволяют принудительно запрашивать базу данных, когда вы знаете, что что-то может потребоваться проверить, хотя следует позаботиться о ее устранении.

EclipseLink (я не знаком с Hibernate) имеет параметры аннулирования кеша и координацию кеша, которые могут использоваться вместе с событиями, чтобы вы могли использовать общие кеши; вы можете использовать события обновления, чтобы вызвать все кэши Employee **, связанные с обновленным, чтобы стать недействительными.

Смежные вопросы