我有spring XML,可以使用以下配置在服务器模式下启动H2数据库:
<beans profile="test-h2"> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="org.h2.Driver"/> <property name="url" value="jdbc:h2:target/h2/pps;AUTO_SERVER=TRUE"/> <property name="username" value="sa"/> <property name="password" value=""/> </bean> <bean id="entityManagerFactory" parent="entityManagerFactoryCommonParent"> <property name="jpaProperties"> <props> <prop key="hibernate.hbm2ddl.auto">create-drop</prop> <prop key="hibernate.show_sql">true</prop> </props> </property> </bean>
我想转换为基于Java的配置。我似乎在这里发表了一篇文章:使用Spring提出并设置内存数据库,并提出了相同的问题,我查看了http://docs.spring.io/spring/docs/3.0.x/spring-framework- reference/ html / jdbc.html#jdbc-embedded-database- support支持嵌入式数据库,但没有说明如何将H2模式设置为服务器模式。它仅在“内存”模式下为我启动服务器。
我有以下代码:
EmbeddedDatabaseBuilder builder = new EmbeddedDatabaseBuilder(); builder.setType(EmbeddedDatabaseType.H2); builder.setName(DATABASE_NAME); builder.addScript(H2_SCHEMA); builder.addScript(H2_TEST); return builder.build();
也许使用EmbeddedDatabaseBuilder(ResourceLoader)可能有效。有人有一些示例代码吗?
这是允许您使用基于Java的Spring配置在服务器模式下启动H2数据库的代码:
private static final String H2_JDBC_URL_TEMPLATE = "jdbc:h2:%s/target/db/sample;AUTO_SERVER=TRUE"; @Value("classpath:seed-data.sql") private Resource H2_SCHEMA_SCRIPT; @Value("classpath:test-data.sql") private Resource H2_DATA_SCRIPT; @Value("classpath:drop-data.sql") private Resource H2_CLEANER_SCRIPT; @Bean public DataSource dataSource(Environment env) throws Exception { return createH2DataSource(); } @Autowired @Bean public DataSourceInitializer dataSourceInitializer(final DataSource dataSource) { final DataSourceInitializer initializer = new DataSourceInitializer(); initializer.setDataSource(dataSource); initializer.setDatabasePopulator(databasePopulator()); initializer.setDatabaseCleaner(databaseCleaner()); return initializer; } private DatabasePopulator databasePopulator() { final ResourceDatabasePopulator populator = new ResourceDatabasePopulator(); populator.addScript(H2_SCHEMA_SCRIPT); populator.addScript(H2_DATA_SCRIPT); return populator; } private DatabasePopulator databaseCleaner() { final ResourceDatabasePopulator populator = new ResourceDatabasePopulator(); populator.addScript(H2_CLEANER_SCRIPT); return populator; } private DataSource createH2DataSource() { String jdbcUrl = String.format(H2_JDBC_URL_TEMPLATE, System.getProperty("user.dir")); JdbcDataSource ds = new JdbcDataSource(); ds.setURL(jdbcUrl); ds.setUser("sa"); ds.setPassword(""); return ds; } @Bean public PlatformTransactionManager transactionManager(EntityManagerFactory entityManagerFactory) { JpaTransactionManager transactionManager = new JpaTransactionManager(); transactionManager.setEntityManagerFactory(entityManagerFactory); return transactionManager; } @Bean public LocalContainerEntityManagerFactoryBean entityManagerFactory(Environment env) throws Exception { HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter(); vendorAdapter.setGenerateDdl(Boolean.TRUE); vendorAdapter.setShowSql(Boolean.TRUE); LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean(); factory.setPersistenceUnitName("sample"); factory.setJpaVendorAdapter(vendorAdapter); factory.setPackagesToScan("com.sample.model"); factory.setDataSource(dataSource(env)); factory.setJpaProperties(jpaProperties()); factory.setLoadTimeWeaver(new InstrumentationLoadTimeWeaver()); return factory; } Properties jpaProperties() { Properties props = new Properties(); props.put("hibernate.query.substitutions", "true 'Y', false 'N'"); props.put("hibernate.hbm2ddl.auto", "create-drop"); props.put("hibernate.show_sql", "false"); props.put("hibernate.format_sql", "true"); return props; }