如何在部署时有条件地创建Derby数据库?

时间:2018-06-19 10:09:56

标签: spring-mvc derby

在Java配置的Spring MVC(4.0.1)项目中,我想使用Hibernate(4.3.x)。我使用NetBEans 8.2,Java SE 8,Java EE 7.当我尝试在Glassfish 5.0服务器上部署项目时,错误消息显示:

Exception while preparing the app : Unable to execute JPA schema generation create command [create table YYYY (id integer generated by default as identity, ..., primary key (id))] java.sql.SQLTransactionRollbackException: Table/View 'YYY' already exists in Schema 'APP'

我理解它的原因。先前的部署创建了数据库。但是如何配置Spring EntityManagerFactiryBean / DataSourceBean来创建数据库以防它不存在?

当前的持久性配置代码:

@Configuration
@EnableTransactionManagement
public class PersistenceConfig
{
  @Bean
  public LocalContainerEntityManagerFactoryBean entityManagerFactoryBean()
  {
    Map<String, Object> properties = new Hashtable<>();
    properties.put("javax.persistence.schema-generation.database.action", "create");
    HibernateJpaVendorAdapter adapter = new HibernateJpaVendorAdapter();
    adapter.setDatabasePlatform("org.hibernate.dialect.DerbyDialect"); 
    LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean();
    factory.setJpaVendorAdapter(adapter);
    factory.setDataSource(this.springJpaDataSource());
    factory.setPackagesToScan("XxxPU");
    factory.setJpaPropertyMap(properties);
    return factory;
  }

  @Bean
  public DataSource springJpaDataSource()
  {
    DriverManagerDataSource dataSource = new DriverManagerDataSource();
    dataSource.setUrl("jdbc:derby://localhost/xxx");
    dataSource.setUsername("app");
    dataSource.setPassword("app");
    return dataSource;
  }

  @Bean
  public PlatformTransactionManager jpaTransactionManager()
  {
    return new JpaTransactionManager(
    entityManagerFactoryBean().getObject());
  }
}

我重命名persistence.xml以避免任何副作用。

因为我没有得到任何可用的答案,所以我必须更改db属性:

properties.put("javax.persistence.schema-generation.database.action", "create");

properties.put("javax.persistence.schema-generation.database.action", "none");

在进一步部署之后可能会成功。

1 个答案:

答案 0 :(得分:1)

here说明了数据库初始化。

我相信您需要指定:

spring.jpa.hibernate.ddl-auto=update