1

我使用 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,但否则工作正常,并且 DB 会填充预期值。

这是 @Transactional 的行为方式还是 Hibernate 没有在事务性 JUnit 中为 Dates 插入任何值?

4

1 回答 1

0

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

你可以做什么:

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

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

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

entityRepository.save(entity);
entityRepository.flush();
Entity savedEntity = entityRepository.findOne(id);
于 2017-06-22T12:02:16.387 回答