休眠检查数据库是否存在

时间:2018-04-20 09:53:07

标签: java hibernate

我正在使用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&amp;autoReconnect=true&amp;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>

它工作得很完美,但现在的问题是我有数据库,但是当我重新启动应用程序时,它会插入更多数据。

如何检查架构是否已存在,不执行任何操作。 我只想创建数据库,如果它没有任何表/不存在...

1 个答案:

答案 0 :(得分:0)

尝试切换属性以进行更新

<property name="hibernate.hbm2ddl.auto">update</property>

Create每次都会重新创建它,并且只有在它不存在时才更新它。标准值可以在这里看到:

https://docs.jboss.org/hibernate/orm/5.0/manual/en-US/html/ch03.html

  • 验证:验证架构
  • 更新:如果有更改则更新,如果不存在则创建
  • 创建:从头开始重新创建
  • create-drop:创建它,然后在会话工厂关闭时删除它

同样从同一参考文献中我们可以看到,只有当hbm2ddl为create或create-drop时才会执行导入文件

  

文件顺序很重要,之前执行给定文件的语句   以下文件的陈​​述。这些陈述只是   如果创建了模式,则执行,即如果设置了hibernate.hbm2ddl.auto   创建或创建 - 删除。

如果您希望执行 initial_sql ,可以将其保留为create,并且可以使该SQL具有正确的命令,如果已经执行则不会更改状态。与DROP TABLE IF EXISTSCREATE TABLE IF NOT EXISTS等相同。对于插入,它有点复杂但您仍然可以通过insert into table join the same table where value is not found

执行此操作

这不是完美的解决方案,因为如果你有从注释类创建的表,它们将被重新创建。我认为您应该考虑另一种设计或使用hibernate.hbm2ddl.auto =在第一次部署时创建然后将其更改为手动更新