package com.jee6.beans;
import com.jee6.entity.Employee;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.annotation.Resource;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.persistence.*;
import javax.transaction.SystemException;
@ManagedBean
@SessionScoped
public class EmployeeBean {
@PersistenceContext(unitName = "ServicePU")
private EntityManager em;
@Resource
private javax.transaction.UserTransaction utx;
private List<Employee> emplist=new ArrayList<Employee>();
//private Query sql="SELECT e FROM Employee e";
private Employee emp= new Employee();
public Employee getEmp() {
return emp;
}
public void setEmp(Employee emp) {
this.emp = emp;
}
public List<Employee> getEmplist() {
return emplist=findAll();
}
public void setEmplist(List<Employee> emplist) {
this.emplist = emplist;
}
public List<Employee> findAll(){
emplist=(List<Employee>)em.createQuery("Select e From Employee e").getResultList();
return emplist;
}
public EmployeeBean() {
}
public String saveEmployee(){
persist(emp);
return null;
}
public String deleteEmployee(Employee e){
try{
em.remove(e);
emplist=findAll();
}
catch (Exception ex)
{
Logger.getLogger(getClass().getName()).log(Level.SEVERE, "exceptioncaught", ex);
}
return null;
}
public void persist(Object object) {
try {
utx.begin();
em.persist(object);
utx.commit();
} catch (Exception e) {
Logger.getLogger(getClass().getName()).log(Level.SEVERE, "exception caught", e);
throw new RuntimeException(e);
}
}
}
我想从JSF中的DataTable中删除数据上面的代码只有没有输出。我试图修复该代码并没有输出。 在此之前,我在delete方法中得到了IllegalException(em.remove(e);)。 是否有人可以纠正我并对此表示赞赏。
答案 0 :(得分:0)
由于您没有使用EJB,您必须手动管理所有数据库事务。当您通过JPA begin()
对实体执行数据库操作时,您需要自己致电commit()
和EntityManager
每次。你没有在deleteEmployee()
方法中这样做。
更好的办法是将所有JPA工作转移到@Stateless
EJB中,并将其作为@EJB
依次注入托管bean类中。这样您就不必再担心交易了。有关启动示例,另请参阅此答案的“更新”部分:JSF managed-bean EJB injection。
无关,你的getter根本不应该执行数据库操作。每次调用方法时,getEmplist()
都在调用数据库。这是不必要的昂贵。而是在bean的@PostConstruct
方法中完成工作。另见Why JSF calls getters multiple times。