2013-01-31 66 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,以避免在代碼拋出異常時發生資源泄漏。