2016-10-04 220 views
2

嘗試堅持一個實體無法正常工作,但檢索列表是。使用@EntityManager保存實體不工作

下面是我的豆:(一)

@Stateless 
public class UsersClass { 
    @PersistenceContext(unitName = "unit") 
    private EntityManager em; 

    public UsersClass() {} 

    public void create(Users entity) { 
     em.persist(entity); 
    } 
} 

persistence.xml如下:

<persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd"> 

<persistence-unit name="unit" transaction-type="JTA"> 
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider> 

<jta-data-source>jdbc/ds</jta-data-source> 
<exclude-unlisted-classes>false</exclude-unlisted-classes> 
<properties> 
</properties> 
</persistence-unit> 
</persistence> 

豆必須@Stateless。 Above, setup executes fine - no exception or anything but nothing gets saved in DB also

試過什麼提到here。不知道我是否正確地做了,但得到了異常。

我也試過什麼提到here及以下修改:(B)

@Stateless 
public class UsersClass { 
    @PersistenceContext(unitName = "unit") 
    private EntityManager em; 

    @Resource 
    private SessionContext sessionContext; 

    public UsersClass() {} 

    public void create(Users entity) { 
     UserTransaction userTxn = sessionContext.getUserTransaction(); 
     try { 
      userTxn.begin(); 
      getEntityManager().persist(entity); 
      userTxn.commit(); 
     } catch(Throwable e){ 
      e.printStackTrace(); 
      try { 
       userTxn.rollback(); 
      } catch (IllegalStateException | SecurityException | SystemException e1) { 
       e1.printStackTrace(); 
      } 
     } 
    } 
} 

,但得到下面的堆棧跟蹤 -

Caused by: java.lang.IllegalStateException: Only session beans with bean-managed transactions can obtain UserTransaction 
at com.sun.ejb.containers.EJBContainerTransactionManager.getUserTransaction(EJBContainerTransactionManager.java:566) 
at com.sun.ejb.containers.BaseContainer.getUserTransaction(BaseContainer.java:995) 
at com.sun.ejb.containers.AbstractSessionContextImpl.getUserTransaction(AbstractSessionContextImpl.java:120) 

所以按我的閱讀,我想加入@TransactionManagement(TransactionManagementType.BEAN)我的班級應該有所幫助。事實上,這個例外已經消失了,但是在數據庫中沒有任何東西。

也試過 - entitymanager.getTransaction()()開始並提交(),但我得到了下面的堆棧跟蹤

Caused by: java.lang.IllegalStateException: A JTA EntityManager cannot use getTransaction() 
at org.hibernate.internal.AbstractSharedSessionContract.getTransaction(AbstractSharedSessionContract.java:360) 
at org.hibernate.internal.AbstractSessionImpl.getTransaction(AbstractSessionImpl.java:23) 
at com.sun.enterprise.container.common.impl.EntityManagerWrapper.getTransaction(EntityManagerWrapper.java:806) 

這將真正幫助我,如果有人能指出缺少的部分。的代碼。

更新1 -

我已經試過低於設定的變化也與(B)

userTxn.begin(); 
getEntityManager().joinTransaction(); 
getEntityManager().persist(entity); 
userTxn.commit(); 

我得到以下堆棧跟蹤 -

org.hibernate.resource.transaction.backend.jta.internal.JtaPlatformInaccessibleException: Unable to access TransactionManager or UserTransaction to make physical transaction delegate 
at org.hibernate.resource.transaction.backend.jta.internal.JtaTransactionCoordinatorImpl.makePhysicalTransactionDelegate(JtaTransactionCoordinatorImpl.java:229) 
at org.hibernate.resource.transaction.backend.jta.internal.JtaTransactionCoordinatorImpl.getTransactionDriverControl(JtaTransactionCoordinatorImpl.java:203) 
at org.hibernate.engine.transaction.internal.TransactionImpl.<init>(TransactionImpl.java:37) 
at org.hibernate.internal.AbstractSharedSessionContract.accessTransaction(AbstractSharedSessionContract.java:372) 
at org.hibernate.internal.AbstractSharedSessionContract.markForRollbackOnly(AbstractSharedSessionContract.java:342) 
at org.hibernate.internal.ExceptionConverterImpl.handlePersistenceException(ExceptionConverterImpl.java:271) 
at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:148) 
at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:155) 
at org.hibernate.internal.SessionImpl.joinTransaction(SessionImpl.java:3736) 
at org.hibernate.internal.SessionImpl.joinTransaction(SessionImpl.java:3718) 
at com.sun.enterprise.container.common.impl.EntityManagerWrapper.joinTransaction(EntityManagerWrapper.java:990) 
+0

什麼是實體您要堅持?在你的create方法中,你傳遞一個'Users'對象給你的entityManager,但'Users'是你的無狀態EJB的類 –

回答

2
  1. 容器管理事務

這似乎是好了,在你的Users無國籍豆你創建方法自動啓動事務。您的entityManager參與了事務,並且這些更改應該保存到數據庫中。這種情況是什麼例外?

  • 容器管理事務並嘗試啓動一個JTA事務
  • 你創建方法自動啓動一個交易,你試過在代碼中啓動另一個JTA事務和你了'IllegalStateException'。如果要在代碼中控制事務,請將配置更改爲Bean Managed Transaction。

  • Bean管理事務
  • 您正在控制在代碼中事務。代碼不會拋出任何異常,但更改不會持久。這是因爲EntityManager沒有加入交易。如果你一個EntityManager JTA事務開始之前創建的,則需要調用方法joinTransaction()進行了EntityManager加入交易:

    userTxn.begin(); 
    EntityManager em = getEntityManager(); 
    em.joinTransaction(); 
    em.persist(entity); 
    userTxn.commit(); 
    
    +0

    我在初始評論後更新了問題,並回答了問題'1'。我也嘗試了'3'設置'b'在你的答案中提到。已經更新了這個問題。 – Tirath

    +0

    你是getEntityManager方法嗎?如果不是,你是否也可以在問題 –

    +0

    中添加此方法的代碼可能需要在「persistence.xml」中設置屬性'hibernate.transaction.jta.platform' –

    0

    您正在使用JTA事務。在這種情況下,您不需要管理交易。它是容器管理的。我認爲你應該在create函數上使用@Transactional註解,或者如果你想自己管理事務,那麼你需要使用事務類型LOCAL,在這種情況下你需要從entitymanager工廠獲取entitymanager實例。

    +0

    試圖添加'@ Transactional'。不起作用。 – Tirath