2016-03-30 11 views
2

Ich benutze JPA und ich habe eine abstrakte Klasse, wo ich injiziere mein entityManager und ich habe eine generische Methode, wo ich mein Projekt in der Datenbank persistent und in allen meine Dienste Klasse erweitert diese abstrakte Klasse aber das Problem ist: manchmal muss ich persist client und client details, aber wenn ich eine ausnahme in der persist des clients habe, dann behalte mein programm client-details aus, weswegen ich nach einem rollBack suche, das aufgerufen wird, wenn ich eine persist-ausnahme habe.Wie RollBack eine Transaktion eines EntityManager von @PersistenceContext injiziert?

Ich khow, dass ich wie entityManager.getTransaction().rollback(); tun kann, aber wenn ich meine Entity Manager, aber in meinem Fall verwaltet, verwaltet es durch den Container.

Hier ist meine abstrakte Klasse ist:

public abstract class AbstractEntityFactory<E>{ 
protected static final transient Logger LOGGER = CommonLogger.getLogger(AbstractEntityFactory.class); 
@PersistenceContext(unitName = "Test_PU") 
@Transient 
@XmlTransient 
private transient EntityManager entityManager; 

public E persist(final E arg0) { 
    LOGGER.debug("persist : Begin"); 
    this.getEntityManager().persist(arg0); 
    this.getEntityManager().flush(); 
    LOGGER.debug("persist : End"); 
    return arg0;   
} 

}

NB: Ich habe Jboss EAP6 als Server

+0

Ist es Frühling, die die EntityManager einspritzt? Wenn Sie dann jedoch die RuntimeException auslösen, sollte die Transaktion zurückgesetzt werden. Geschieht es nicht? –

+0

Alle Container führen einen Rollback der Transaktion aus, wenn eine Ausnahme vorliegt. Die meisten Persistenzanbieter werden von JPA benötigt, um die Transaktion für Rollbacks zu kennzeichnen, wenn eine Persistenzausnahme auftritt. Können Sie näher erläutern, welches Problem Sie lösen möchten? – Chris

Antwort

0

Sie können versuchen, UserTransaction.rollback mit der aktuellen Transaktion rückgängig zu machen.

+0

ich tue keine Transaktion beginne keine Transaktion Ende und keine comit, weil der Container dies tun und wie Sie oben sehen, injiziere ich den EntityManager von @PersistenceContext – Abdel

0

Da Sie einen "Container" verwenden. Ich nehme an, du meinst sowas wie wildfly, .. In diesem Fall gehe ich davon aus, dass du @Transactional irgendwo verwendest. Diese Annotation hat ein Attribut namens rollbackFor.

Wenn ich mich richtig erinnere, wird die Standardeinstellung für RuntimeExceptions nicht zurückgesetzt. Du könntest das vielleicht ändern.

Wenn Sie einen Rollback manuell durchführen müssen, verwenden Sie die UserTransaction. Sie sollten es bekommen können, über

public class SomeBean { 

    @Resource 
    private UserTransaction transaction; 
} 
+0

Ich benutze keine UserTransaction wo – Abdel

+0

Aber Sie müssen, wenn Sie wollen um die Transaktion zu kontrollieren. –

+0

Ich denke, es ist Juste injection der EntityManager über '@ PersistenceContext' die Sie sehen in meiner Methode persiste ich mein Objekt, dann mache ich einen Flush, dass alles was ich tue, und in meiner persistence.xml habe ich: transaction-type = "JTA" ' – Abdel

0
you can use transaction rollback support annotation : 

` @Transactional(propagation=Propagation.REQUIRED, rollbackFor=Exception.class) 
    public E persist(final E arg0) { 
    LOGGER.debug("persist : Begin"); 
    this.getEntityManager().persist(arg0); 
    this.getEntityManager().flush(); 
    LOGGER.debug("persist : End"); 
    return arg0;   
}` 
+0

' @Transactional (propagation.REQUIRED, rollbackFor = Exception.class) 'ist für Frühling? weil ich es nicht benutze und ich JPA und EJB und CDI benutze – Abdel

Verwandte Themen