2016-10-04 4 views
2

Der Versuch, eine Entität persistent zu machen funktioniert nicht, aber eine Liste abrufen ist.Speichern Sie @Entity mit @EntityManager funktioniert nicht

Unten ist mein Bean: (a)

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

    public UsersClass() {} 

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

persistence.xml wie folgt:

<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> 

Bohnen haben @Stateless sein. Above, setup executes fine - no exception or anything but nothing gets saved in DB also.

Versucht, was here erwähnt wird. Ich bin mir nicht sicher, ob ich es richtig gemacht habe oder nicht, aber ich bekam eine Ausnahme.

Ich habe auch versucht, was here erwähnt und modifiziert wie nachstehend: (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(); 
      } 
     } 
    } 
} 

bekam aber die unten Stack-Trace -

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) 

So wie pro meine Lesungen, dachte ich, das Hinzufügen zu meiner Klasse sollte helfen. In der Tat ist die Ausnahme verschwunden, aber nichts wird in der db beibehalten.

habe auch versucht - entitymanager.getTransaction() begin() und commit(), aber es erhalte ich die unten Stack-Trace

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) 

Es ist wirklich mir helfen würde, wenn jemand das fehlende Stück kann darauf hinweisen. von Code.

Update 1 -

ich die unten Reihe von Änderungen versucht haben, auch mit (b)

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

Am immer unter Stack-Trace -

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

Was ist das Objekt, das Sie versuchen, zu bestehen? In Ihrer create-Methode übergeben Sie ein 'Users'-Objekt an Ihren entityManager, aber 'Users' ist die Klasse Ihres Stateless EJB –

Antwort

2
  1. Container Managed Transaktion

Dies scheint in Ordnung zu sein, Ihre create-Methode in Ihrem Users stateless Bean startet die Transaktion automatisch. Ihr EntityManager ist an der Transaktion beteiligt und die Änderungen sollten in der Datenbank beibehalten werden. Was war in diesem Fall die Ausnahme?

  1. Container Managed Transaktion und versuchen, eine JTA Transaktion

Ihre create-Methode automatisch eine Transaktion beginnt zu starten, versucht, eine andere JTA Transaktion im Code zu starten und Sie haben eine 'IllegalStateException'. Wenn Sie die Kontrolle über die Transaktion im Code übernehmen möchten, ändern Sie die Konfiguration in Bean Managed Transaction.

  1. Bean Managed Transaktion

Sie haben die Transaktion im Code zu steuern. Der Code löst keine Ausnahme aus, die Änderungen werden jedoch nicht beibehalten. Dies liegt daran, dass der EntityManager der Transaktion nicht beitritt. Wenn Sie ein EntityManager vor Beginn der JTA-Transaktion erstellt haben, müssen Sie die Methode JoinTransaction() aufrufen, um die EntityManager zu machen die Transaktion zu verbinden:

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

Ich habe die Frage nach dem ersten Kommentar aktualisiert und auch den Punkt "1" beantwortet. Ich habe auch '3' mit dem Setup' b' versucht, wie in deiner Antwort erwähnt. Habe die Frage dazu auch aktualisiert. – Tirath

+0

Ist die 'getEntityManager'-Methode nur ein Getter? Wenn nicht, können Sie auch den Code dieser Methode in der Frage –

+0

hinzufügen Wahrscheinlich müssen Sie die Eigenschaft 'hibernate.transaction.jta.platform' in Ihrer 'persistence.xml' setzen –

0

Sie verwenden JTA Transaktion. In diesem Fall müssen Sie die Transaktion nicht verwalten. Es ist Container verwaltet. Ich denke, Sie sollten @Transactional Annotation auf Create-Funktion verwenden oder wenn Sie Transaktion selbst verwalten möchten, dann müssen Sie Transaktionstyp LOCAL verwenden und Sie Entitätsmanager Instanz von Entitymanager Factory in diesem Fall abrufen müssen.

+0

Versucht, '@ Transactional' hinzuzufügen. Funktioniert nicht. – Tirath

Verwandte Themen