私はSpring JPAとHibernateを初めて使用し、次の動作で実行しました。org.mypackage.repository で JPA アノテーション付きエンティティのを正常に作成CrudRepository
し、org.mypackage.service.jpa でアノテーション ベースのトランザクション サービスを作成しました。これにより、注入されたCrudRepository
s からメソッドが呼び出されます。これが私の構成ファイルのスニペットです (私は基本的に 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()
、不良レコードを保存するトランザクションから例外が発生すると予想されます。この動作は非常に直感的ではなく、アプリケーションのデバッグが非常に困難になるため、ここで何かを台無しにしたと推測しています。アイデアを持っている体はありますか?
ありがとう
ジョバンニ