Spring CrudRepository 保存直到调用查找才抛出?



我是Spring JPA和Hibernate的新手,我运行了以下行为。我在org.mypackage.service.JPA中成功地为我的JPA注释实体创建了CrudRepositorys,该实体在org.mypackage.service.js中基于位置和注释的事务服务,进而调用注入的CrudRepositorys中的方法。以下是我的配置文件片段(我基本上复制了Pro-Spring 3中的示例):

<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory" ref="emf"/>
</bean>
<tx:annotation-driven transaction-manager="transactionManager"/>
<context:annotation-config/>
<context:component-scan base-package="org.mypackage.service.jpa"/>
<jpa:repositories base-package="org.mypackage.repository"
                  entity-manager-factory-ref="emf"
                  transaction-manager-ref="transactionManager"/>

我省略了emf-bean,因为到目前为止,它与CrudRepository中所有方法的所有实体(封装在我的服务中的事务方法中)都能很好地工作。因此,看起来每次我创建实体时,服务都会启动一个事务并提交我的更改(如果有的话)。

现在我正在尝试测试错误条件,所以我创建了一个实体,其中包含一个违反约束的字段,例如,不可为null的列中的null值,然后尝试使用服务中的适当(事务)方法将其持久化,不会引发异常。在我的@After方法中,我调用findAll并boom,有一个例外:

org.springframework.dao.DataIntegrityViolationException: could not execute statement; SQL [n/a]; constraint [null]; nested exception is org.hibernate.exception.ConstraintViolationException: could not execute statement
...
Caused by: org.hibernate.exception.ConstraintViolationException: could not execute statement
...
Caused by: org.h2.jdbc.JdbcSQLException: NULL not allowed for column "FKSOMEID"; SQL statement:
INSERT INTO ....

我尝试更改Hibernate的JPA参数,例如,将hibernate.jdbc.batch_size设置为1,但似乎没有任何作用。在我调用findAll()之前,插入似乎不会被执行,而我希望从保存坏记录的事务中获得一个异常。这种行为非常违反直觉,会使调试我的应用程序变得非常困难,所以我猜我在这里搞砸了。有人有主意吗?

感谢

Giovanni

我想明白了:我应该提到我是从一个注释为:的AbstractTransactionalJUnit4SpringContextTests实例中测试的

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:config.xml"})

并且具有注入的CCD_ 9和JPA服务。

我没有意识到Spring在测试结束时会自动回滚所有更改(我想是在任何@After方法之后),我想这意味着它在一个事务或类似的事务中执行所有SQL。最重要的是,如果我不扩展AbstractTransactionalJUnit4SpringContextTests,我会立即看到预期的异常。我现在使用AbstractJUnit4SpringContextTests

相关内容

  • 没有找到相关文章

最新更新