如何在使用@TransactionAttribute(TransactionAttributeType.SUPPORTS)注释调用组件之前创建事务?

时间:2015-11-17 10:24:10

标签: java-ee jpa jboss-arquillian

我想在预先存在的系统中使用arquillian,我正在创建第一个测试。 我调用DAO组件来设置测试数据,因此它尝试运行的第一个命令是:

DROP TABLE IF EXISTS ...

当代码执行

query.executeUpdate()

命令,我得到了

  

javax.persistence.TransactionRequiredException:执行   更新/删除查询

这是我的测试:

@RunWith(Arquillian.class)
@Transactional
public class MyFirstIT {

//  @Resource
//  private UserTransaction utx;

    @Before
    public void setup() throws Exception {
//      utx.begin();
    }

    @After
    public void commitTransaction() throws Exception {
//      utx.rollback();
    }

    @Inject
    private MyDAO myDAO;

    @Test
    public void myTest() throws IOException, SolrServerException {
        myDAO.setup();
    }

/* @Deployment ignored for brevity */
}

我的DAO定义如下:

@Stateless
@TransactionAttribute(TransactionAttributeType.SUPPORTS)
public class MyDAO 

我的依赖项:

<dependency>
    <groupId>org.jboss.arquillian.extension</groupId>
    <artifactId>arquillian-transaction-jta</artifactId>
    <version>1.0.2.Final</version>
</dependency>
<dependency>
    <groupId>org.jboss.arquillian.extension</groupId>
    <artifactId>arquillian-persistence-impl</artifactId>
    <version>1.0.0.Alpha6</version>
</dependency>
<dependency>
    <groupId>org.jboss.arquillian.junit</groupId>
    <artifactId>arquillian-junit-container</artifactId>
    <version>1.1.10.Final</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.wildfly</groupId>
    <artifactId>wildfly-arquillian-container-remote</artifactId>
    <version>8.1.0.Final</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.jboss.shrinkwrap.resolver</groupId>
    <artifactId>shrinkwrap-resolver-impl-maven</artifactId>
    <version>2.2.0</version>
    <scope>test</scope>
</dependency>

如您所见,我尝试使用arquillian-transaction-jta和@Transactional属性as described here

我也尝试创建自己的事务as described here,但没有工作,我收到相同的错误消息。

我认为问题在于DAO具有TransactionAttributeTyoe.SUPPORTS注释。有没有办法在调用DAO之前在测试中创建事务?

1 个答案:

答案 0 :(得分:3)

@TransactionAttribute(TransactionAttributeType.SUPPORTS)

这意味着事务将被传播但不会被创建。你应该在调用DAO方法之前启动一个。它可以是:

@RunWith(Arquillian.class)
public class MyFirstIT {

  @Inject
  private UserTransaction userTransaction;

  @Test
  public void myTest() throws IOException, SolrServerException {
    userTransaction.begin();
    myDAO.setup();
    userTransaction.commit();
  }
}

或者你可以切换到

@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)

在容器内启动新事务。或者使用:

@TransactionAttribute(TransactionAttributeType.REQUIRED)

只有在它没有来的时候才会创造。对于@Stateless bean,后一个是默认值(所以你可以完全避免使用注释),在大多数情况下,我说这是可取的方式