我正在开发Java Spring + Hibernate项目,我们有一个Junit设置,以便对我们的代码进行单元测试。 我现在遇到的问题是我不明白为什么Hibernate(使用Spring-boot)在测试实际运行之前创建数据库模式2次。顺序如下:
我的问题是,如果更具体:为什么要点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>
答案 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");
周期消失了。