Junit Hibernate多次创建数据库模式

时间:2016-04-25 14:37:47

标签: java mysql spring hibernate junit

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

  1. 更改表格删除所有外键
  2. 删除表(如果存在)
  3. 创建表格
  4. 更改表格添加约束(如FK)
  5. 更改表格删除所有外键
  6. 删除表(如果存在)
  7. 创建表格
  8. 更改表格添加约束
  9. 执行所有测试
  10. 我的问题是,如果更具体:为什么要点3-6包括执行? 为什么不执行1,2,7,8,9。我为什么要这个?因为这需要宝贵的时间,我不明白为什么我需要这个。

    以下是我的持久性配置:

    class MainWindow(QMainWindow):
    
        def __init__(self):
    
            super().__init__()
    
            self.initMenu()
            self.show()
    
        def initMenu(self):
    
            # load ui file
            uic.loadUi("somefile.ui", self)
    
            # add pushbutton
            btn = QPushButton()
    
            # add click listener
            btn.clicked.connect(self.startLevel)
    
            # add button to layout
            self.layout_buttons.addWidget(btn)
    
        def startLevel(self):
    
            # open game, put the right code in here :D
            pass
    
    if __name__ == "__main__":
        app = QApplication(sys.argv)
        ex = MainWindow()
    
        sys.exit(app.exec_())
    

    另外,下面是我用于每个单元测试类的注释:

    <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>
    

2 个答案:

答案 0 :(得分:0)

我对Hibernate非常熟悉,但使用Spring Boot则不太熟悉。我的猜测是Hibernate直接负责一个create-alter-drop循环,Spring Boot负责另一个。如果您在道德上反对当前的设置,那么您可以尝试将Hibernate XML更新为以下内容:

<property name="hibernate.hbm2ddl.auto" value="validate"/>

通过选择validate选项,您指示Hibernate仅验证现有架构,而不是创建或删除任何表。这里的诀窍是我不确定你要删除的两个周期中的哪一个(你也没告诉我们)。

答案 1 :(得分:0)

问题发现,在启动升级弹簧启动版本的过程后,我发现了一些以前没有告诉我的奇怪代码。原因是在定义LocalContainerEntityManagerBean之前创建了EntityManagerFactory:

@Bean
public LocalContainerEntityManagerFactoryBean getEntityManagerFactoryBean() {
    Persistence.createEntityManagerFactory("localContainerEntityForTest");

    LocalContainerEntityManagerFactoryBean lcemfb = new LocalContainerEntityManagerFactoryBean();
    lcemfb.setPersistenceUnitName("localContainerEntityForTest");
    lcemfb.setPackagesToScan("com.mybasepackage");
    lcemfb.setPersistenceXmlLocation("classpath:/META-INF/persistence.xml");

    return lcemfb;
}

删除该行后:

Persistence.createEntityManagerFactory("localContainerEntityForTest");
周期消失了。