Jpa 被多次调用的EJB方法

Jpa 被多次调用的EJB方法,jpa,ejb,payara,Jpa,Ejb,Payara,我正在Payara 5服务器上开发一个JEE8应用程序。我在我的一个无状态EJB中有一个方法,我从JSF页面只调用一次,但在服务器端它会被多次调用和执行。我在Payara5.192、Payara5.193和Glassfish 5上也尝试过这种方法。但我总是遇到同样的问题。代码如下- @Override public List<Forum> getForums(int startIndex, int size) { TypedQuery<Forum>

我正在Payara 5服务器上开发一个JEE8应用程序。我在我的一个无状态EJB中有一个方法,我从JSF页面只调用一次,但在服务器端它会被多次调用和执行。我在Payara5.192、Payara5.193和Glassfish 5上也尝试过这种方法。但我总是遇到同样的问题。代码如下-

@Override
    public List<Forum> getForums(int startIndex, int size) {
        TypedQuery<Forum> tQ=em.createQuery("select f from Forum f", Forum.class);
        tQ.setFirstResult(startIndex);
        tQ.setMaxResults(size);
        List<Forum> toReturn=tQ.getResultList();
        LOGGER.info("Forums extracted "+toReturn.size());
        return toReturn;
    }

此外,循环的次数也不是固定的。它可以执行15-30次。显然,我只需要一条日志消息。

如果您使用{managedBean.forums}作为JSF组件的值,您的方法可能会被调用多次,因为组件需要访问数据时,它会调用getter

在JSF中实现这一点的方法是实现一个加载数据的方法,并在每次需要重新加载数据时从@PostConstruct方法调用它。JSF组件的value属性中使用的方法应该是一个只返回数据的简单getter:

private List<Forum> forums;

public List<Forum> getForums() {
    return forums;
}

@PostConstruct
private void init() {
    loadForums();
}

public void loadForums() {
    TypedQuery<Forum> tQ=em.createQuery("select f from Forum f", Forum.class);
    tQ.setFirstResult(startIndex);
    tQ.setMaxResults(size);
    forums =tQ.getResultList();
    LOGGER.info("Forums extracted "+forums.size());
}

如果您使用{managedBean.forums}作为JSF组件的值,您的方法可能会被调用多次,因为组件需要访问数据的任何时候都会调用getter

在JSF中实现这一点的方法是实现一个加载数据的方法,并在每次需要重新加载数据时从@PostConstruct方法调用它。JSF组件的value属性中使用的方法应该是一个只返回数据的简单getter:

private List<Forum> forums;

public List<Forum> getForums() {
    return forums;
}

@PostConstruct
private void init() {
    loadForums();
}

public void loadForums() {
    TypedQuery<Forum> tQ=em.createQuery("select f from Forum f", Forum.class);
    tQ.setFirstResult(startIndex);
    tQ.setMaxResults(size);
    forums =tQ.getResultList();
    LOGGER.info("Forums extracted "+forums.size());
}

还记录传入参数、startIndex和size。这是完全相同的呼叫吗?@pirho,是的,它们确实是相同的参数。事实上,我确实在问题陈述中提到了这一点——如果我从索引0开始分页,结果大小为5。谢谢你的关注。是的,我注意到了,但实际上我想知道的是,如果唯一的0/5呼叫会以某种方式产生呼叫,比如说5/5和10/5等等。。。但显然不是这样。你能提供更多的上下文信息,比如JSF视图、支持bean和无状态EJB吗?还要记录传入的参数startIndex&size。这是完全相同的呼叫吗?@pirho,是的,它们确实是相同的参数。事实上,我确实在问题陈述中提到了这一点——如果我从索引0开始分页,结果大小为5。谢谢你的关注。是的,我注意到了,但实际上我想知道的是,如果唯一的0/5呼叫会以某种方式产生呼叫,比如说5/5和10/5等等。。。但显然不是这样,您能提供更多的上下文信息,比如JSF视图、支持bean和无状态EJB吗?