Объекты JPA в кластере серверов - PullRequest
0 голосов
/ 20 февраля 2019

Мы начинаем разработку нового веб-приложения, используя JSF (MyFaces на TomEE) и JPA (Eclipselink).Чтобы ускорить разработку, мы НЕ планируем разрабатывать слой DTO, в основном потому, что он нам не нужен.Следуя советам экспертов JSF и Java EE, таким как Bauke Scholtz Как использовать DTO в JSF + Spring + Hibernate и Adam Bien Насколько злые объекты Data Transfer , мы будем использовать объекты JPA напрямуюв уровне представления.Тем не менее, это приложение должно работать в кластере серверов с липким сеансом.Когда сервер отключается для обслуживания или исключается из кластера для развертывания приложений, пользовательские сеансы этого сервера должны обслуживаться другими серверами без потери сеанса.Проблема, с которой мы сталкиваемся, заключается в том, что сущности JPA, которые сохраняются в сеансе (например, в компоненте @ViewScoped), не «полностью» реплицируются на других серверах.Фактически атрибуты коллекции сущностей JPA, которые используют отложенную загрузку, не могут использоваться на других серверах.При доступе к коллекции attibute (@OneToMany, использующей отложенную загрузку) на сервере, имеющем реплику сеанса, возникает исключение

org.eclipse.persistence.exceptions.ValidationException 
Exception Description: An attempt was made to traverse a relationship 
using indirection that had a null Session.  
This often occurs when an entity with an uninstantiated LAZY 
relationship is serialized and that relationship is traversed 
after serialization. 
To avoid this issue, instantiate the LAZY relationship 
prior to serialization

.

Я знаю, что EntityManager не сериализуем и сущности JPA полностью отключаются при сериализации во время миграции сеанса, см. Блог Струберга .Таким образом, вопрос в том, существует ли способ поддерживать сущности JPA согласованным образом в кластере серверов, не используя загрузку EAGER?

1 Ответ

0 голосов
/ 20 февраля 2019

Вы можете настроить кэш только для некоторых сущностей (те, которые меняются очень редко)

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd"
             version="2.1">

    <persistence-unit name="name" transaction-type="JTA">
        <!-- disable shared cache because we are in multi instance environment -->
        <shared-cache-mode>ENABLE_SELECTIVE</shared-cache-mode>
        <validation-mode>CALLBACK</validation-mode>

        <properties> 
            <!-- disable object caching because we are in multi instance environment -->
            <property name="eclipselink.cache.shared.default" value="true"/>
            <property name="javax.persistence.sharedCache.mode" value="ENABLE_SELECTIVE"/>
            </properties>
    </persistence-unit>

</persistence>

Здесь вы также можете увидеть, как это сделать в общей среде https://wiki.eclipse.org/EclipseLink/UserGuide/JPA/Basic_JPA_Development/Caching/Query_Cache

...