我正在使用initial.sql
创建数据库<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="hibernate.connection.driver_class">com.mysql.cj.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3310/mydb?createDatabaseIfNotExist=true&autoReconnect=true&useSSL=false</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">qet</property>
<property name="format_sql">true</property>
<property name="hibernate.hbm2ddl.import_files_sql_extractor">org.hibernate.tool.hbm2ddl.MultipleLinesSqlCommandExtractor</property>
<property name="hibernate.hbm2ddl.auto">create</property>
<property name="hibernate.hbm2ddl.import_files">/database/initial.sql</property>
它工作得很完美,但现在的问题是我有数据库,但是当我重新启动应用程序时,它会插入更多数据。
如何检查架构是否已存在,不执行任何操作。 我只想创建数据库,如果它没有任何表/不存在...
答案 0 :(得分:0)
尝试切换属性以进行更新
<property name="hibernate.hbm2ddl.auto">update</property>
Create每次都会重新创建它,并且只有在它不存在时才更新它。标准值可以在这里看到:
https://docs.jboss.org/hibernate/orm/5.0/manual/en-US/html/ch03.html
同样从同一参考文献中我们可以看到,只有当hbm2ddl为create或create-drop时才会执行导入文件
文件顺序很重要,之前执行给定文件的语句 以下文件的陈述。这些陈述只是 如果创建了模式,则执行,即如果设置了hibernate.hbm2ddl.auto 创建或创建 - 删除。
如果您希望执行 initial_sql ,可以将其保留为create,并且可以使该SQL具有正确的命令,如果已经执行则不会更改状态。与DROP TABLE IF EXISTS
,CREATE TABLE IF NOT EXISTS
等相同。对于插入,它有点复杂但您仍然可以通过insert into table join the same table where value is not found
这不是完美的解决方案,因为如果你有从注释类创建的表,它们将被重新创建。我认为您应该考虑另一种设计或使用hibernate.hbm2ddl.auto =在第一次部署时创建然后将其更改为手动更新