Отметить поля, отличные от db, @Transient против степени JPA Entity? - PullRequest
2 голосов
/ 14 июля 2020

У нас есть JPA Entity. Как только объект сохраняется в db, некоторые поля этого объекта (столбцы db) вместе с некоторыми другими данными (которые не являются частью этого объекта) должны быть сохранены в хранилище объектов JCR.

Следует ли мне создайте одну единую сущность (JPA) для DB и JCR и просто добавьте поля JCR в Entity и отметьте их @Transient?

или

Должен ли я использовать наследование или композицию (используя JPA Entity) и создать новый объект JCR c? В принципе, должны ли объекты JPA строго использоваться для БД или @Transient в этом случае является злоупотреблением?

Ответы [ 2 ]

5 голосов
/ 16 июля 2020

должны ли объекты JPA использоваться строго для БД или @Transient в этом случае является злоупотреблением?

Не злоупотребление, но вам нужно будет очень осторожно подходить к операциям с JPA. Один merge или refresh слишком много, и ваше временное значение поля будет потеряно.

Лично я бы создал еще один уровень абстракции над JPA и JCR, который бы управлял вашим объектом домена как POJO, своего рода DomainObjectRepository, который будет обрабатывать операции CRUD, взаимодействуя с как JPA и JCR, и инкапсулируя отображение из / в обе технологии хранения (с уровнем сопоставления для каждой технологии, имеющей выделенный набор объектов - сущности JPA, JCR узлов).

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

На мой взгляд, лучше создать два класса, один для сущности JPA, а другой для JCR.

Разделив обе области, вы лучше понимаете и контролируете, что нужно делать в чтобы обрабатывать или сохранять все виды объектов, и, сосредоточившись на одной задаче, эти два класса и связанные с ними logi c более надежны и менее подвержены ошибкам.

Эти два класса могут определять несколько общих полей .

Вы можете использовать такие инструменты, как MapStruct или Dozer для сопоставления полей между экземплярами двух классов.

Более того, оба класса могут реализовывать общий интерфейс с общими полями, которые они разделяют, например, чтобы вы могли повторно использовать его в своей logi c (для целей аудита, реализации шаблона Builder и т. д.), если это необходимо.

...