JPA: чтение из таблицы обновления представления - PullRequest
0 голосов
/ 28 декабря 2011

Можно ли заставить JPA читать сущность из представления и затем обновлять таблицу.

В качестве примера:

Sample Schema

У нас естьобъект, который читает из SuppliersInvoice_VW.Это представление и связанная с ним сущность будут содержать InvoiceNo, SupplierCode, SupplierName и значение.

Пользователь видит что-то подобное:

Номер счета: 1234
Supplier: Joes 'Hardware
Значение: 50

Что заставляет его понять, что значение должно быть 509, поэтому он обновляет соответственно

Счет-фактура: 1234
Поставщик: Joes' Hardware
Значение: 509

Затем запускается обновление нашей сущности SuppliersInvoice.

Я сопоставил @Table("SuppliersInvoice_vw"), что означает, что он читает данные из SuppliersInvoice_vw, но это также означает, чтообновить через это представление.

Есть ли способ сделать JPA считанным из представления ( SuppliersInvoice_vw ) и обновить таблицу ( SuppliersInvoice )?

Альтернативная стратегия - просто обновить представление, однако мне всегда советовали не делать этого.Есть ли в этом совете основание для повышения производительности, или это больше похоже на «знать, что может пойти не так при обновлении через представления».

Ответы [ 2 ]

1 голос
/ 28 декабря 2011

Я не думаю, что с JPA можно прозрачно делать именно то, что вы хотите.

Спецификация JPA допускает только один @Table на @Entity.Вероятно, самый простой (и наиболее переносимый) способ справиться с этим - это иметь два отдельных класса @Entity, один для представления и один для таблицы, со схожими свойствами и выбирать, какой из них использовать в зависимости от того,перечитываешь или пишешь.

Если свойства выстраиваются в ряд, вы можете использовать общие BeanUtils.copyProperties для инициализации доступного для записи объекта из представления 1.

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

1 голос
/ 28 декабря 2011

До этого я сталкивался с той же проблемой с представлениями / таблицами и сущностями. Я не знаю, какую базу данных вы используете, но в моем случае я использовал PostgreSQL 9.x. Чтобы решить эту проблему, я создал триггеры в своей базе данных, которые позволили бы мне ВСТАВИТЬ или ОБНОВИТЬ в моем представлении, а затем через триггеры соответствующим образом обновить базовые таблицы за представлением. Таким образом, вы все равно можете обновить объект сущности SuppliersInvoice и сохранить изменения, используя JPA, как обычно, но внутренняя база данных обновит реальные таблицы соответствующим образом на основе предоставленных вами обновлений.

Вот ссылка на INSERT / UPDATE / DELETE правила документацию из PostgreSQL 9.1, чтобы вы могли убедиться в этом сами.

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