首页 > 解决方案 > 如何在部署时有条件地创建 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");

在第一次部署之后可能会成功。

标签: spring-mvcderby

解决方案


这里解释了数据库初始化。

我相信您需要指定:

spring.jpa.hibernate.ddl-auto=update


推荐阅读