2015-01-09 35 views
0

我有这个项目设置,我试图使用JPA与Hibernate作为提供者来存储数据在我本地的h2数据库。它的所有配置作为我的春天项目的一部分,我使用tomcat作为我的服务器。现在,在上个星期左右,我一直在为这个基本问题而头痛,这让我无法成功地完成应用程序。这就是应用程序与我的数据库进行通信的能力。最初,我将hibernate属性hbm2ddl设置为create-update。使用此配置,虽然应用程序已成功启动,但没有数据被持久保存到本地H2数据库。但要注意的一点是,数据在JVM中是持久的。所以我能够检索存储的内容。请注意,尽管我没有在内存模式下运行h2数据库,但仍然发生这种情况。现在经过一些研究,我意识到,我应该将hbm2ddl属性设置为验证,因为我已经使用H2控制台分别创建数据库模式。但是,这里是我得到这个休眠表丢失的例外。我通过调试进入第三方休眠,c3p0和h2的罐子,我正在使用,但我已经从字面上打墙。我实际上可以看到H2驱动程序jar中的JdbcDatabaseMetaData类创建了一个准备好的语句,但是当执行该语句时,它会返回空结果集。那么,为了检查是否存在任何连接或查询相关问题,我使用了精确的查询并通过使用简单H2 Jdbc连接的独立程序执行。令人惊讶的是,我能够检索缺少导致'Missing Table'休眠异常的确切数据。HibernateException丢失表

有没有人知道为什么会造成这个事情?驱动程序工作正常,我假设休眠与它无关。这让我怀疑有一些关于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" /> 

这是实体文件,我得到缺少的表错误消息。

@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; 
} 
} 
+0

可以向我们展示一些代码和配置。也尝试剥离应用程序。只有一次实体尝试粗暴操作。 – jitsonfire 2015-01-10 07:25:52

+0

我已经添加了详细信息。即使在我尝试执行任何crud操作之前,应用程序在tomcat中启动时会引发错误。表格客户缺少错误。 – user1639616 2015-01-10 22:44:25

+0

尝试一下最初设置hibernate.hbm2ddl.auto来更新。让hibernate为你创建表格。然后将其设置为无,然后查看它是否有效。 – jitsonfire 2015-01-11 10:03:48

回答

0

谢谢你回答我的问题。我终于找到了我的设置问题。 H2正在运行嵌入模式。我假设即使在嵌入模式下,即使在JVM关闭后,数据仍应该保留。但是,这显然不适用于我。所以,当我将其更改为TCP /服务器模式时,它一切正常,没有任何问题。

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