Я разрабатывал веб-приложение JBoss Seam поверх Modeshape-in-JBoss. Сначала я тоже использовал подход DTO, но отказался от этого. Вместо этого было проще сохранить сеанс JCR открытым, либо для сеанса разговора, либо для всего сеанса сервлета.
Если вы не используете Seam, вы можете использовать аналогичный подход для области запросов сервлета вместо разговора.
Я все еще на начальном этапе разработки, а не производства, и поэтому не могу утверждать, что это "лучшая практика". Однако до сих пор оба подхода кажутся жизнеспособными, и у меня не было с ними проблем.
Для начала у меня есть компонент Менеджер шва в области приложения (с помощью @Unwrap), который создает JCR-репозиторий (с помощью ServiceLoader), который используется для login ().
Тогда для сессии:
Сеанс JCR в области разговора: я создал компонент менеджера шва в области преобразования, который помещает сеанс JCR в область диалога. Компонент Seam выполняет repository.login () при создании и session.logout (), когда компонент уничтожается в конце диалога. По сути, это тот же подход, что и JPA EntityManager в области разговора, который обычно используется в приложении Seam.
Сеанс JCR в области сеанса: То же, что и выше, за исключением области сеанса шва (сервлета). Это, очевидно, приводит к тому, что сеанс JCR будет открыт в течение гораздо более длительного времени (потенциально часов). Я не знаю, есть ли с этим питфалы, но пока это кажется более естественным подходом.
В обоих случаях код приложения будет выполнять session.save () после выполнения любых обновлений.
Тем не менее, я согласен с тем, что какой-нибудь бессессионный API утилиты DTO был бы очень полезен. Это становится очевидным, если вы предоставляете клиенту функциональность JCR с помощью EJB. Поскольку EJB может передавать только сериализуемые объекты данных, узлы JCR, а также свойства и значения не могут передаваться напрямую. Я столкнулся с этой ситуацией при разработке приложения Eclipse RCP (дополнения к веб-приложению), которому необходим доступ к тому же репозиторию Modeshape, работающему в JBoss. В итоге я сделал нечто очень похожее на то, что рекомендовал Рэндалл: разработал простые сериализуемые объекты NodeDTO и PropertyDTO, а затем получил несколько служебных методов для их создания из узлов и свойств JCR. Если бы Modeshape или JCR могли бы предоставить эти утилиты для помощи клиент-серверному доступу к хранилищу, это было бы здорово!