我正在开发一个 Java Spring+Hibernate 项目,我们有一个 Junit 设置,以便对我们的代码进行单元测试。 我现在面临的问题是,我不明白为什么 Hibernate(使用 Spring-boot)在测试实际运行之前创建数据库模式 2 次。顺序如下:
- 改变表删除所有外键
- 如果存在则删除表
- 创建表格
- 改变表添加约束(如 FK)
- 改变表删除所有外键
- 如果存在则删除表
- 创建表格
- 修改表添加约束
- 执行所有测试
我的问题是,如果更具体的话:为什么要执行第 3-6 点? 为什么干脆不执行 1,2,7,8,9。我为什么要这个?因为这需要宝贵的时间,而且我不明白我为什么需要这个。
下面是我的持久化配置:
<persistence-unit name="localContainerEntityForTest">
<description>Spring JPA LocalContainerEntityManagerFactoryBean</description>
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<properties>
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/>
<property name="hibernate.hbm2ddl.auto" value="create"/>
<property name="hibernate.implicit_naming_strategy" value="legacy-jpa"/>
<property name = "hibernate.show_sql" value = "true" />
<property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/>
<property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost/myApp?createDatabaseIfNotExist=true"/>
<property name="javax.persistence.jdbc.user" value="hibernate"/>
<property name="javax.persistence.jdbc.password" value="password"/>
</properties>
</persistence-unit>
此外,下面是我为每个单元测试类使用的注释:
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = JPAConfigurationTestEnviorement.class)
@WebAppConfiguration
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
最佳答案
我对 Hibernate 相当熟悉,但对 Spring Boot 不太熟悉。我的猜测是 Hibernate 直接负责一个 create-alter-drop 循环,而 Spring Boot 负责另一个。如果您在道德上反对您当前的设置,那么您可以尝试将您的 Hibernate XML 更新为以下内容:
<property name="hibernate.hbm2ddl.auto" value="validate"/>
通过选择validate
选项,您指示 Hibernate 仅验证您现有的模式,而不创建或删除任何表。这里的诀窍是我不确定您要删除两个循环中的哪一个(您也没有告诉我们)。
关于java - Junit Hibernate 多次创建数据库模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36843709/