【发布时间】:2015-01-09 22:53:10
【问题描述】:
我有这个项目设置,我试图使用 JPA 和 Hibernate 作为提供者来将数据存储在我的本地 h2 数据库中。它全部配置为我的 spring 项目的一部分,我使用 tomcat 作为我的服务器。现在,在过去一周左右的时间里,我一直在为这个阻止我成功运行我的应用程序的基本问题而烦恼。这就是应用程序与我的数据库进行通信的能力。最初,我将休眠属性 hbm2ddl 设置为 create-update。使用此配置,尽管应用程序成功启动,但没有数据被持久化到本地 H2 数据库。但是这里要注意的一点是数据是持久化在JVM里面的。所以我能够检索存储的内容。请注意,尽管我没有在内存模式下运行 h2 数据库,但仍会发生这种情况。现在经过一些研究,我意识到,我应该将 hbm2ddl 属性设置为验证,因为我已经使用 H2 控制台单独创建了数据库模式。但这里是我得到这个缺少表的休眠异常的地方。我通过调试我正在使用的第 3 方休眠、c3p0 和 h2 jar 进行了一些挖掘,但我确实碰壁了。我实际上可以看到 H2 驱动程序 jar 中的 JdbcDatabaseMetaData 类创建了一个准备好的语句,但是当该语句执行时,它返回空结果集。好吧,为了检查是否存在任何与连接或查询相关的问题,我通过一个使用简单 H2 Jdbc 连接的独立程序获取了确切的查询并执行了它。令人惊讶的是,我能够检索其缺失导致“缺失表”休眠异常的确切数据。
有谁知道为什么会出现这种情况?驱动程序工作正常,我假设休眠与它无关。这让我怀疑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;
}
}
【问题讨论】:
-
可以给我们看一些代码和配置。也尝试剥离应用程序。让单个实体尝试一次 crud 操作。
-
我已经添加了详细信息。甚至在我尝试执行任何 crud 操作之前,应用程序在 tomcat 中启动时就会引发错误。错误是缺少表客户。
-
尝试一件事,最初将 hibernate.hbm2ddl.auto 设置为更新。让 hibernate 为你创建表。然后将其设置回无,看看它是否有效。
-
我试过这个,但是当我使用 H2 控制台连接到数据库时,我看不到那些表或使用 crud 操作插入的数据。
标签: spring hibernate tomcat jpa h2