gpt4 book ai didi

java - Hibernate + H2 数据库 + SpringBoot : Pre-existing tables in database are always dropped & re-created upon start, 即使对于 hbm2ddl = 验证

转载 作者:太空宇宙 更新时间:2023-11-04 11:42:22 26 4
gpt4 key购买 nike

我在正确设置数据库方面遇到问题。我观察到的行为正是我所期望的“hbm2ddl.auto = create-drop”或“ddl-auto = create-drop”。但是,我明确设置“hbm2ddl.auto = validate”并删除了 ddl-auto (并尝试了这两者的所有其他组合并验证),但仍然获得与“create-drop”相同的行为。

首先,我想要什么:

  • 我想存储数据,假设将“MachineData”存储在 h2 数据库中。
  • 我想使用 h2 接口(interface)上传一次数据在浏览器中(或使用 import.sql 文件)。
  • 应用程序将使用数据库中的数据,但不会修改任何东西

我的问题:

  • 我通过 H2 接口(interface)手动创建表“MachineData”并使用sql语句加载一些数据(见下文)。
  • 但是,当我启动应用程序时,我手动创建的“MachineData”表创建并填充的数据被删除。
  • 如果我提供了 import.sql 文件,则会重新创建表和数据。当应用程序完成时,表将再次被删除。因此,我的数据库是空的,但应用程序可以运行。
  • 如果我不提供 import.sql 文件,应用程序将抛出一个错误错误,因为表格不存在。
  • 我尝试了 hibernate.ddl-auto = validate 的所有可能组合和/或/hibernate.hbm2ddl.auto = 验证。然而结果依然相同:表总是在应用程序启动期间删除。

更新(1):更新(2):

我的数据库是使用@Configuration配置的:

@Configuration
public class DatabaseConfig {

private final Environment env;

@Autowired
public DatabaseConfig(Environment env) {
this.env = env;
}

@Bean
public DataSource dataSource() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName(env.getProperty("datasource.driver"));
dataSource.setUrl(env.getProperty("datasource.url"));
dataSource.setUsername(env.getProperty("datasource.username"));
dataSource.setPassword(env.getProperty("datasource.password"));
return dataSource;
}

@Bean
public LocalSessionFactoryBean sessionFactory() {
LocalSessionFactoryBean sessionFactoryBean = new LocalSessionFactoryBean();
sessionFactoryBean.setDataSource(dataSource());
sessionFactoryBean.setPackagesToScan(env.getProperty("entitymanager.packagesToScan"));
Properties hibernateProperties = new Properties();
hibernateProperties.put("hibernate.dialect", env.getProperty("jpa.hibernate.dialect"));
hibernateProperties.put("hibernate.show_sql", env.getProperty("jpa.show-sql"));
hibernateProperties.put("spring.jpa.generate-ddl", env.getProperty("jpa.generate-ddl"));
sessionFactoryBean.setHibernateProperties(hibernateProperties);
return sessionFactoryBean;
}

@Bean
public HibernateTransactionManager transactionManager() {
HibernateTransactionManager transactionManager = new HibernateTransactionManager();
transactionManager.setSessionFactory(sessionFactory().getObject());
return transactionManager;
}

@Bean
public PersistenceExceptionTranslationPostProcessor exceptionTranslation() {
return new PersistenceExceptionTranslationPostProcessor();
}

}

我使用 .yaml 作为 hibernate 属性:更新:

spring.profiles: run_GA
datasource:
driver: org.h2.Driver
url: jdbc:h2:tcp://localhost/C:/Users/User/Document/MLDB;DB_CLOSE_DELAY=-1
username: sa
password:
jpa:
show-sql: false
generate-ddl: true
hibernate.dialect: org.hibernate.dialect.H2Dialect
entitymanager.packagesToScan: somePath.mapping

关于映射,我使用以下类:

@Entity
@Table
public class Machinedata {

public int timeInCycles;
public double sensor01;

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "timeincycles")
public int getTimeInCycles() {
return timeInCycles;
}

public void setTimeInCycles(int timeInCycles) {
this.timeInCycles = timeInCycles;
}

@Column(name = "sensor01")
public double getSensor01() {
return sensor01;
}

public void setSensor01(double sensor01) {
this.sensor01 = sensor01;
}

当我在h2数据库中手动创建表时,我使用以下sql命令:

CREATE TABLE MACHINEDATA(Time IDENTITY AUTO_INCREMENT, sensor01 DOUBLE);
INSERT INTO Machinedata SELECT * FROM CSVREAD('myPath.csv');

import.sql 文件显示以下命令:

INSERT INTO Machinedata (timeincycles, sensor01) SELECT * FROM CSVREAD('myPath.csv');

如果我设置 hbm2ddl.auto = create-drop,我会期望所描述的行为。但是,正如我上面提到的,在我的情况下, hbm2ddl.auto = validate 。您知道我的代码有什么问题吗?非常感谢您提前提供的帮助。

最佳答案

尝试删除以下配置...

hibernate.ddl-auto: validate  
hibernate.hbm2ddl.auto: validate

...只需使用此 spring 配置即可,类上的任何更新或更改都只会更新当前的配置。

spring.jpa.generate-ddl=true

关于java - Hibernate + H2 数据库 + SpringBoot : Pre-existing tables in database are always dropped & re-created upon start, 即使对于 hbm2ddl = 验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42660095/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com