Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/370.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Junit Hibernate多次创建数据库模式_Java_Mysql_Spring_Hibernate_Junit - Fatal编程技术网

Java Junit Hibernate多次创建数据库模式

Java Junit Hibernate多次创建数据库模式,java,mysql,spring,hibernate,junit,Java,Mysql,Spring,Hibernate,Junit,我正在从事一个JavaSpring+Hibernate项目,我们有一个Junit设置来对代码进行单元测试。 我现在面临的问题是,我不明白为什么Hibernate(使用SpringBoot)在测试实际运行之前创建了两次数据库模式。顺序如下: Alter tables删除所有外键 删除表(如果存在) 创建表 Alter tables添加约束(如FK) Alter tables删除所有外键 删除表(如果存在) 创建表 ALTERTABLES添加约束 执行所有测试 我的问题是,如果更具体一点的话:为什么

我正在从事一个JavaSpring+Hibernate项目,我们有一个Junit设置来对代码进行单元测试。 我现在面临的问题是,我不明白为什么Hibernate(使用SpringBoot)在测试实际运行之前创建了两次数据库模式。顺序如下:

  • Alter tables删除所有外键
  • 删除表(如果存在)
  • 创建表
  • Alter tables添加约束(如FK)
  • Alter tables删除所有外键
  • 删除表(如果存在)
  • 创建表
  • ALTERTABLES添加约束
  • 执行所有测试
  • 我的问题是,如果更具体一点的话:为什么要执行第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>
    

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

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

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

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

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

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

    在开始升级spring boot版本的过程后,发现了问题,我观察到一些奇怪的代码,以前没有告诉我任何事情。原因是在定义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");
    

    循环消失了

    在开始升级spring boot版本的过程后发现了问题,我发现一些奇怪的代码之前没有告诉我任何事情。原因是在定义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");
    

    循环消失了

    一,。我想让junit自己创建数据库,所以create是可以的。2.Spring boot徽标显示在所有1-9步之前,因此我想如果您对周期责任的看法是正确的,那么在显示徽标之后,这些徽标将混合显示。3.我使用validate来执行实际的应用程序(Debug-As、Run-As)4。关于删除哪个周期,取决于这里的2,如果可能的话,这也是我想要知道的区分和排除的内容。我现在没有子弹了,但我会把这个答案保留一段时间,以防它激发其他人给你一个完整的答案。1。我想让junit自己创建数据库,所以create是可以的。2.Spring boot徽标显示在所有1-9步之前,因此我想如果您对周期责任的看法是正确的,那么在显示徽标之后,这些徽标将混合显示。3.我使用validate来执行实际的应用程序(Debug-As、Run-As)4。关于删除哪个周期,取决于这里的2,如果可能的话,这也是我想要知道的区别和排除。我现在没有子弹了,但我会把这个答案留一点,以防它激发其他人给你一个完整的答案。