java - Junit Hibernate 多次创建数据库模式

标签 java mysql spring hibernate junit

我正在开发一个 Java Spring+Hibernate 项目,我们有一个 Junit 设置,以便对我们的代码进行单元测试。 我现在面临的问题是,我不明白为什么 Hibernate(使用 Spring-boot)在测试实际运行之前创建数据库模式 2 次。顺序如下:

  1. 改变表删除所有外键
  2. 如果存在则删除表
  3. 创建表格
  4. 改变表添加约束(如 FK)
  5. 改变表删除所有外键
  6. 如果存在则删除表
  7. 创建表格
  8. 修改表添加约束
  9. 执行所有测试

我的问题是,如果更具体的话:为什么要执行第 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/

相关文章:

java - 为什么我们在程序中使用java持久化而不是jdbc连接

java - 如何以字符串形式打印数组列表的值?

java - 跟踪java应用程序中的特定请求和响应参数

Mysql 复制 : Duplicate Entry for Key 'primary' on query insert into select

java - eclipse和SVN添加jar文件

mysql - 在 Mysql 中,我如何计算连续空白单元格的数量

php - 如何使用php脚本将图像上传到数据库?

java - 如何解析大型复杂的xml

java - 使用 hibernate session /JDO persistenceManager 时的 ThreadLocal

java - 刷新页面时如何防止重复输入