2015-01-09 58 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 /服務器模式時,它一切正常,沒有任何問題。

如果其他人面臨同樣的問題,請在這裏發表評論,我很樂意提供幫助。