2014-09-19 136 views
1
public void lagreMelding(String bruker, String msg) { 
     EntityManager em = emf.createEntityManager(); 
     Melding melding = new Melding(bruker, msg); 
    try { 
     em.getTransaction().begin(); 
     em.persist(melding); 
     em.getTransaction().commit(); 
     em.close(); 
    } catch (RollbackException e) { 
     em.getTransaction().rollback(); 
    } 
} 

時,錯誤報告如下:IllegalStateException異常持久對象

java.lang.IllegalStateException: 
Exception Description: Cannot use an EntityTransaction while using JTA. 
    org.eclipse.persistence.internal.jpa.transaction.JTATransactionWrapper.getTransaction(JTATransactionWrapper.java:73) 
    org.eclipse.persistence.internal.jpa.EntityManagerImpl.getTransaction(EntityManagerImpl.java:1311) 
    no.hib.dat104.oblig1.Kontroll.lagreMelding(Kontroll.java:37) 
    no.hib.dat104.oblig1.MeldingServlet.doPost(MeldingServlet.java:80) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:646) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:727) 
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 

所有其他的這個問題已經被移除

em.getTransaction().begin(); 

em.getTransaction().commit(); 
解決實例

但是在做這個d atabase不更新。任何人都在意解釋我錯過了什麼?預先感謝你的時間爲一個簡單的問題:)

+0

http://stackoverflow.com/questions/10915855/cannot-use-an-entitytransaction-while-using-jta – RahulArackal 2014-09-19 11:46:44

+0

有同樣的問題 - 這對我工作 - http://stackoverflow.com/a/38209862/388389 - 在提供者定義後立即添加* non-jta-data-source * – npocmaka 2017-01-03 14:27:48

回答

0

你不能開始並提交事務這種方式使用JTA時,嘗試這樣的事:

public void lagreMelding(String bruker, String msg) { 
     EntityManager em = emf.createEntityManager(); 
     Melding melding = new Melding(bruker, msg); 

     UserTransaction transaction = (UserTransaction)new InitialContext().lookup("java:comp/UserTransaction"); 

    try { 
     transaction.begin(); 
     em.persist(melding); 
     transaction.commit(); 
     em.close(); 
    } catch (RollbackException e) { 
     transaction.rollback(); 
    } 
} 
0

從堆棧跟蹤我想你正在嘗試從一些Web應用程序在Servlet方法中使用JPA持久化實體。您也正在使用JTA事務管理。使用這種類型的事務管理,您無法像使用資源本地事務管理那樣在從EntityManager獲取的EntityTransaction上操作。你必須允許容器爲您提供UserTransaction

@Resource 
UserTransaction tx; 

而在這之後它與begin()commit()rollback()操作。

try { 
    tx.begin(); 
    em.persist(melding); 
    tx.commit(); 
} catch (Exception e) { 
    if (status.STATUS_MARKED_ROLLBACK == tx.getStatus()) { 
     try { 
     tx.rollback(); 
     } catch (SystemException e1) { 
     //log error 
     } 
    } 
} finally() { 
    em.close(); 
} 

正如您已經注意到手動維護交易是相當麻煩的。這就是爲什麼,如果可能的話,我使用EJB bean進行自動事務管理。

+0

這樣做時,我必須用10個新的捕獲異常來包圍它們。這是必要的嗎? – Patidati 2014-09-19 11:45:38

+0

我會用EJB去的。該示例適用於純Servlet環境。 – zbig 2014-09-19 11:48:47