Jpa JPQL@NamedQuery是否包含实体或ID?
抱歉,如果重复 业务层是否可能或建议使用对象而不是IDJpa 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可能为空! //它可能还没有被持久化
选择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在那里,查询将使用它并执行查询