0

我试图让示例应用程序运行,但在尝试连接到数据库时出现以下错误:

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.springframework.transaction.CannotCreateTransactionException: Could not open JPA EntityManager for transaction; nested exception is javax.persistence.PersistenceException: org.hibernate.exception.GenericJDBCException: Cannot open connection
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:894)
org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:789)

我没有更改applicationContext.xml,具体部分是:

    <beans profile="default">
    <jdbc:embedded-database id="dataSource"/>        
    <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <property name="jpaVendorAdapter">
            <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"/>
        </property>
        <property name="jpaProperties">
            <props>
                <prop key="hibernate.dialect">org.hibernate.dialect.HSQLDialect</prop>
                <prop key="hibernate.hbm2ddl.auto">create</prop>
            </props>
        </property>
    </bean>
</beans>

<beans profile="prod">
    <bean class="java.net.URI" id="dbUrl">
        <constructor-arg value="#{systemEnvironment['DATABASE_URL']}"/>
    </bean>

    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
        <property name="url" value="#{ 'jdbc:postgresql://' + @dbUrl.getHost() + @dbUrl.getPath() }"/>
        <property name="username" value="#{ @dbUrl.getUserInfo().split(':')[0] }"/>
        <property name="password" value="#{ @dbUrl.getUserInfo().split(':')[1] }"/>
    </bean>

    <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <property name="jpaVendorAdapter">
            <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"/>
        </property>
        <property name="jpaProperties">
            <props>
                <prop key="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</prop>
                <prop key="hibernate.show_sql">true</prop>
                <!-- change this to 'verify' before running as a production app -->
                <prop key="hibernate.hbm2ddl.auto">update</prop>
            </props>
        </property>
    </bean>
</beans>

我可以使用笔记本电脑上的 pgAdmin III 连接到数据库。另外,我正在学习 Spring,我看到一些 bean 被包装在配置文件“prod”中,但我无法分辨代码或 web.xml 中使用特定配置文件的任何地方。应用程序服务器(Heroku?)是否需要以特定模式/配置文件启动,这可能是数据库连接未打开的原因吗?我也在学习 Heroku。

4

1 回答 1

3

您是否尝试在本地计算机上运行应用程序?为了能够在您的本地机器上运行这个示例项目,您需要创建数据库。教程中没有描述,但如果您尝试使用示例 DATABASE_URL ( postgres://scott:tiger@localhost/myapp),您需要scott使用密码创建用户tiger并创建数据库myapp并授予scott所需的权限。我做了什么,我sampledb用现有postgres用户创建了数据库,因为它是数据库管理员,我不需要理会授权,只需将 url 更改为

export DATABASE_URL=postgres://postrges:<password>@localhost/sampledb

于 2012-12-06T12:57:42.910 回答