Java Junit Hibernate多次创建数据库模式
我正在从事一个JavaSpring+Hibernate项目,我们有一个Junit设置来对代码进行单元测试。 我现在面临的问题是,我不明白为什么Hibernate(使用SpringBoot)在测试实际运行之前创建了两次数据库模式。顺序如下: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添加约束 执行所有测试 我的问题是,如果更具体一点的话:为什么
<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,如果可能的话,这也是我想要知道的区别和排除。我现在没有子弹了,但我会把这个答案留一点,以防它激发其他人给你一个完整的答案。