如何在glassfish 3.1中使用JPA CMT

如何在glassfish 3.1中使用JPA CMT,jpa,glassfish,Jpa,Glassfish,我是JPA新手,想尝试一下glassfish 3.1上的简单示例。我能够使用Bean管理的事务运行一些示例程序。 然而,当我使用CMT尝试sames示例时,我得到了事务必需的异常 我不知道我哪里出错了 我的项目是一个简单的web项目,我包含了用于实体生成的JPA方面 可能是因为我没有使用EJB项目,所以无法获取glassfish应用服务器EJB容器的功能…对此不确定 我的persistence.xml如下所示: <?xml version="1.0" encoding="UTF-8"?&g

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

我不知道我哪里出错了

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

可能是因为我没有使用EJB项目,所以无法获取glassfish应用服务器EJB容器的功能…对此不确定

我的persistence.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>
}


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

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

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

来自文档:

在具有容器管理的事务划分的企业bean中, EJB容器设置事务的边界。你可以用 具有任何类型企业bean的容器管理事务: 会话或消息驱动。容器管理的事务简化了 开发,因为企业bean代码没有显式标记 交易的边界。代码不包括语句 开始和结束事务

<persistence-unit name="JPAPractise" transaction-type="RESOURCE_LOCAL">
        <non-jta-data-source>jdbc/JPAConnPool</non-jta-data-source>
您可以尝试下面的代码

try{
    em.getTransaction().begin();` 
    em.persist(e1);
    em.getTransaction().commit();`.
}catch(Exception e){
    e.printStackTrace();
}finally{
    em.close();
}
此外,必须将persistence.xml更改为具有
RESOURCE\u LOCAL
事务

<persistence-unit name="JPAPractise" transaction-type="RESOURCE_LOCAL">
        <non-jta-data-source>jdbc/JPAConnPool</non-jta-data-source>

jdbc/jpaconpol