0

私はSpring JPAとHibernateを初めて使用し、次の動作で実行しました。org.mypackage.repository で JPA アノテーション付きエンティティのを正常に作成CrudRepositoryし、org.mypackage.service.jpa でアノテーション ベースのトランザクション サービスを作成しました。これにより、注入された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 はこれまでのところ、s のすべてのメソッドのすべてのエンティティで非常にうまく機能しているため、省略しましたCrudRepository(サービスのトランザクション メソッドにラップされています)。したがって、エンティティを作成するたびに、サービスがトランザクションを開始し、変更があればそれをコミットするように見えます。

現在、エラー条件をテストしようとしているので、null 非許容列の null 値など、制約に違反するフィールドを持つエンティティを 1 つ作成し、サービスの適切な (トランザクション) メソッドでそれを永続化しようとしています。例外はスローされません。私の@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()、不良レコードを保存するトランザクションから例外が発生すると予想されます。この動作は非常に直感的ではなく、アプリケーションのデバッグが非常に困難になるため、ここで何かを台無しにしたと推測しています。アイデアを持っている体はありますか?

ありがとう

ジョバンニ

4

1 に答える 1

0

私はそれを理解しました:私はこれを次のAbstractTransactionalJUnit4SpringContextTests注釈付きのインスタンスからテストしていたことに言及すべきでした:

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

そして、注入さDataSourceれた JPA サービスを使用します。

Springがテストの最後にすべての変更を自動的にロールバックすることに気づきませんでした(@Afterメソッドの後だと思います)。それは、すべてのSQLを1つのトランザクションまたはそのようなもので実行することを意味すると思います。要するに、拡張しないAbstractTransactionalJUnit4SpringContextTestsと、予想される例外がすぐに表示されます。今はAbstractJUnit4SpringContextTests代わりに使っています。

于 2013-07-27T19:06:24.647 に答える