Spring HibernateeException缺少表

Spring HibernateeException缺少表,spring,hibernate,tomcat,jpa,h2,Spring,Hibernate,Tomcat,Jpa,H2,我有一个项目设置,我试图使用JPA和Hibernate作为提供程序在本地h2数据库中存储数据。它全部配置为我的spring项目的一部分,我使用tomcat作为我的服务器。在过去一周左右的时间里,我一直在为一个基本问题绞尽脑汁,这个问题阻碍了我的应用程序成功运行。这就是应用程序与数据库通信的能力。最初,我将hibernate属性hbm2ddl设置为创建更新。使用此配置,尽管应用程序已成功启动,但没有数据被持久化到本地H2数据库。但这里需要注意的是,数据是在JVM中持久化的。因此,我能够检索存储的内

我有一个项目设置,我试图使用JPA和Hibernate作为提供程序在本地h2数据库中存储数据。它全部配置为我的spring项目的一部分,我使用tomcat作为我的服务器。在过去一周左右的时间里,我一直在为一个基本问题绞尽脑汁,这个问题阻碍了我的应用程序成功运行。这就是应用程序与数据库通信的能力。最初,我将hibernate属性hbm2ddl设置为创建更新。使用此配置,尽管应用程序已成功启动,但没有数据被持久化到本地H2数据库。但这里需要注意的是,数据是在JVM中持久化的。因此,我能够检索存储的内容。请注意,尽管我没有在内存模式下运行h2数据库,但还是发生了这种情况。现在,经过一些研究,我意识到,我应该将hbm2ddl属性设置为验证,因为我已经在使用H2控制台分别创建数据库模式。但这里是我得到这个缺少表的hibernate异常的地方。我通过调试第三方hibernate、c3p0和h2 JAR进行了一些挖掘,但我确实遇到了麻烦。实际上,我可以在H2驱动程序jar中看到JdbcDatabaseMetaData类创建了一个准备好的语句,但是当该语句执行时,它返回空的结果集。好的,为了检查是否存在任何连接或查询相关问题,我采用了确切的查询,并通过一个使用简单H2 Jdbc连接的独立程序执行它。令人惊讶的是,我能够检索到导致“缺少表”hibernate异常的确切数据

有人知道为什么会发生这种事吗?驱动程序运行良好,我假设hibernate与此无关。这让我怀疑tomcat有什么东西阻止了与数据库的通信。在这一点上的任何评论、暗示和提示都将不胜感激

下面是一些基本配置

持久性配置

<!-- datasource -->
<bean id="datasource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
    <!-- DB connection properties -->
    <property name="driverClass" value="org.h2.Driver" />
    <property name="jdbcUrl" value="${db.url}" />
    <property name="user" value="${db.user:}" />
    <property name="password" value="${db.password:}" />

    <!-- Pool sizing properties -->
    <property name="initialPoolSize" value="${db.pool.initialSize:5}" />
    <property name="maxPoolSize" value="${db.pool.maxSize:25}" />
    <property name="minPoolSize" value="${db.pool.minSize:0}" />
    <property name="maxStatements" value="${db.pool.maxStatements:10}" />

    <!-- Connection testing and acquisition properties -->
    <property name="maxIdleTime" value="300" />
    <property name="idleConnectionTestPeriod" value="${db.con.testPeriod:30}" />
    <property name="preferredTestQuery" value="${db.con.testQuery:select 1 from dual}" />
    <property name="acquireIncrement" value="${db.con.acquireIncrement:5}" />
    <property name="acquireRetryAttempts" value="${db.con.retryAttempts:0}" />
    <property name="acquireRetryDelay" value="${db.con.retryDelay:3000}" />

    <!-- JMX name -->
    <property name="dataSourceName" value="Datasource" />

    <!-- Debugging options -->
    <property name="unreturnedConnectionTimeout" value="${db.con.unreturnedTimeout:0}" />
    <property name="debugUnreturnedConnectionStackTraces" value="${db.con.debugUnreturned:false}" />
</bean>

<bean id="emf" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="dataSource" ref="datasource"/>
    <property name="packagesToScan" value="com.omni" />
    <property name="persistenceProviderClass" value="org.hibernate.ejb.HibernatePersistence"/>
    <property name="jpaDialect">
        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaDialect" />
    </property>
    <property name="jpaProperties">
        <props>
            <prop key="hibernate.dialect">${db.hib.dialect}</prop>
          <!--   <prop key="hibernate.default_schema">${db.hib.schema:SVC_APP}</prop> -->
            <prop key="hibernate.id.new_generator_mappings">true</prop>
            <prop key="hibernate.jdbc.batch_versioned_data">true</prop>
            <prop key="hibernate.connection.isolation">${db.hib.isolationLevel:4}</prop>
            <prop key="hibernate.jdbc.fetch_size">${db.hib.fetchSize:50}</prop>
            <prop key="hibernate.max_fetch_depth">${db.hib.maxFetchDepth:3}</prop>
            <prop key="hibernate.default_batch_fetch_size">${db.hib.defBatchSize:8}</prop>
            <prop key="hibernate.hbm2ddl.auto">${db.hib.ddl:none}</prop>
            <prop key="hibernate.generate_statistics">${db.hib.genStats:true}</prop>
            <prop key="hibernate.format_sql">${db.hib.formatSql:false}</prop>
            <prop key="hibernate.ejb.interceptor">com.omni.core.support.hibernate.AuditInterceptor</prop>
            <prop key="hibernate.show_sql">true</prop>   
            <!--<prop key="hibernate.default_catalog">DEALS</prop>             -->
        </props>
    </property>
</bean>

<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory" ref="emf" />
</bean>

<tx:annotation-driven transaction-manager="transactionManager"/>

<bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor" />

谢谢你回答我的问题。我终于解决了我的设置问题。H2正在嵌入式模式下运行。我假设即使使用嵌入式模式,即使JVM关闭,数据也应该保持不变。然而,这对我来说显然不是真的。因此,当我将其切换到TCP/服务器模式时,它可以顺利工作,没有任何问题


如果其他人也面临同样的问题,请在此处发表评论,我很乐意提供帮助。

可以向我们展示一些代码和配置。还可以尝试剥离应用程序。我只尝试了一次单实体crud操作。我已经添加了详细信息。甚至在我尝试执行任何crud操作之前,应用程序在tomcat中启动时就会抛出错误。错误是缺少表customer。请尝试一件事,首先将hibernate.hbm2ddl.auto设置为更新。让hibernate为您创建表。然后将其设置回none,看看是否有效。我尝试了这个方法,但是当我使用H2控制台连接到数据库时,我看不到那些表或使用crud操作插入的数据。
@Entity
@Table(name="CUSTOMER")
public class CustomerEt  {  
private  String id;
private  String lastName;   
private  String firstName;  
private  String middleName; 

@Id
@Column(name="CUSTOMER_ID")
public String getId() {
    return id;
}

@Column(name="LAST_NAME")
public String getLastName() {
    return lastName;
}
public void setLastName(String lastName) {
    this.lastName = lastName;
}
@Column(name="FIRST_NAME")
public String getFirstName() {
    return firstName;
}
public void setFirstName(String firstName) {
    this.firstName = firstName;
}
@Column(name="MIDDLE_NAME")
public String getMiddleName() {
    return middleName;
}
public void setMiddleName(String middleName) {
    this.middleName = middleName;
}
}