Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jpa JPQL@NamedQuery是否包含实体或ID?_Jpa_Ejb 3.1 - Fatal编程技术网

Jpa JPQL@NamedQuery是否包含实体或ID?

Jpa JPQL@NamedQuery是否包含实体或ID?,jpa,ejb-3.1,Jpa,Ejb 3.1,抱歉,如果重复 业务层是否可能或建议使用对象而不是ID 选择c 从Child到c 其中c.parent=:parent 公共列表(最终父级){ //家长必须被管理吗? //我怎么知道? //父母是否坚持了? 返回em.createNamedQuery(…)。 setParameter(“父”,父); } 这就是我的工作方式 选择c 从Child到c 其中c.parent.id=:parent\u id 公共列表(最终父级){ //等等!parent.id可能为空! //它可能还没有被持久化

抱歉,如果重复

业务层是否可能或建议使用对象而不是ID

选择c
从Child到c
其中c.parent=:parent
公共列表(最终父级){
//家长必须被管理吗?
//我怎么知道?
//父母是否坚持了?
返回em.createNamedQuery(…)。
setParameter(“父”,父);
}
这就是我的工作方式

选择c
从Child到c
其中c.parent.id=:parent\u id
公共列表(最终父级){
//等等!parent.id可能为空!
//它可能还没有被持久化!
返回列表(parent.getId());
}
公共列表(最终长parentId){
返回em.createNamedQuery(…)。
setParameter(“父项id”,父项id);
}
更新问题--------------------------------------

在同一个JTA中是否有任何JAX-RS或JAX-WS类都可以注入
@EJB

这就是我一直好奇的最原始的问题

假设我们有两个EJB

@Stateless
class ParentBean {

    public Parent find(...) {
    }
}

@Stateless
class ChildBean {

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

    public List<Child> list(final long parentId) {
    }
}
@无状态
类ParentBean{
公共父查找(…){
}
}
@无国籍
类ChildBean{
公共列表(最终父级){
}
公共列表(最终长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;
}

@Stateless/以下仅作为问题“业务层是否可能或建议使用对象而不是ID?”的答案,因为不幸的是,我不完全理解第二个问题“是否有任何可以在同一JTA中使用@EJB注入的JAX-RS或JAX-WS类?”

这是可能的。在大多数情况下,也建议使用。ORM的全部目的是,我们可以对对象及其关系进行操作,而不是对它们在数据库中的表示进行操作

实体Id(特别是在代理Id的情况下)通常是一个只有在接近存储本身时才感兴趣的概念。当只有持久性本身需要访问id时,将访问id的方法设计为受保护的方法通常是有意义的。当我们这样做时,会向实体的用户发布较少的噪声


与往常一样,也存在有效的例外情况。例如,可以发现,在线路上移动整个实体太消耗资源,最好使用ID列表而不是实体列表。在问题实际存在之前,不应做出这样的设计决策。

以下仅作为问题“业务层是否可能或建议使用对象而不是ID?”的答案,因为很遗憾,我不完全理解第二个问题“在同一个JTA中,是否有任何可以注入@EJB的JAX-RS或JAX-WS类?”

这是可能的。在大多数情况下也是推荐的。ORM的全部目的是我们可以对对象及其关系进行操作,而不是对它们在数据库中的表示进行操作

实体Id(特别是在代理Id的情况下)通常是一个只有在靠近存储本身时才有意义的概念。当只有持久性本身需要访问Id时,设计方法来访问受保护的Id通常是有意义的。当我们这样做时,向实体用户发布的噪音就更少了


与往常一样,也存在有效的例外情况。例如,可以发现,在线路上移动整个实体会消耗太多资源,最好使用ID列表而不是实体列表。在问题实际存在之前,不应做出这样的设计决策。

如果父项尚未持久化,则查询将无法工作,如果nd执行它没有多大意义。如果父对象未被持久化,您有责任避免执行它。但我不会让find方法本身负责。只需在方法的文档中明确指出,作为参数传递的父对象必须具有ID,或者至少是持久的。无需进行sam作为实体经理的everification

如果它已被持久化,但刷新尚未发生,则实体管理器必须在执行查询之前进行刷新,以使查询能够找到新父级的子级


至少在Hibernate中,您可以使用分离的父级执行查询。如果ID在那里,查询将使用它并执行查询。

如果父级尚未持久化,则查询将不起作用,执行它没有多大意义。如果父级未持久化,则您有责任避免执行它。但我不会uld不将其作为find方法本身的责任。只需在方法的文档中明确说明作为参数传递的父级必须具有ID,或者至少是持久性的。无需与实体管理器进行相同的验证

如果它已被持久化,但刷新尚未发生,则实体管理器必须在执行查询之前进行刷新,以使查询能够找到新父级的子级

至少在Hibernate中,您可以使用分离的父级执行查询。如果ID在那里,查询将使用它并执行查询