0
    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);) の delete メソッドで IllegalException を取得しました。私を訂正して感謝できる人はいますか。

4

1 に答える 1

0

EJB を使用していないため、すべての DB トランザクションを手動で管理する必要があります。JPA でエンティティに対して DB アクションを実行するたびにbegin()自分commit()自身を呼び出す必要があります。メソッドでそれを行っていません。EntityManagerdeleteEmployee()

JPA のすべての機能を EJB に移動し、マネージド Bean クラスの@Statelessように順番に注入する方がはるかに優れています。@EJBこれにより、トランザクションについて心配する必要がなくなります。キックオフの例については、この回答の「更新」部分も参照してください: JSF managed-bean EJB Injection


具体的な問題とは関係ありませんが、ゲッターは DB アクションをまったく実行すべきではありません。メソッドgetEmplist()が呼び出されるたびにDBを呼び出しています。これは不必要に高価です。むしろ、Bean の@PostConstructメソッドでジョブを実行してください。JSF がゲッターを複数回呼び出す理由も参照してください。

于 2012-06-28T16:04:35.383 に答える