【问题标题】:Can't Delete Object from DataTable in JSF 2.0 with JPA无法使用 JPA 从 JSF 2.0 中的 DataTable 中删除对象
【发布时间】:2012-06-28 16:00:08
【问题描述】:
    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 中删除数据,上面的代码没有输出。我正在尝试修复该代码并且没有输出。 在此之前,我在 (em.remove(e);) 的删除方法中遇到了 IllegalException。 有没有人可以纠正我并对此表示感谢。

【问题讨论】:

    标签: jpa jsf-2


    【解决方案1】:

    由于您不使用 EJB,因此您必须手动管理所有数据库事务。当您通过 JPA EntityManager 对实体执行数据库操作时,您需要每次自己调用 begin()commit()。您没有在 deleteEmployee() 方法中这样做。

    最好将所有 JPA 工作转移到 @Stateless EJB 中,然后将其作为 @EJB 依次注入到您的托管 bean 类中。这样您就不必再担心交易了。有关启动示例,另请参阅此答案的“更新”部分:JSF managed-bean EJB injection


    与具体问题无关,您的吸气剂根本不应该执行数据库操作。每次调用该方法时,您的 getEmplist() 都会调用数据库。这是不必要的昂贵。而是在 bean 的 @PostConstruct 方法中完成这项工作。另见Why JSF calls getters multiple times

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-11-15
      • 1970-01-01
      • 1970-01-01
      • 2014-08-14
      • 2012-05-16
      • 1970-01-01
      • 2013-02-27
      • 2016-04-01
      相关资源
      最近更新 更多