我是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
}
}
请帮助我了解真正的问题。
答案 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>