2012-03-21 66 views
0

我',我有这样一个延迟加载与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());

回答

0

我的第一个解决方案:

  • 我一直在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); 
} 
... 

谢谢大家

编辑

我结束了使用扩展RequestFactoryServlet一个servlet,我开始并提交交易

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(); 
     } 
    } 
} 

}

1

休眠提取策略不应该对客户端的结果产生影响。 RF-Servlet根据指定的with-clause来遍历服务的结果(实现getEntityById())。 看起来服务实现已经在getElements()或null实体中返回空列表。

+0

BTW,当我用渴望fetshing,它的工作原理。所以我怀疑服务的实现是问题的来源 – outellou 2012-03-22 13:55:28

+0

嗯,也许你的Hibernate会话在RF servlet收集数据时已经关闭了?你可以看看Spring的OpenSessionInViewFilter,寻找可能的解决方案。 – StefanR 2012-03-22 14:17:54

1

我不使用休眠,但我已经找到一个很好的解决方案,与延迟加载和RequestFactory工作。它使用ServletFilter并将请求包装到我的DAO服务器实现中。该实现创建一个可用于整个请求的ThreadLocal EntityManager。请注意,您仍然必须在事务中包装合并。我终于可以删除我所有的{em.close()}方法,并且不再需要EAGER加载。在requestContext中使用with()方法允许服务器端获取器加载连接的实体,这样就可以影响客户端实现中的对象图加载。

这里是我的筛选

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>