Я борюсь с реальным использованием JPA (Hibernate, EclipseLink и т.д.) в рабочем приложении Swing.
JPA кажется отличной идеей, но полагается на ленивую загрузку для повышения эффективности. Для ленивой загрузки требуется, чтобы диспетчер сущности существовал для жизни объекта beans и не контролировал, какой поток используется для загрузки или каким-либо образом выполнять загрузку в фоновом режиме, в то время как EDT работает с другими вещами. Доступ к объекту, который будет лениво загружен в EDT, заблокирует ваш пользовательский интерфейс приложения при доступе к базе данных, даже если вы не сможете установить загруженный курсор. Если приложение работает на Wi-Fi/3G или медленном Интернете, это может привести к сбою.
Чтобы избежать ленивой загрузки, задерживающей EDT, я должен работать с отдельными объектами. Тогда, если мне действительно нужна ценность ленивого свойства, все мои компоненты (даже те, которые должны были быть в состоянии не знать о базе данных) должны быть готовы обрабатывать ленивые исключения загрузки или использовать PersistenceUtil для проверки состояния свойства. Они должны отправлять объекты обратно в поток рабочих данных базы данных, которые должны быть объединены, и загружать свойства перед их отсоединением и возвратом.
Чтобы сделать это эффективным, мои компоненты должны заранее знать, какие свойства bean будут необходимы.
Итак, вы увидите все эти блестящие учебники, демонстрирующие, как взломать простое приложение CRUD на платформе NetBeans, Eclipse RCP, Swing App Framework и т.д., используя JPA, но на самом деле подходы продемонстрировали нарушение основных правил Swing (дон 't блокируют EDT) и полностью нежизнеспособны в реальном мире.
(Подробнее здесь: http://soapyfrogs.blogspot.com/2010/07/jpa-and-hibernateeclipselinkopenjpaetc.html)
Есть несколько взаимосвязанных вопросов с несколько полезными ответами, но ни один из них действительно не охватывает проблемы, связанные с резервированием/ленивым загрузкой/сущностью менеджера хранилища вместе.
Lazy/Eager стратегии загрузки в удаленных случаях (JPA)
Как другие решают это? Я лаю неправильное дерево, пытаясь использовать JPA в настольном приложении? Или есть очевидные решения, которые мне не хватает? Как вы избегаете блокировки EDT и поддержания активности вашего приложения при использовании JPA для прозрачного доступа к базе данных?