Spring Data JPA xml配置:使用create-drop创建"找不到表"

Max*_*AMM 4 java spring spring-data-jpa

我可能在某处忘记了某些东西,我无法弄清楚是什么.

我有一个@Entity:

@Entity
public class MyEntity implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue
    private Long id;
Run Code Online (Sandbox Code Playgroud)

我有一个JpaRepository

public interface MyEntityRepository extends JpaRepository<MyEntity, Long> {

}
Run Code Online (Sandbox Code Playgroud)

这是我的appContext.xml

<!-- CORE -->
<context:annotation-config />
<context:component-scan base-package="com.foo.project" />

<!-- WEB -->
<mvc:annotation-driven />
<mvc:resources mapping="/resources/**" location="/resources/" />

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  <property name="prefix" value="/WEB-INF/pages/" />
  <property name="suffix" value=".jsp" />
</bean>

<!-- DATA -->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
  <property name="driverClassName" value="org.h2.Driver" />
  <property name="url" value="jdbc:h2:mem:test" />
  <property name="username" value="sa" />
  <property name="password" value="" />
</bean>

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
  <property name="dataSource" ref="dataSource" />
  <property name="packagesToScan" value="com.foo.project.domain" />
  <property name="jpaVendorAdapter">
    <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" />
  </property>
  <property name="jpaProperties">
    <props>
      <prop key="hibernate.hbm2ddl.auto">create-drop</prop>
      <prop key="hibernate.dialect">org.hibernate.dialect.H2Dialect</prop>
    </props>
  </property>
</bean>

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

<tx:annotation-driven />

<jpa:repositories base-package="com.foo.project.repository" />
Run Code Online (Sandbox Code Playgroud)

我有一个单元测试:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath:**/appContext.xml" })
public class MyEntityRepositoryTest {
    @Autowired private MyEntityRepository myEntityRepository;
Run Code Online (Sandbox Code Playgroud)

当我运行测试时,我收到一个错误:

错误:未找到表"MYENTITY";

这是完整的日志:

sept. 04, 2014 8:19:47 AM org.hibernate.jpa.internal.util.LogHelper logPersistenceUnitInformation
INFO: HHH000204: Processing PersistenceUnitInfo [
    name: default
    ...]
sept. 04, 2014 8:19:47 AM org.hibernate.Version logVersion
INFO: HHH000412: Hibernate Core {4.3.6.Final}
sept. 04, 2014 8:19:47 AM org.hibernate.cfg.Environment <clinit>
INFO: HHH000206: hibernate.properties not found
sept. 04, 2014 8:19:47 AM org.hibernate.cfg.Environment buildBytecodeProvider
INFO: HHH000021: Bytecode provider name : javassist
sept. 04, 2014 8:19:48 AM org.hibernate.annotations.common.reflection.java.JavaReflectionManager <clinit>
INFO: HCANN000001: Hibernate Commons Annotations {4.0.5.Final}
sept. 04, 2014 8:19:48 AM org.hibernate.dialect.Dialect <init>
INFO: HHH000400: Using dialect: org.hibernate.dialect.H2Dialect
sept. 04, 2014 8:19:49 AM org.hibernate.hql.internal.ast.ASTQueryTranslatorFactory <init>
INFO: HHH000397: Using ASTQueryTranslatorFactory
sept. 04, 2014 8:19:49 AM org.hibernate.validator.internal.util.Version <clinit>
INFO: HV000001: Hibernate Validator 5.1.2.Final
sept. 04, 2014 8:19:50 AM org.hibernate.tool.hbm2ddl.SchemaExport execute
INFO: HHH000227: Running hbm2ddl schema export
sept. 04, 2014 8:19:50 AM org.hibernate.tool.hbm2ddl.SchemaExport execute
INFO: HHH000230: Schema export complete
sept. 04, 2014 8:19:52 AM org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions
WARN: SQL Error: 42102, SQLState: 42S02
sept. 04, 2014 8:19:52 AM org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions
ERROR: Table "MYENTITY" not found; SQL statement:
select count(*) as col_0_0_ from MyEntity myEntity0_ [42102-181]
Run Code Online (Sandbox Code Playgroud)

我错过了什么?

M. *_*num 7

您有以下配置

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="org.h2.Driver" />
    <property name="url" value="jdbc:h2:mem:test" />
    <property name="username" value="sa" />
    <property name="password" value="" />
</bean
Run Code Online (Sandbox Code Playgroud)

此配置的问题是在启动时Hibernate将打开连接并创建数据库并关闭连接.在连接关闭时,数据库将被销毁,一旦您开始测试,数据库就会再次为空.

您的问题有3种解决方案

  1. 使用Spring嵌入式数据库标记
  2. 将DB_CLOSE_DELAY = -1添加到您的网址
  3. 用一个 SingleConnectionDataSource

嵌入数据库

使用命名空间中的embedded-database标记替换数据源定义jdbc.

<jdbc:embedded-database id="dataSource" type="H2" />
Run Code Online (Sandbox Code Playgroud)

添加了DB_CLOSE_DELAY

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="org.h2.Driver" />
    <property name="url" value="jdbc:h2:mem:test;DB_CLOSE_DELAY=-1" />
    <property name="username" value="sa" />
    <property name="password" value="" />
</bean
Run Code Online (Sandbox Code Playgroud)

用一个 SingleConnectionDataSource

<bean id="dataSource" class="org.springframework.jdbc.datasource.SingleConnectionDataSource">
    <constructor-arg index="0" value="org.h2.Driver" />
    <constructor-arg index="1" value="jdbc:h2:mem:test" />
    <constructor-arg index="2" value="sa" />
    <constructor-arg index="3" value="" />
    <constructor-arg index="4" value="true"/>
</bean>
Run Code Online (Sandbox Code Playgroud)

这将打开一个Connection并为所有其他调用重用它,因为它会抑制连接的关闭.

这些选项中的任何一个都将使数据库保持活跃状态 选项1和2与EmbeddedDatabaseBuilder使用包含所提及属性的jdbc URL 基本相同.