我正在使用PostgreSQL和Spring 4,希望我的应用程序在运行时自动创建数据库。
我的实体类是:
fancybox iframe
HibernateConfig.java
@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;
}
}
application.properties
@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;
}
}
但是当我运行SQL来访问表User时,会出现错误:表'User'不存在。
如何让Hibernate自动创建数据库?
答案 0 :(得分:4)
与mysql不同的Postgres不支持Create Database If not exist
。
因此更改hibernate.hbm2ddl.auto=create
并更改网址jdbc.url=jdbc:postgresql://localhost/database?createDatabaseIfNotExist=true
不适合你。
但是,您可以尝试模拟以下问题中的行为:
Create Postgres database on the fly, if it doesn't exists using Hibernate
答案 1 :(得分:3)
试试这种方式
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
这对我有用。
来自Automatic schema generation section of the Hibernate User Guide:
javax.persistence.schema-generation.database.action
设置为在SessionFactory生命周期中自动执行SchemaManagementTool操作。有效选项由Action枚举的 externalJpaName 值定义:
none
- 不会执行任何操作。
create
- 将生成数据库创建。
drop
- 将生成数据库丢弃。
drop-and-create
- 将生成数据库删除,然后创建数据库。
有spring.jpa.hibernate.ddl-auto=update
==> update
,您可以根据自己的情况进行更改。
答案 2 :(得分:0)
属性hibernate.hbm2ddl.auto
将为您解决问题。创建SessionFactory时,它会自动验证或将架构DDL导出到数据库。使用create-drop,当SessionFactory显式关闭时,将删除数据库模式。
Hibernate可以接受上述属性的这些选项。
validate
:验证架构,不对数据库进行任何更改。
update
:更新架构。
create
:创建架构,销毁以前的数据。
create-drop
:在会话结束时删除架构。
答案 3 :(得分:0)
问题与休眠方言有关。您正在使用旧的。您应该使用像这样的较新版本。
spring.jpa.database-platform=org.hibernate.dialect.PostgreSQL95Dialect
答案 4 :(得分:0)
只需更改
来自:
@Table(name = "user") || @Entity(name="user")
至:
@Table(name = "users") || @Entity(name="users")
因为PostgreSQL具有默认的“用户”
答案 5 :(得分:-1)
您可以使用带有"CREATE SCHEMA IF NOT EXISTS x;"
和
spring.jpa.properties.hibernate.hbm2ddl.auto=update
应该可以