2012-03-21 95 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>