2016-03-30 4 views
2

Я использую JPA, и у меня есть абстрактный класс, где я вставляю свой entityManager, и у меня есть общий метод, когда я сохраняю свой проект в базе данных, и во всем классе моих служб этот абстрактный класс расширяется, но проблема в том, что иногда мне приходится сохраняйте данные клиента и клиента, но если у меня есть исключение в отношении клиента, то моя программа сохраняется в клиентских деталях, поэтому я смотрю на rollBack для вызова, когда у меня есть исключение persist.Как переложить транзакцию EntityManager, введенной @PersistenceContext?

Я знаю, что могу делать entityManager.getTransaction().rollback();, но если я управляю менеджером сущности, но в моем случае он управляется контейнером.

Вот моя абстрактный класс:

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: у меня есть JBoss EAP6 в качестве сервера

+0

ли весна, которая впрыскивает в EntityManager? Но тогда просто бросать «RuntimeException» следует отменить транзакцию. Разве это не происходит? –

+0

Любой контейнер будет откатывать транзакцию при возникновении исключения, и большинству провайдеров персистентности требуется JPA, чтобы отметить транзакцию для отката при возникновении исключения для сохранения. Можете ли вы подробнее узнать о том, какую проблему вы хотите решить? – Chris

ответ

0

Вы можете попробовать использовать UserTransaction.rollback откат текущей транзакции.

+0

Я не делаю никаких транзакций, не начинаю конца транзакции и не коммит, потому что контейнер делает это, и, как вы видите выше, я вставляю entityManager @PersistenceContext – Abdel

0

Поскольку вы используете «контейнер». Я предполагаю, что вы имеете в виду что-то вроде wildfly, ... В этом случае я предполагаю, что вы используете @Transactional где-то. Эта аннотация имеет атрибут rollbackFor.

Если я правильно помню, настройка по умолчанию не откат для RuntimeExceptions. Поэтому вы можете изменить это.

Если вам необходимо вручную отменить использование UserTransaction. Вы должны быть в состоянии получить его через

public class SomeBean { 

    @Resource 
    private UserTransaction transaction; 
} 
+0

. Я не использую UserTransaction где-нибудь – Abdel

+0

Но вы должны, когда захотите для контроля транзакции. –

+0

Я думаю, что juste вводит сущностьManager через '@ PersistenceContext', как вы видите в моем методе, я сохраняю свой объект, тогда я делаю флеш, что все, что я делаю, и в моем persistence.xml у меня есть:' тип транзакции = "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 (распространение = распространение.REQUIRED, rollbackFor = Exception.class) 'для Spring? потому что я не использую его, и я использую JPA и EJB и CDI – Abdel