我正在通过Spring Boot在Java应用程序中使用嵌入式H2。当前,它在数据库中创建(覆盖)表。但是一旦我将其推向生产
我不希望我的表被擦除并重新创建,因此我不会丢失表中的先前数据。但是我不确定如何实现这一目标。不知道在行spring.jpa.hibernate.ddl-auto=create
上要放什么。我尝试验证和其他选项,但没有解决。这是我的application.properties。谢谢
spring.jpa.generate-ddl=true
spring.jpa.hibernate.ddl-auto=create
spring.jpa.properties.hibernate.show_sql=true
spring.jpa.properties.hibernate.use_sql_comments=true
spring.jpa.properties.hibernate.format_sql=true
spring.datasource.initialization-mode=always
spring.jpa.hibernate.naming.physical-
strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
答案 0 :(得分:0)
您应该在此处使用更新:
spring.jpa.hibernate.ddl-auto=update
如果尚未定义表,则将在启动时构建表,否则将保留它们。
同样,当您这样做时,您可能希望删除该行:
spring.jpa.generate-ddl=true
最后,执行此操作的最佳方法是为不同的环境提供不同的属性集,方法是将它们作为运行时变量传入,或者理想情况下使用诸如spring config server之类的方法将其外部化。
答案 1 :(得分:0)
您可以显式设置spring.jpa.hibernate.ddl-auto,标准的Hibernate属性值为无,验证,更新,创建和创建拖放
Spring Boot根据是否认为您的数据库已嵌入为您选择默认值。如果未检测到模式管理器,或者在所有其他情况下均未检测到模式管理器,则默认为create-drop。通过查看连接类型可以检测到嵌入式数据库。 hsqldb,h2和derby是嵌入式的,其他则不是。从内存数据库转换为“真实”数据库时,请务必不要假设新平台中表和数据的存在。您必须显式设置ddl-auto或使用其他机制之一来初始化数据库
以下情况可能对您适用:
更新:
例如,更新操作将尝试添加新的列,约束等,但绝不会删除以前可能存在但不再作为先前运行的对象模型一部分的列或约束。
无
:在生产中,通常强烈建议您不使用或根本不指定此属性。这是因为DBA通常会检查迁移脚本以进行数据库更改,尤其是在多个服务和应用程序共享数据库的情况下。
此外,如果Hibernate从头开始创建架构(即,如果ddl-auto属性设置为create),则在启动时会在类路径的根目录中执行名为 import.sql 的文件。或create-drop)。如果您小心的话,这对于演示和测试很有用,但可能不希望出现在生产环境的类路径中。这是一个Hibernate功能(与Spring无关)。
答案 2 :(得分:0)
我在下一行丢失了。
spring.jpa.hibernate.ddl-auto=update