2013-01-31 45 views
0

我有以下代码:JPA - 执行更新

package testingjpa; 

import javax.persistence.EntityManager; 
import javax.persistence.EntityManagerFactory; 
import javax.persistence.Persistence; 
import javax.persistence.Query; 

public class Main 
{ 

    public static void main(String[] args) 
    { 
     EntityManagerFactory emFactory = Persistence.createEntityManagerFactory("TestingJPAPU"); 

     EntityManager em = emFactory.createEntityManager(); 

     Query query = em.createQuery("UPDATE Passengers p SET p.name = 'Robert' WHERE p.id = 2"); 

     query.executeUpdate(); 
     em.close(); 
    } 
} 

这段代码的问题是,它抛出一个TransactionRequiredException。实体类工作正常,因为我尝试过使用其他代码并且工作完美。我该如何解决这个问题?

回答

1
@Resource private UserTransaction mytx; 
public static void main(String[] args) 
    { 
     EntityManagerFactory emFactory = Persistence.createEntityManagerFactory("TestingJPAPU"); 

     EntityManager em = emFactory.createEntityManager(); 

     mytx.begin(); 
     Query query = em.createQuery("UPDATE Passengers p SET p.name = 'Robert' WHERE p.id = 2"); 

     query.executeUpdate(); 
     mytx.commit() 
     em.close(); 
    } 
+0

非常感谢:)它工作:) – robert

+3

这在EJB容器之外工作? –

3

您应该自己启动并提交/回滚事务,因为容器管理的事务在您的情况下不可用。

首先,您应该询问EntityManager中的UserTransaction。查询之后,您应该提交或回滚您的事务。

您还应该做一些不错的连接处理:关闭finally-block中的entitymanager,以避免在代码抛出异常时发生资源泄漏。