Это хороший вопрос.
Предоставляя классы сущностей JPA остальной системе, вы открываете механизм персистентности и объект для отображения в БД. Вы теряете контроль над тем, как эти объекты CRUDded и управляются. Нарушая инкапсуляцию постоянства, изменение может оказывать волновое воздействие на остальную часть системы.
Будущие изменения в устойчивости системы могут быть невозможными, неудобными, ограниченными и / или рискованными. Пример: вам может потребоваться оптимизировать производительность и / или масштабируемость. Это может потребовать кеширования, изменений схемы БД, не использования СУБД, нескольких баз данных. Инкапсуляция также помогает уменьшить миграцию в будущие схемы БД.
Итак, компромисс:
- управление и поддержание уровня персистентности приложения поверх JPA, который инкапсулирует персистентность. то есть интерфейс. ИЛИ
- решите использовать JPA по всем направлениям в вашей архитектуре. Примите тот факт, что будущие изменения могут иметь общесистемные последствия.
Первый вариант может быть необходим, если частые изменения в масштабе всей системы неприемлемы - например, Третьи лица получают доступ к вашим данным. Или, возможно, вы выбрали трехуровневую архитектуру: GUI, бизнес-логика, постоянство.
Второй вариант подходит, если у вас есть процесс гибкой разработки, вы контролируете всю систему и принимаете тот факт, что в будущем могут потребоваться общесистемные изменения.