2014-11-10 3 views
0

Я вышеупомянутую EJB:EJB сделка не откат

@Stateless 
public class ItilEJB { 
    @PersistenceContext 
    protected EntityManager em; 

    public <T> T find(Class<T> clazz, Long id) { 
     if (clazz == null || id == null) { 
      return null; 
     } 

     return em.find(clazz, id); 
    } 


public Chamado atender(Long chamadoId) { 

     Chamado chamado = find(Chamado.class, chamadoId); 

     if (!isChamadoAtendido(chamadoId)) { 
      Status emAndamento = new Status(Status.EM_ANDAMENTO); 

      HistoricoChamado historico = new HistoricoChamado(); 
      historico.setDescricao("Início do atendimento do chamado."); 
      historico.setChamado(chamado); 
      historico.setStatus(emAndamento); 
      historico.setSla(chamado.getSla()); 

      chamado.setStatus(emAndamento); 

      save(historico); 

      save(chamado); 
     } 

     return chamado; 
    } 

public void save(BaseEntity entity) { 

     if (entity.getId() == null) { 
      if (!helper.canInsert(this, entity)) { 
       throw new AlertMessageRuntimeException("user.db.constraint"); 
      } 
      em.persist(entity); 
     } else { 
      if (!helper.canUpdate(this, entity)) { 
       throw new AlertMessageRuntimeException("user.db.constraint"); 
      } 
      em.merge(entity); 
     } 
    } 

} 

Если мой второй сохранить, сохранить (chamado); бросает одно исключение (обе время выполнения или нет), первое сохранение не откат, я не могу понять, почему. Для меня каждый вызов EJB будет инкапсулироваться в одну транзакцию, и если произойдет Исключение, все взаимодействие с уровнем БД будет отброшено назад.

Как это осуществить? Если мое второе сохранение вызывает ошибку, я хочу, чтобы первое действие сохранения было отменено.

Благодаря


Я использую MySQL в качестве СУБД и Wildfly 8.1 в качестве сервера приложений. Я не изменил никаких настроек по умолчанию, поэтому я не думаю, что режим автоматической фиксации включен.

<?xml version="1.0" encoding="UTF-8"?> 
<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="primary"> 
     <provider>org.hibernate.ejb.HibernatePersistence</provider> 
     <jta-data-source>java:jboss/datasources/MySQLDS</jta-data-source> 

     <properties> 
      <property name="hibernate.show_sql" value="true" /> 
     </properties> 
    </persistence-unit> 
</persistence> 

Это моя конфигурация DataSource в standalone.xml

<datasource jndi-name="java:jboss/datasources/MySQLDS" enabled="${mysql.enabled}" use-java-context="true" pool-name="MySQLDS" use-ccm="true"> 
        <connection-url>jdbc:mysql://${env.OPENSHIFT_MYSQL_DB_HOST}:${env.OPENSHIFT_MYSQL_DB_PORT}/${env.OPENSHIFT_APP_NAME}</connection-url> 
        <driver>mysql</driver> 
        <security> 
         <user-name>${env.OPENSHIFT_MYSQL_DB_USERNAME}</user-name> 
         <password>${env.OPENSHIFT_MYSQL_DB_PASSWORD}</password> 
        </security> 
        <validation> 
         <check-valid-connection-sql>SELECT 1</check-valid-connection-sql> 
         <background-validation>true</background-validation> 
         <background-validation-millis>60000</background-validation-millis> 
         <!--<validate-on-match>true</validate-on-match>--> 
        </validation> 
        <pool> 
         <flush-strategy>IdleConnections</flush-strategy> 
        </pool> 
       </datasource> 
+0

Его следует откинуть назад. Какие СУБД вы используете? И как настроен блок персистентности? Единственная причина, по которой он должен потерпеть неудачу, - это активировать какой-то режим автоматической фиксации. – Gimby

+0

Возможно, у вас есть дескриптор развертывания? Возможно ли переопределить TransactionAttribute для вашего метода сохранения в дескрипторе? – jjd

ответ

1

Если вы случайно используете JBoss существует высокая вероятность того, что datasoruce неправильно определить не используйте транзакции JTA. Проверьте, есть ли у вас <datasource jta="true" .. в конфигурации JBoss. Для получения дополнительной информации проверьте Transactions don't rollback

+0

Привет, газ, спасибо! Это правда, я добавил определение моего источника данных в файле standalone.xml и не имел атрибута jta = "true". Я попробую сейчас с добавлением. –

0

Вы не говоря уже о том, как сохранить() метод был определен. Если он использует BMP, он не может присоединяться к транзакциям из CMP, таких как atender().

Если нет, то попробуйте следующее:

За atender (Long chamadoId) положить аннотацию @TransactionAttribute (TransactionAttributeType.REQUIRED). И по определению метода сохранения() поставить эту аннотацию @TransactionAttribute (TransactionAttributeType.MANDATORY)

надежду, что помощь

+0

Спасибо за ваш ответ! Я думаю, что у меня есть, посмотрите немного на вопрос. –

+0

Извините, я не заметил слайдер. Однако вы можете попробовать мое второе предложение. Я прочитал, что тип атрибута REQUIRED не всегда переведен для присоединения к транзакции, если он существует, и иногда он создает новую транзакцию, как если бы был определен атрибут REQUIRES_NEW. Честно говоря, я не могу вспомнить, где я нашел это, но у меня была схожая проблема с твоей; Однако попытайтесь использовать вторую часть моего предыдущего ответа, это должно заставить метод save() не запускать новую транзакцию и присоединиться к транзакции вызывающего. Кроме того, попробуйте –

Смежные вопросы