2012-07-23 30 views
0

對不起,如果重複。JPQL @NamedQuery與實體或Id?

是否有可能或建議業務層使用對象,而不是id?

SELECT c 
FROM Child AS c 
WHERE c.parent = :parent 
public List<Child> list(final Parent parent) { 

    // does parent must be managed? 
    // how can I know that? 
    // have parent even been persisted? 

    return em.createNamedQuery(...). 
     setParameter("parent", parent); 
} 

這是我如何與工作。

SELECT c 
FROM Child AS c 
WHERE c.parent.id = :parent_id 
public List<Child> list(final Parent parent) { 

    // wait! parent.id could be null! 
    // it may haven't been persisted yet! 

    return list(parent.getId()); 
} 

public List<Child> list(final long parentId) { 
    return em.createNamedQuery(...). 
     setParameter("parent_id", parentId); 
} 

修訂問題--------------------------------------

做任何JAX-RS或JAX-WS類每個可以注入@EJB可以說在同一個JTA?

在這裏,我總是很好奇的原始問題。

比方說,我們有兩個EJB。

@Stateless 
class ParentBean { 

    public Parent find(...) { 
    } 
} 

@Stateless 
class ChildBean { 

    public List<Child> list(final Parent parent) { 
    } 

    public List<Child> list(final long parentId) { 
    } 
} 

什麼是使用任何EJB客戶端的正確方法?

@Stateless // <<-- This is mandatory for being injected with @EJB, right? 
@Path("/parents/{parent_id: \\d+}/children") 
class ChildsResource { 

    @GET 
    @Path 
    public Response list(@PathParam("parent_id") final long parentId) { 

     // do i just have to stick to this approach? 
     final List<Child> children1 = childBean.list(parentId); 

     // is this parent managed? 
     // is it ok to pass to other EJB? 
     final Parent parent = parentBean.find(parentId); 

     // is this gonna work? 
     final List<Child> children2 = childBean.list(parent); 

     ... 
    } 

    @EJB 
    private ParentBean parentBean; 

    @EJB 
    private ChildBean childBean; 
} 

回答

1

如果家長還沒有被保存,那麼查詢將不起作用,並執行它沒有多大意義。如果父母沒有被保留,你有責任避免執行它。但我不會讓它成爲查找方法本身的責任。只需在方法的文檔中明確指出,作爲參數傳遞的父代必須具有ID,或者至少是持久的。無需與實體經理一樣進行驗證。

如果它已被保存,但刷新還沒有發生,實體管理器必須在執行查詢之前刷新,以使查詢找到新父項的子項。

至少在Hibernate中,您可以使用分離的父級執行查詢。如果ID存在,查詢將使用它並執行查詢。

2

以下是呈現爲答案只有問題「是否有可能或推薦的業務層使用對象而不是IDS?」,因爲我很遺憾沒有充分認識第二個問題:「是否有任何JAX-RS或者每個可以用@EJB注入的JAX-WS類可以在同一個JTA中說?「。

這是可能的。在大多數情況下也建議。 ORM的全部目的是我們可以對對象及其關係進行操作,而不是在數據庫中對其進行表示。

實體的ID(特別是在代理id的情況下)通常只在我們靠近存儲本身時纔有意義。當僅提供持久性需要訪問id時,設計訪問id的方法通常是合理的,如protected。當我們這樣做時,將更少的噪音發佈給實體的用戶。

像往常一樣也有有效的例外。例如,可以發現,通過線路移動整個實體太耗費資源,並且具有ID列表而不是實體列表是優選的。這樣的設計決定不應該在問題實際存在之前完成。