0

我是 JPA 的新手,想在 glassfish 3.1 上尝试简单的示例。我能够使用 Bean 托管事务运行一些示例程序。但是,当我使用 CMT 尝试相同的示例时,我得到了事务必需的异常。

无法知道我哪里出错了。

我的项目是简单的 Web 项目,我包含了用于实体生成的 JPA 方面。

可能是一个原因,因为我没有使用 EJB 项目,所以无法获得 glassfish 应用服务器的 EJB 容器的功能......不确定这个......

我的 persitence.xml 如下:

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence          http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
<persistence-unit name="JPAPractise" transaction-type="JTA">
    <jta-data-source>jdbc/JPAConnPool</jta-data-source>
    <class>model.Address</class>
    <class>model.Employee</class>
</persistence-unit>

普通 servlet 作为触发点:

@WebServlet("/TestJPA")
public class TestJPA extends HttpServlet {
private static final long serialVersionUID = 1L;

@PersistenceUnit
EntityManagerFactory emf;
/*@Resource 
UserTransaction tx;*/


protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    EntityManager em = emf.createEntityManager();

    Employee e1 = new Employee();
    e1.setEmployeeID("290874");
    e1.setName("Shashi Shankar");
    e1.setSalary(60000);
    try{
        //tx.begin();
        em.persist(e1);
        em.flush();
        //tx.commit();
    }catch(Exception e){
        e.printStackTrace();
    }



}

/**
 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
 */
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    // TODO Auto-generated method stub
}

}

请帮助我了解真正的问题。

4

1 回答 1

0

在 BMT 中,您负责管理事务,而在 CMT 中,它是容器的。因此,您的示例正在使用 BMT。

TestJPA是一个 servlet 而不是容器将管理事务的企业 bean。

从文档:

在具有容器管理事务划分的企业 bean 中,EJB 容器设置事务的边界。您可以将容器管理的事务与任何类型的企业 bean 一起使用:会话或消息驱动。容器管理的事务简化了开发,因为企业 bean 代码没有明确地标记事务的边界。该代码不包括开始和结束事务的语句。

您可以尝试以下代码。

try{
    em.getTransaction().begin();` 
    em.persist(e1);
    em.getTransaction().commit();`.
}catch(Exception e){
    e.printStackTrace();
}finally{
    em.close();
}

此外,必须更改 persistence.xml 才能进行RESOURCE_LOCAL事务。

<persistence-unit name="JPAPractise" transaction-type="RESOURCE_LOCAL">
        <non-jta-data-source>jdbc/JPAConnPool</non-jta-data-source>
于 2013-07-16T08:19:51.900 回答