Java H2数据库时间戳列的默认值

Java H2数据库时间戳列的默认值,java,jpa,h2,Java,Jpa,H2,我正在用H2数据库编写集成测试。 我的数据库(生成的)初始化包括此脚本(因为生成的联接表没有此列): 这就是我创建记录的方式: Integration integrationOne = createIntegration(firstId, "FIRST"); Integration integrationTwo = createIntegration(secondId, "SECOND"); flushAndClear(); userService.logRecentIntegration(in

我正在用H2数据库编写集成测试。 我的数据库(生成的)初始化包括此脚本(因为生成的联接表没有此列):

这就是我创建记录的方式:

Integration integrationOne = createIntegration(firstId, "FIRST");
Integration integrationTwo = createIntegration(secondId, "SECOND");
flushAndClear();
userService.logRecentIntegration(integrationOne.getId(), user.getId());
flushAndClear();
userService.logRecentIntegration(integrationTwo.getId(), user.getId()); //1
logRecentIntegrations(..,..)方法只调用DAO,DAO执行以下操作:

Query query = entityManager.createNativeQuery(
    "INSERT INTO INT_USR (USR_ID, INT_ID) VALUES (?, ?)");
query.setParameter(1, userId)
    .setParameter(2, integrationId);
query.executeUpdate();
稍后在我的测试中:

Query query = entityManager.createNativeQuery(
    "SELECT * FROM INT_USR ORDER BY IU_INSDTTM");
List resultList = query.getResultList();
当我在resultList中调试此测试时,有两条记录(正确),但它们具有相同的时间戳。即使我在标记为//1的行上插入断点并等待了一段时间,插入之间的时间间隔也会很大。(Thread.sleep-相同结果)

我试图将SQL脚本修改为

ALTER TABLE INT_USR ADD IU_INSDTTM TIMESTAMP DEFAULT CURRENT_TIMESTAMP;

但结果是一样的。为什么两个结果都有相同的时间戳?

如文件所述,在事务中总是返回相同的值。此行为与其他数据库相匹配,例如PostgreSQL。

您可以在测试中添加以下注释以禁用事务

@事务(传播=传播。从不)


注意:该注释来自Spring,您运行的环境可能还有其他内容。

注意,如果您正在生成hibernate pojo,您也可以使用
CreationTimestamp
。我只是试了一下,它似乎奏效了

  @CreationTimestamp
  protected LocalDateTime createdDate;

@Service@Transactional公共类userserviceinmpl实现UserService{…public void logrecententigration(Long integrationId,Long userId){}
所以对该方法的每次调用都在不同的事务中,不是吗?我不知道,我对JPA不是很熟悉。但我熟悉H2:-)@DominikM不,不是。默认传播级别为'@Transactional',这意味着:如果没有事务,则启动一个新的事务。如果存在,则使用该事务。我知道,您称之为from测试,它是单个事务。
  @CreationTimestamp
  protected LocalDateTime createdDate;