# @DataJpaTest 进行测试的坑

**URL:** <https://www.isharkfly.com/t/datajpatest/14070>\
**Category:** 程序语言\
**Tags:** java, spring\
**Created:** [August 25, 2022, 12:29pm UTC](https://www.isharkfly.com/t/datajpatest/14070 "2022-08-25T12:29:08Z")\
**Posts on this page:** 1\
**Page:** 1

<div class="post-metadata">

**Author:** ![honeymoose](https://www.isharkfly.com/user_avatar/www.isharkfly.com/honeymoose/32/20796_2.png) [@honeymoose](https://www.isharkfly.com/u/honeymoose)\
**Post date:** [August 25, 2022, 12:29pm UTC](https://www.isharkfly.com/t/datajpatest/14070/1 "2022-08-25T12:29:08Z")

</div>

@DataJpaTest 这个注解主要用来在 Spring 项目中测试 JPA 数据源。

默认情况下，带有 @DataJpaTest 注解的测试使用嵌入式内存数据库。

因此 @DataJpaTest 这个注解还是有点坑的。

## 默认数据库

默认采用的是嵌入的 H2 数据库。

就算你配置了数据库链接，如果你不使用下面的注解的话，@DataJpaTest 还是会使用配置的默认数据库。

使用注解：

`@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)`

来让你的程序只使用你提供的数据库连接来进行连接。

## 事务

@DataJpaTest 具有事务性，会自动回滚插入数据。

如果你的不进行配置的话，你会发现你插入的数据没有办法在数据库中出现。

解决办法就是在方法中，提供 @Commit 注解。

 ![2022-08-25_08-21-32](https://cdn.isharkfly.com/com-isharkfly-www/discourse-uploads/original/2X/2/2c3666f2f7726b5836a444999e1328c94d3810e4.png)

然后再对数据库中的数据进行校验，这个时候数据是不会回滚的。

从日志中，我们也可以看到，插入的数据被回滚了。

 ![2022-08-25_08-22-17](https://cdn.isharkfly.com/com-isharkfly-www/discourse-uploads/original/2X/8/8f3acc589eeb84670f8ffc94c811afa2d895fd27.png)

当我们提供 Commit 这个注释后，在日志中明确的提示已经提交了。

 ![2022-08-25_08-23-40](https://cdn.isharkfly.com/com-isharkfly-www/discourse-uploads/original/2X/0/0ecaa50a2d33fc12284464dcc20ae34c6c5d350f.png)

## 表 hibernate\_sequence

这是因为我们在数据库实体类配置的时候，没有指定主键策略。

在默认情况使用的是 Auto。

如果使用 Auto，Hibernate 将会使用 Oracle 的方式来自增的。

如果需要使用 Mysql 的话，你的实体类需要将主键策略修改为：

`@GeneratedValue(strategy = GenerationType.IDENTITY)`

因为我们实体类使用了继承 AbstractPersistable。

 ![2022-08-25_08-27-28](https://cdn.isharkfly.com/com-isharkfly-www/discourse-uploads/original/2X/0/0ecaa50a2d33fc12284464dcc20ae34c6c5d350f.png)

因此我们可以通过修改 application.properties 来实现。

将参数设置为 false

`spring.jpa.hibernate.use-new-id-generator-mappings=false`

 ![2022-08-25_08-28-14](https://com-ossez-www-discourse.s3.dualstack.us-east-2.amazonaws.com/discourse-uploads/original/2X/e/ec3f51f4e729efd62edbf1ab75adc7c20159eb38.png)

这样就会对主键的策略进行修改了，我们就可以避免上面的这个问题了。
