찾다

 >  Q&A  >  본문

java - Spring + Hibernate + JPA 在 JUnitTest 时, 不发出insert语句

单元的测试方法为:

@Test
@Transactional(propagation=Propagation.REQUIRED)
@Rollback
public void test() {
    userCreateService.saveUsers(2392L, "@abc.com", true, "A", new Long[]{129L, 1L, 2L, 131L, 4L}, 5);
}

设置了事务, 进入了方法里面, 调用javax.persistence.EntityManager.persist()方法都是不提交insert语句.

发个例子说明一下:

我想要插入一个user到数据库, 然后立刻把他的OPENID字段使用Oracle的sys_guid()函数来生成, 所以persist后, 调用本地查询语句来修改.
发现修改语句一直说修改了0个结果, 我查了一下Hibernate的SQL语句输出, 发现没有发出过insert语句. 这是为何呢?

请各位大神帮忙...............

高洛峰高洛峰2803일 전850

모든 응답(2)나는 대답할 것이다

  • 大家讲道理

    大家讲道理2017-04-17 17:42:40

    으아악

    회신하다
    0
  • 黄舟

    黄舟2017-04-17 17:42:40

    参考:

    TestContext 프레임워크는 이 문제를 해결합니다. 기본적으로 프레임워크는 각 테스트에 대해 트랜잭션을 생성하고 롤백합니다. 트랜잭션이 존재한다고 가정할 수 있는 코드를 작성하기만 하면 됩니다. 테스트에서 트랜잭션으로 프록시된 개체를 호출하면 해당 개체는 트랜잭션 의미에 따라 올바르게 작동합니다. 또한 테스트 메서드가 트랜잭션 내에서 실행되는 동안 선택된 테이블의 내용을 삭제하면 기본적으로 트랜잭션이 롤백되고 데이터베이스는 테스트 실행 전 상태로 돌아갑니다. 테스트의 애플리케이션 컨텍스트에 정의된 PlatformTransactionManager 빈을 통해 테스트 클래스에 트랜잭션 지원이 제공됩니다.

    트랜잭션을 커밋하려는 경우(비정상적이지만 데이터베이스를 채우거나 수정하기 위해 특정 테스트를 원할 때 가끔 유용함) TestContext 프레임워크는 @TransactionConfiguration을 통해 롤백하는 대신 트랜잭션이 커밋되도록 지시할 수 있으며 @Rollback 주석.

    회신하다
    0
  • 취소회신하다