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");
在第一次部署之后可能会成功。
解决方案
推荐阅读
- java - EMR 上的 MapReduce 不联系 RMProxy 并卡住等待资源管理器?
- java - Android 上的 ClusterManager 并不总是正常工作
- php - 遇到未捕获的异常类型:ArgumentCountError 消息:函数的参数太少
- python - 如何使用理解从 python 中的字典中创建值列表
- python - 通过保持一个公共列完整来从两个数据框中删除公共列
- java - 如何使用 gremlin 和 janusgraph 获得组合的顶点和边属性
- qt - 无法启动... Raspbian Pi 上的 Qt 平台插件“xcb”
- r - 使用 R 包 lubridate 的 seconds_to_period 函数时,如何将秒数舍入到 2 个位置?
- c++ - 我的代码中有错误,未声明的标识符
- javascript - 为什么 lengthPal 将 testPalindrone.length 存储为数字?