如何使用JPA CMT与glassfish 3.1

时间:2013-07-15 18:21:03

标签: jpa glassfish

我是JPA的新手,想尝试一下关于glassfish 3.1的简单例子。我可以使用Bean管理事务运行一些示例程序。 但是,当我使用CMT尝试相同的示例时,我得到了事务所需的异常。

无法找到我出错的地方。

我的项目是简单的Web项目,我将JPA facet包含在实体生成中。

可能是因为我没有使用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
}

}

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

1 个答案:

答案 0 :(得分:0)

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

TestJPA是一个servlet&amp;不是容器将管理事务的企业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>