Jsf 从CDIBean调用jpa实体管理器查询的正确方法
Primefaces 5.3 glassfish 4.1 以下是我的实体管理Jsf 从CDIBean调用jpa实体管理器查询的正确方法,jsf,jpa,primefaces,Jsf,Jpa,Primefaces,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.createNamedQue
@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;
}
现在在我的cdibean中,我想调用findAllTask方法获取tak列表,然后在我的jsf中使用它创建一个datatable
方法1:
菜豆
@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();
}
@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
这是我以前使用的方法,但我意识到构造函数被多次调用,导致多次重复查询的执行,正如这里的一位成员在另一个问题中所建议的那样,任何业务逻辑都不应该进入我移动到方法2的CDIBean的构造函数中
方法2:
菜豆
@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();
}
@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
我认为第二种方法可能是正确的方法,但我遇到的问题是,如果我尝试对datatable的一列进行排序,那么第二种方法不起作用,我从其他问题中发现,这是因为该方法每次都查询数据库,而不是使用存储值。使用方法1排序工作
是否有一种完全不同的方法可以做到这一点,或者我遗漏了什么我无法完全理解您发布的示例代码,但尽管如此,我还是为您提供了一个使用列过滤的示例 服务 看法 一个简单的表单示例 请注意,它会在保存事件后更新taskDataTable
<h:form id="taskForm" prependId="false">
<p:inputText id="taskFormName" label="Name" value="#{taskBean.task.name}" />
<!-- more fields here ... -->
<p:commandButton id="taskFormSave" actionListener="#{taskBean.save}" value="Save" update="taskDataTable" />
</h:form>
具有列筛选的数据表
您使用的jsf的版本/类型是什么?如果您有import javax.faces.bean.viewscope,您能从BeanTask.java上的import语句告诉我们吗;或导入javax.faces.view.ViewScoped;请检查是否适用
@Named
@ViewScoped
public class TaskBean {
private static final long serialVersionUID = 1L;
@Inject
private TaskManager taskManager;
// Filtered entity list
private List<Task> filteredTasks;
// Main entity list
private List<Task> tasks;
// Main entity
private Task task;
@PostConstruct
public void init() {
reset();
}
private void reset() {
tasks = taskManager.findAll();
}
public void create() {
task = new Task();
}
public void save() {
taskManager.save(task);
reset();
}
public Task getTask() {
return task;
}
public List<Task> getTasks() {
return tasks;
}
public List<Task> getFilteredTasks() {
return filteredTasks;
}
public void setFilteredTasks(List<Task> filteredTasks) {
this.filteredTasks = filteredTasks;
}
}
<h:form id="taskForm" prependId="false">
<p:inputText id="taskFormName" label="Name" value="#{taskBean.task.name}" />
<!-- more fields here ... -->
<p:commandButton id="taskFormSave" actionListener="#{taskBean.save}" value="Save" update="taskDataTable" />
</h:form>
<p:dataTable id="taskDataTable" value="#{taskBean.tasks}" filteredValue="#{taskBean.filteredTasks}" var="row">
<p:column headerText="Name" filterBy="#{row.name}" filterMatchMode="contains">
<h:outputText value="#{row.name}" />
</p:column>
<!-- more columns here ... -->
</p:dataTable>