Ленивая загрузка с RequestFactory - PullRequest
0 голосов
/ 22 марта 2012

Я использую GWT 2.4 с Hibernate и RequestFactory, и у меня есть подобные запросы

contextA.getEntityById(id).with("elements").fire(new Receiver<EntityBaseProxy>() {
        @Override
        public void onSuccess(EntityBaseProxy entity) {
            System.out.println(entity.getElements().size());
  }
});

Я немного растерялся, когда elements, являющиеся дочерними элементами сущности, лениво выбираются, я получаю NullPointer в System.out.println(entity.getElements().size());

Ответы [ 3 ]

1 голос
/ 18 апреля 2012

Я не использую hibernate, но я нашел элегантное решение, которое работает с LAZY-загрузкой и RequestFactory.Он использует ServletFilter и переносит запросы к моей реализации сервера DAO.Реализация создает ThreadLocal EntityManager, который можно использовать для всего запроса.Обратите внимание, что вы все еще должны заключить слияния в транзакции.Я смог удалить все мои методы try {} finally {em.close ()} и больше не загружать EAGER.Использование методов with () в вашем requestContext позволяет получателям на стороне сервера загружать присоединенные сущности, поэтому вы можете влиять на загрузку графа объектов из реализации на стороне клиента.

Вот мой фильтр

public class PersistenceFilter implements Filter {
    protected static final Logger logger = Logger.getLogger(PersistenceFilter.class.getName());

    private static final EntityManagerFactory factory = PersistenceManagerFactory.getEntityManagerFactory();

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void destroy() {
        PersistenceManager.setEntityManager(null);
        factory.close();
    }

    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
        EntityManager em = factory.createEntityManager();

        PersistenceManager.setEntityManager(em);

        try {
            chain.doFilter(req, res);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (em.getTransaction().isActive()) {
                em.close();    
            }
        }
    }
}

<!-- Then simply add this to your web.xml -->
<filter-mapping>
  <filter-name>PersistenceFilter</filter-name>
  <url-pattern>/dao</url-pattern>
</filter-mapping>
1 голос
/ 22 марта 2012

Стратегия получения в спящем режиме не должна влиять на результаты в клиенте. RF-Servlet обходит результат службы (которая реализует getEntityById ()) в соответствии с указанными предложениями with. Похоже, что реализация сервиса уже возвращает нулевой список в getElements () или нулевую сущность.

0 голосов
/ 27 марта 2012

Мое первое решение:

  • Я держал Ленивую загрузку на entity.getElements()
  • Добавить новый переходный метод, который извлекает элементы из DOA, давайте назовем его getElementsFromBd()
  • Выполните сопоставление для getElementsFromBd() в EntityProxy
  • В моем докладчике я позвонил getElementsFromBd() вместо getElementsFromBd()

Ведущий

contextA.getEntityById(id).with("elementsFromDb").fire(new Receiver<EntityBaseProxy>() {
    @Override
    public void onSuccess(EntityBaseProxy entity) {
        System.out.println(entity.getElementsFromBd().size());
}
});

Модель сущности

...
@Transient
public List<Element> getElementsFromDb(){
   doa.getElementsFromDb(this.id);
}
...

Спасибо всем

1027 * EDIT *

Я использовал сервлет, расширяющий RequestFactoryServlet, где я начинаю и фиксирую транзакции

public class CustomRequestFactoryServlet extends RequestFactoryServlet {

@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    Transaction tx = null;
    try {
        Session session = HibernateUtil.getCurrentSession();
        tx = session.beginTransaction();
        super.service(request, response);
        session.getTransaction().commit();
    } finally {
        if (tx != null && tx.isActive()) {
            tx.rollback();
        }
    }
}

}

...