Я построил 2-уровневый клиент Java Swing с использованием Hibernate и Swing, и я никогда не буду делать это снова.Если бы мне пришлось перестраивать его сегодня, я бы использовал необработанные JDBC-запросы или, может быть, очень тонкую структуру отображения ORM, такую как iBatis.
Причина, по которой Hibernate (и я предполагаю другие реализации JPA, хотя мой опыт только сHibernate) настолько отличается в среде рабочего стола, что 1), поскольку объекты, как правило, имеют гораздо более длительный срок службы на рабочем столе, и 2) очень трудно понять, когда к объекту будет осуществлен доступ, поэтому правильная обработка транзакций для отложенной загрузки проблематична.
Парадигма веб-запроса-ответа принципиально транзакционна, поэтому там очень легко разграничить ваши транзакции.На рабочем столе каждое нажатие клавиши, даже просто MouseMovedEvent, потенциально может вызвать запрос к базе данных или ленивую загрузку, поэтому намного сложнее узнать, когда инициировать и фиксировать транзакции.
Обработка ошибок и обновление объектов - большая проблема, поскольку объекты, как правило, имеют гораздо более длительный срок службы (часто на время запуска приложения).В Hibernate исключения не подлежат восстановлению, что означает, что вы должны перезагрузить все из БД.Это хорошо в Интернете, но определенно не очень хорошо, когда у вас есть тысячи объектов, встроенных в различные модели в вашем графическом интерфейсе.