Возможно ли иметь удаленно управляемые объекты? - PullRequest
1 голос
/ 13 августа 2011

Я не очень знаком с JPA, но у меня есть такой сценарий: я хотел бы использовать одни и те же классы (читай «код») как на сервере, так и на клиенте (Java SE) по причинам KISS / DRY. Мне кажется, что одним из возможных способов сделать это было бы иметь (специальный?) EntityManager на клиенте, который передает запросы на сущности на сервер и в конце передает все сущности обратно на сервер для «пакетного сохранения» действие ", где классы могут (повторно) проверять свои данные, применять некоторые транзакционные операции (обновление и прочее) и быть хорошо сохраненными реализацией JPA.

Вопрос: возможно ли это? Как? (есть ли уже решение для этого? Это просто, в некотором роде, решить это с помощью «некоторого» кода?)


Редактировать: Хорошо, позвольте мне прояснить пару вещей для всех. Я имею в виду внутреннюю инфраструктуру приложений, которая использует так называемые универсальные службы персистентности; т.е. сервисы для выполнения действий CRUD (один сервис на действие для любой таблицы) в пределах одной транзакции, но поддерживаются классами (внутри сервиса), которые перехватывают эти действия и предлагают проверку и (часто) сложные бизнес-правила (с обновлениями других таблиц, так далее.). Это было реализовано с более старыми продуктами Microsoft. Сейчас происходит переход на .NET, где недавно появились аналогично работающие, но более продвинутые фреймворки, такие как DevForce и CSLA. В частности, DevForce предлагает то, что я хотел бы также сделать на Java (см. Параграфы «Выполнение на клиенте» на этой странице , а затем посетите эту страницу для лучшего обзора).

Мой более старый вопрос на эту общую тему: Java "эквивалентен" CSLA

Ответы [ 2 ]

1 голос
/ 20 февраля 2013

Я пытался делать подобные вещи раньше и, возможно, просто немного рассказать о своих выводах (в то время я использовал Hibernate + XFire для WS)

Я верю, что вы думаете, работает теоретически. Что вам нужно сделать, это просто сериализовать ваши управляемые объекты и отправить его клиенту. Клиент десериализует и обновляет объект (конечно, на стороне клиента, это просто обычный POJO, а не управляемые объекты) и отправляет его обратно на сервер. На этом этапе объект, полученный сервером, является просто отдельным объектом. Вы можете присоединиться к сеансу (JPA / Hibernate выполнит эту оптимистическую проверку параллелизма за вас) и сохранит вашу настойчивость.

Однако он работает нормально только для POJO. Одна из основных проблем заключается в том, что в JPA (или, в основном, во всей структуре ORM) у вас есть отношения между различными объектами. Например, Заказ будет иметь отношения с Продуктом и Учетной записью, Учетная запись будет иметь отношение к Клиенту, у Клиента будет список Адресов .... и т. Д. Это в основном хорошо, если вы манипулируете на стороне сервера из-за ленивых выборок, отношений фактически не извлекаются, пока вы не получите к нему доступ. Однако, когда вы выполняете сериализацию, это становится трудной проблемой: большинство решений для сериализации, таких как JAXB, просто рекурсивно перемещаются по всем свойствам. В результате вы ожидаете отправки только объекта Order на клиентскую сторону, но, наконец, вы отправляете огромную часть данных клиенту. Простое указание сериализатору не сериализовать некоторые свойства не сработает, поскольку, когда объект отсылается обратно и повторно подключается отсоединенный объект к сеансу, JPA / Hibernate не имеют возможности узнать, что если вы просто игнорируете отношения или вы на самом деле снимая отношения. Конечно, есть еще некоторые приемы, которые вы можете сделать, но все это делает такой подход болезненным, и он уже не элегантен.

0 голосов
/ 13 августа 2011

Ваша идея умна.

Но невозможно сделать то, что вы предлагаете. Почему не так? Что ж, чтобы ответить на это, мы должны сначала понять, «что такое управляемый объект».

Управляемый объект - это не что иное, как «кэшированный» экземпляр. Экземпляр, который находится внутри менеджера сущностей. Если вы отправляете этот экземпляр по сети на другой компьютер, вы сериализуете его, таким образом копируя его: создавая другой экземпляр на удаленном сервере, который, конечно, не управляется (поскольку менеджер сущностей не даже знаю о его существовании).

С другой стороны, может существовать что-то «достаточно умное», чтобы имитировать менеджер сущностей и прозрачно «управлять» этой скопированной сущностью, но это выходит за пределы спецификации JPA, и вам придется реализовать это самостоятельно (что кажется легким). Я не думаю, что для этого есть что-то надежное.

Ваше решение заключается в явном сохранении, обновлении и т. Д. С вашего клиента (с помощью методов, предоставляемых с сервера).

...