Tran Vinh Quang Tran Vinh Quang - 4 months ago 50
Java Question

PostgreSQL + Hibernate + Spring auto create databse

I'm working with PostgreSQl and Spring 4 and want my app auto create database when it running.

My Entity Class is:

@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


But when I running SQL to access table User, this will appear error: Table 'User' does not exist.

How can I make Hibernate to auto create database? Please give me advice
Thanks

Answer

The property hibernate.hbm2ddl.auto will do the trick for you. It automatically validates or exports schema DDL to the database when the SessionFactory is created. With create-drop, the database schema will be dropped when the SessionFactory is closed explicitly.

Hibernate can accept these options for the above property.

validate: validate the schema, makes no changes to the database.

update: update the schema.

create: creates the schema, destroying previous data.

create-drop: drop the schema at the end of the session.

Comments