当然在find()操作中不需要em.joinTransaction();
至于"那么persistence context能够保持多次请求也一直打开吗?"
不是说ejb容器是实例池化吗,以最少的实例服务,我简单的测试了容器中只有一个无状态session bean实例,我也用不同的客户端访问测试过,也只有一个
以下是我测试session bean的代码,其中的private int i 可以说明这一点
import java.util.List;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.ejb.Local;
import javax.ejb.Remote;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.PersistenceUnit;
@Stateless
@Local(PersonDAO.class)
@Remote(PersonDAO.class)
public class PersonBean implements PersonDAO {
@PersistenceUnit(unitName = "Northwind")
private EntityManagerFactory emf;
private EntityManager em;
private int i = 0;
private EntityManager em() {
if (em == null) {
em = emf.createEntityManager();
System.out.println("Create an EntityManager...");
}
return em;
}
public Person getPerson(Integer id) {
i++;
System.out.println(i);
System.out.println("get a Pseron");
return em().find(Person.class, id);
}
public List getPersonList() {
System.out.println("get a Person list");
return em().createQuery("select a from Person a").getResultList();
}
public void addPerson(Person person) {
System.out.println("append a Person");
em().joinTransaction();
i++;
person.setName(person.getName() + i);
em().persist(person);
}
public void delPerson(Integer id) {
System.out.println("delete a Person");
em().remove(em().getReference(Person.class, id));
}
public int trunPerson() {
em().joinTransaction();
int r = em().createNativeQuery("delete from Person").executeUpdate();
System.out.println(r + "所影响的行数为 " + r + " 行");
return r;
}
@PostConstruct
public void Construct() {
System.out.println("实例初始化...");
System.out.println(this.getClass());
}
@PreDestroy
public void Destroy() {
System.out.println("实例销毁...");
System.out.println(this.getClass());
}
}
[该贴被tom01于2008-10-16 13:26修改过]