2016-03-21 3 views
1

Я реализую миграцию бизнеса DTO с TomEE на JBoss.Transaction TransactionImple ActionStatus.ABORTED уже откат

У меня есть эта сущность:

@NamedQueries({ 
@NamedQuery(name = "common.plagebusiness.plage.getAllPlages", query = "SELECT p FROM Plage p ORDER BY p.plageRgMax, p.plageCReseau") }) 
@Entity 
@Table(name = "PLAGE") 
public class Plage { 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column(name = "idPlage") 
    private Integer idPlage; 

    @Column(name = "rgMin") 
    private String plageRgMin; 

С помощью этого интерфейса:

@Local 
public interface PlagePersistenceManager { 

public void importPlages(List<DetailFH55> listeEnregDetail) throws PlageBusinessException, ParseException; 

} 

И реализации:

@Stateless(name = "common.plagebusiness.PlagePersistenceManager") 
public class PlagePersistenceManagerImpl implements PlagePersistenceManager { 

    private static final Logger LOGGER = Logger.getLogger(PlagePersistenceManager.class); 

    @PersistenceContext(unitName = "PlageBusiness") 
    private EntityManager em; 

    @Override 
    public void importPlages(final List<DetailFH55> listeEnregDetail) throws PlageBusinessException, ParseException { 
     LOGGER.debug("Entree dans importPlages"); 

     if (null != listeEnregDetail) { 
      LOGGER.info("Debut Delete"); 

      // suppression des plages 
      this.deleteAllPlages(); 

      LOGGER.info("Fin Delete et Debut Insertion en bdd"); 

      for (final DetailFH55 myEnreg : listeEnregDetail) { 
       // insertion des nouvelles plages 
       final Plage plage = this.convertEnregDetailToPersist(myEnreg); 
       this.em.persist(plage); 
      } 

      LOGGER.info("Fin Insertion en bdd"); 
     } 

     LOGGER.debug("Sortie dans importPlages"); 

    } 
} 

К сожалению, em.persist не работает, я имел это освобождение:

Caused by: javax.transaction.RollbackException: JBAS014585: Transaction 'TransactionImple < ac, BasicAction: 0:ffff0a48268b:4bc8a0e:56f01b76:18 status: ActionStatus.ABORTED >' was already rolled back 

Я читал в форумах, что это было из-за времени, из-за Jboss. Я не хочу, чтобы изменить конфигурацию Jboss, поэтому я попытался, положив

@org.jboss.annotation.ejb.TransactionTimeout(10000000) 
public void importPlages(final List<DetailFH55> listeEnregDetail) throws PlageBusinessException, ParseException 

Все то же исключение ... что не так с этим кодом.

Метод deleteAllPlages содержит:

@Override 
public int deleteAllPlages() throws PlageBusinessException { 
    final Query query = this.em.createNativeQuery("DELETE FROM `PLAGE`"); 
    return query.executeUpdate(); 
} 

Я пытался поставить флеш() и ясно() после того, как сохраняются (флоккула), и до сих пор же исключение.

final Plage plage = this.convertEnregDetailToPersist(myEnreg); 
       this.em.persist(plage); 
       this.em.flush(); 
       this.em.clear(); 

Thxs.

+0

Что делает метод 'deleteAllPages()'? Возможно, транзакция была прервана там ... – metlos

+0

@metlos Я добавляю метод deleteAllPlages – Kikou

+0

@aribeiro Я прокомментировал функцию deleteAllPages, это тот же результат, такой же результат – Kikou

ответ

3

Я заметил, что вы используете org.jboss.annotation.ejb.TransactionTimeout вместо required EJB3 один: org.jboss.ejb3.annotation.TransactionTimeout.

В вашем POM, попробуйте заменить зависимость, которая ссылается Ваше текущее TransactionTimeout этим одним:

<dependency> 
    <groupId>org.jboss.ejb3</groupId> 
    <artifactId>jboss-ejb3-ext-api</artifactId> 
    <version>2.2.0.Final</version> 
    <scope>provided</scope> 
</dependency> 

Затем вы можете указать значение и единицы измерения:

@TransactionTimeout(value = 10, unit = TimeUnit.SECONDS). 

Вы можете найти related issue на Форум JBoss.

+0

Thxs хорошо работает с этой аннотацией. – Kikou