【发布时间】:2014-12-30 16:15:55
【问题描述】:
我使用的版本:
- 春季版:4.0.5.RELEASE
- H2 版本:1.3.174
- 休眠版本:4.3.6.Final
我曾经有一个工作设置,在部署战争文件时,我使用我的 applicationContext 创建了一个 H2 服务器和一个数据源。我的配置是这样的:
<bean id = "h2Server"
class="org.h2.tools.Server"
factory-method="createTcpServer"
init-method="start"
destroy-method="stop">
<constructor-arg value="-tcp,-tcpAllowOthers,-tcpPort,8045" />
</bean>
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource" depends-on="h2Server">
<property name="driverClassName" value="org.h2.Driver" />
<property name="url" value="${database.url}" />
<property name="username" value="${database.username}" />
<property name="password" value="${database.password}" />
然后我定义了一个
LocalContainerEntityManagerFactoryBean
定义 jpaProperty 让 hibernate 自动生成所有表:
<property name="jpaProperties">
<props>
<prop key="hibernate.hbm2ddl.auto">update</prop>
<prop key="hibernate.dialect">org.hibernate.dialect.H2Dialect</prop>
</props>
</property>
这就像一个魅力,当我的应用程序被部署时,所有的表都是自动创建的。这对于测试设置非常有用,但对于生产版本,我们希望关闭 hibernate 自动生成表,并且我们希望自己管理 sql 创建和迁移脚本。
因此我决定使用 flyway 作为数据库迁移工具,并从 EntityManager 定义中删除了以下行:
<prop key="hibernate.hbm2ddl.auto">update</prop>
这似乎可行,并且创建了数据库并且具有最小的大小,但是当我尝试使用 Squirrel 连接到它时,出现以下异常:
我希望如果 H2Server 和数据源 bean 是由 Spring 创建的,那么可以使用它的驱动程序、url、用户名、密码来访问数据库。
我的第一个想法是它们不是因为延迟初始化而创建的,而 hibernate 表的创建意味着要真正初始化 bean。我尝试将两个属性的延迟初始化属性都设置为false,但没有运气...
我一定是错过了什么,但现在看不到它...... 部署应用程序后,有没有办法使数据库可用于连接?
【问题讨论】:
标签: java spring hibernate datasource h2