与@Transactional JUnit测试一起使用时,@ Temporal注释不起作用

时间:2017-06-22 11:46:22

标签: java oracle11g jpa-2.0 junit4 spring-boot-test

我使用Spring Boot和Oracle 11g进行简单的CRUD操作 我的实体类看起来像:

public class Entity{
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private int entity_id;
...
@CreationTimestamp
@Column(name = "creation_date", columnDefinition="ON UPDATE CURRENT_TIMESTAMP")
@Temporal(TemporalType.TIMESTAMP)
private Date creation_date;

...//setters and getters
}

我的JUnit看起来像

@RunWith(SpringRunner.class)
@SpringBootTest
@Transactional
public class EntityTests {
Logger log = Logger.getAnonymousLogger();

@Autowired
private EntityRepository  entityRepository;

@Test
public void addEntity(){
    Entity entity= new Entity();
    entity.setFirst_name("Jhon");
    entity.setLast_name("David");
    Entity savedEntity = entityRepository.save(entity);
    log.info(savedEntity.toString());
    Assert.assertEquals(entity, savedEntity);
    //log.info(savedEntity.getCreation_date().toString());
}

当使用@Transactional注释运行时,最后一个log.info抛出NullPointerException,但是否则工作正常,并且DB会填充预期值。

这是@Transactional的行为,还是Hibernate没有为事务JUnits中的日期插入任何值?

1 个答案:

答案 0 :(得分:0)

因为您在类上使用@Transactional注释,所有更改都不会提交到DB中。在提交更改之前,@CreationTimestamp和`@Temporal(TemporalType.TIMESTAMP)将无效。

你能做什么:

不要在使用DB的功能测试中使用@Transactional。如果删除了注释,则在方法结束后不会回滚您的方法,因此您必须创建@After方法来清理测试创建的内容:

@After
public void cleanUp() {
    entityRepository.deleteAll();
}

第二个选项是将保存方法更改为saveAndFlush。您也可以在通过调用entityRepository.flush()方法保存实体后执行此操作,但此处您必须再次从存储库中获取实体:

entityRepository.save(entity);
entityRepository.flush();
Entity savedEntity = entityRepository.findOne(id);