2016-07-11 3 views
0

Я работаю с PostgreSQl и Spring 4 и хочу, чтобы мое приложение автоматически создавало базу данных при ее запуске.PostgreSQL + Hibernate + Spring auto create databse

Мой Entity Класс:

@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 для доступа к пользовательской таблицы, это будет появляться сообщение об ошибке : Таблица «Пользователь» не существует.

Как создать Hibernate для автоматического создания базы данных? Пожалуйста, дайте мне совет Спасибо

+0

Вы устали от hibernate.hbm2ddl.auto = create? – sAm

ответ

0

Недвижимость hibernate.hbm2ddl.auto сделает трюк для вас. Он автоматически проверяет или экспортирует DDL схемы в базу данных при создании SessionFactory. С помощью create-drop схема базы данных будет удалена, если SessionFactory будет закрыта явно.

Hibernate может использовать эти параметры для вышеуказанного имущества.

validate: проверить схему, не вносить изменения в базу данных.

update: обновить схему.

create: создает схему, уничтожая предыдущие данные.

create-drop: отказаться от схемы в конце сеанса.

0

Postgres в отличие от mysql не поддерживает Create Database If not exist.

Таким образом, смена hibernate.hbm2ddl.auto=create и изменение URL-адреса jdbc.url=jdbc:postgresql://localhost/database?createDatabaseIfNotExist=true не подходит.

Однако вы можете попробовать имитировать поведение, как в вопросы ниже:

Create Postgres database on the fly, if it doesn't exists using Hibernate

Simulate CREATE DATABASE IF NOT EXISTS for PostgreSQL?

1

Попробуйте этот путь

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 

Это работа для меня.

Настройка выполнения действий SchemaManagementTool автоматически в рамках жизненного цикла SessionFactory. Допустимые параметры определяются значением externalJpaName Инициативной перечислимого:

  • none - никаких действий не будет выполнено.

  • create - Будет создано создание базы данных.

  • drop - Генерация базы данных будет сгенерирована.

  • drop-and-create - Генерация базы данных будет сгенерирована с последующим созданием базы данных.

там spring.jpa.hibernate.ddl-auto=update ==>update, вы можете изменить в соответствии со сценарием.