1

我有一个父实体,它有子实体 (A),而子实体 (A) 又拥有自己的子实体 (B)。

@Entity
public class Parent {
    @OneToMany
    Set<ChildA> childrenA;
}

@Entity
public class ChildA {
    @OneToMany
    Set<ChildB> childrenB;
}

我正在尝试通过 JSF 数据表显示数据。我想展示以下内容。

Parent1 | NumberOfRelatedChildrenB
Parent2 | NumberOfRelatedChildrenB

为了在 dataTable 中生成行,我使用了一个 ManagedBean,它通过 ParentFacade.findAll() 获取父列表,但我不知道如何获取所有关联 ChildB 的列表。我想我可以将 @OneToMany ChildB 关系添加到 Parent 实体,但我希望有办法通过 ChildA 关系获得它们?

在此先感谢并抱歉解释不佳!

4

2 回答 2

1

不,我建议避免在这种情况下创建额外的关系。一种方法是在托管 bean 中创建一个方法,该方法返回ChildB给定输入的相关数量Parent

@ManagedBean
public class MyManagedBean {

    private List<Parent> parentList;//+getter
    private Map<Long, Long> relatedChildrenB = new HashMap<Long,Long>();//+getter
    @EJB
    private ParentFacade parentFacade;

    @PostConstruct
    public void init() {
        parentList = parentFacade.findAll();
        for (Parent parent : parentList) {
            relatedChildrenB.put(parent.getId(), parentFacade.getNumberOfRelatedChildrenB(parent));
        }

}

在 facelets 页面中:

<h:dataTable value="#{myManagedBean.parentList}" var="parent">
    ...
    #{myManagedBean.relatedChildrenB[parent.id]}
</h:dataTable>

并在门面服务类中实现相应的查询。

请注意,()在 EL 表达式中使用前一个修订版中的括号传递对象需要 EL 2.2,因此需要 Servlet 3.0 兼容容器或应用一些变通方法。该解决方案不需要带参数的方法调用。

最后,请注意,在我的最终编辑中,我遵循了 skuntsel 的明智建议,以避免在 getter 方法中调用 db。

于 2013-07-23T09:01:59.327 回答
0

简单的解决方案是在 Parent 中放置一个返回子计数的方法,然后在 dataTable 列中使用它,例如

@Transient
public int getAllChildrenCount() {
   // iterate through children list and count
}

观点:

#{parent.allChildrenCount}
于 2013-07-23T08:56:24.727 回答