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

时间:2013-07-27 18:48:32

标签: spring hibernate jpa transactions spring-junit

我是Spring JPA和Hibernate的新手,我遇到了以下行为。我成功地为org.mypackage.repository中的JPA注释实体和org.mypackage.service.jpa中基于注释的事务服务创建了CrudRepository,后者又从注入的CrudRepository调用了方法。这是我的配置文件的片段(我基本上复制了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中的所有方法(包含在我的服务中的事务方法中)的所有实体工作得非常好。所以看起来每次我创建一个实体时,服务都会启动一个事务并提交我的更改(如果有的话)。

现在我正在尝试测试错误条件,因此我创建了一个具有违反约束的字段的实体,例如,非可空列中的空值,然后尝试使用适当的(事务性)方法将其保留从我的服务,没有异常被抛出。在我的@After方法中,我呼叫findAll并繁荣,这是例外:

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()之前不会被执行,而我希望从保存坏记录的事务中获得异常。这种行为非常直观,并且会使调试我的应用程序变得非常困难,所以我猜我在这里弄乱了一些东西。有没有人有想法?

由于

乔瓦尼

0 个答案:

没有答案