PostgreSQL + Hibernate + Spring自动创建数据库

我正在使用PostgreSQL和Spring 4,希望我的应用程序在运行时自动创建数据库。

我的实体类是:

@Entity @Table(name = "user", schema = "public") public class User extends BaseEntity { private Integer id; private String name; private Integer contractId; public User() { } public User(Integer id) { super(id); } @Id @Column(name = "usr_id", nullable = false) @GeneratedValue(strategy= GenerationType.IDENTITY) public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } @Basic @Column(name = "usr_name", nullable = true, length = -1) public String getName() { return name; } public void setName(String name) { this.name = name; } @Basic @Column(name = "usr_contract_id", nullable = true) public Integer getContractId() { return contractId; } public void setContractId(Integer contractId) { this.contractId = contractId; } } 

HibernateConfig.java

 @Configuration @EnableTransactionManagement(proxyTargetClass = true) @PropertySources({ @PropertySource(value = "classpath:application.properties")}) @ConfigurationProperties(prefix = "spring.datasource") public class HibernateConfig { @Autowired private Environment environment; @Autowired private DataSource dataSource; @Autowired private MultiTenantConnectionProvider multiTenantConnectionProvider; @Autowired private CurrentTenantIdentifierResolver currentTenantIdentifierResolver; public HibernateConfig() {} @Bean public LocalSessionFactoryBean sessionFactory() throws Exception { LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean(); sessionFactory.setDataSource(dataSource); sessionFactory.setHibernateProperties(hibernateProperties()); sessionFactory.setPackagesToScan(new String[] { "com.xxx.xxx.model", }); return sessionFactory; } private Properties hibernateProperties() { Properties properties = new Properties(); properties.put(DIALECT, environment.getRequiredProperty(DIALECT)); properties.put(SHOW_SQL, environment.getRequiredProperty(SHOW_SQL)); properties.put(FORMAT_SQL, environment.getRequiredProperty(FORMAT_SQL)); properties.put(HBM2DDL_AUTO, environment.getRequiredProperty(HBM2DDL_AUTO)); return properties; } @Bean @Primary @Autowired public HibernateTransactionManager transactionManager(SessionFactory s) { HibernateTransactionManager txManager = new HibernateTransactionManager(); txManager.setSessionFactory(s); return txManager; } @Bean @Autowired public HibernateTemplate hibernateTemplate(SessionFactory s) { HibernateTemplate hibernateTemplate = new HibernateTemplate(s); return hibernateTemplate; } } 

application.properties

 # Database connection settings: jdbc.driverClassName=org.postgresql.Driver jdbc.url=jdbc:postgresql://localhost:5432/database jdbc.username=postgres jdbc.password=111111 hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect hibernate.show_sql=false hibernate.format_sql=false hibernate.hbm2ddl.auto=update spring.datasource.initialSize=50 spring.datasource.maxActive=200 spring.datasource.maxIdle=200 spring.datasource.minIdle=50 

但是,当我运行SQL访问表User时,这将出现错误:表’User’不存在。

如何让Hibernate自动创建数据库?

hibernate.hbm2ddl.auto属性可以帮到你。 创建SessionFactory时,它会自动validation或将架构DDL导出到数据库。 使用create-drop,当SessionFactory显式关闭时,将删除数据库模式。

Hibernate可以接受上述属性的这些选项。

validate :validation模式,不对数据库进行任何更改。

update :更新架构。

create :创建架构,销毁以前的数据。

create-drop :在会话结束时删除模式。

Postgres不像mysql不支持Create Database If not exist

因此,更改hibernate.hbm2ddl.auto=create和更改URL jdbc.url=jdbc:postgresql://localhost/database?createDatabaseIfNotExist=true将不适合您。

但是,您可以尝试模拟以下问题中的行为:

如果使用Hibernate不存在,则动态创建Postgres数据库

模拟CREATE DATABASE如果不是为PostgreSQL提供?

试试这种方式

 spring.jpa.hibernate.ddl-auto=update spring.jpa.generate-ddl=true spring.jpa.database-platform=org.hibernate.dialect.PostgreSQL94Dialect spring.datasource.driverClassName=org.postgresql.Driver spring.datasource.url= jdbc:postgresql://localhost:5432/postgres spring.datasource.username=postgres spring.datasource.password=123 spring.jpa.show-sql=true spring.session.store-type=none 

这对我有用。

设置为在SessionFactory生命周期中自动执行SchemaManagementTool操作。 有效选项由Action枚举的externalJpaName值定义:

  • none – 不执行任何操作。

  • create – 将生成数据库创建。

  • drop – 将生成数据库丢弃。

  • drop-and-create – 生成数据库,然后创建数据库。

spring.jpa.hibernate.ddl-auto=update ==> update ,你可以根据你的场景进行更改。