【发布时间】:2015-11-20 17:19:36
【问题描述】:
Primefaces 5.3 glassfish 4.1
以下是我的实体管理
@Stateless
public class ManagerTask {
@PersistenceContext(unitName="task")
private EntityManager em;
ManagerTask(){}
public List<Task> findAllTask() {
TypedQuery<Task> q = em.createNamedQuery("Task.findAll",Task.class);
List<Task> taskList = q.getResultList();
return taskList;
}
现在在我的 CDI bean 中,我想调用 findAllTask() 方法获取任务列表,然后在我的 jsf 中使用它来创建数据表
方法一:
CDI 豆
@Named(value="bt")
@ViewScoped
public class BeanTask {
@SuppressWarnings("unused")
private static final long serialVersionUID = 1L;
private ManagerTask mt;
private List<Task> tl;
private List<Task> filteredtl;
private ArrayList<SelectItem> regions;
public BeanTask() {
// TODO Auto-generated constructor stub
}
@Inject
public BeanTask(ManagerTask mt) {
this.mt=mt;
tl=mt.findAllTask();
}
jsf
<p:dataTable id="tb1" var="tk" value="#{bt.tl}"
rowIndexVar="rowindex" styleClass="fixed-size"
filteredValue="#{bt.filteredtl}"
>
这是我以前使用的方法,但我意识到构造函数被多次调用导致执行多个重复查询,并且正如成员在这里在另一个问题中所建议的那样,任何业务逻辑都不应该进入构造函数我移动到方法 2 的 cdi bean
方法二:
CDI 豆
@Inject
private ManagerTask mt;
private List<Task> tl;
private List<Task> filteredtl;
private ArrayList<SelectItem> regions;
public BeanTask() {
// TODO Auto-generated constructor stub
}
public List<Task> getalltasks() {
tl=mt.findAllTask();
return tl;
}
jsf
<p:dataTable id="tb1" var="tk" value="#{bt.getalltasks()}"
rowIndexVar="rowindex" styleClass="fixed-size"
filteredValue="#{bt.filteredtl}"
>
我认为第二种方法可能是正确的方法,但我遇到的问题是,如果我尝试对数据表的列进行排序,它不适用于第二种方法,我从其他问题中发现这里是因为该方法每次都查询数据库,而不是使用存储值linked here。使用方法 1 排序。
是否有完全不同的方式我应该这样做或者我错过了什么
【问题讨论】:
-
您使用的 jsf 版本/类型是什么?如果你有 import javax.faces.bean.ViewScoped,你能从你对 BeanTask.java 的 import 语句告诉我们吗?或导入 javax.faces.view.ViewScoped;请?查看stackoverflow.com/questions/12229561/…和balusc.omnifaces.org/2010/06/…是否适用
标签: jsf jpa primefaces