我使用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中的日期插入任何值?
答案 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);