在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");
在进一步部署之后可能会成功。