gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 11:23:04 24 4
gpt4 key购买 nike

我使用 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());
}

最后一个 log.info 在使用 @Transactional 注释运行时抛出 NullPointerException,但否则工作正常,数据库会填充预期值。

这是 @Transactional 的行为方式还是 Hibernate 不会在事务性 JUnit 中插入任何日期值?

最佳答案

因为您在类上使用@Transactional注释,所以您的所有更改都不会提交到数据库中。 @CreationTimestamp 和“@Temporal(TemporalType.TIMESTAMP)”在提交更改之前不会起作用。

你可以做什么:

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

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

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

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

关于java - @Temporal 注释与 @Transactional JUnit 测试一起使用时不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44698507/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com