Outbound Channel Adapter を使用してエンティティを削除しようとすると、常にデタッチされたインスタンスの例外が削除されます。この例外を回避するには、同じトランザクションでエンティティを取得して削除する必要があることは知っていますが、Spring Integration でそれを実現するにはどうすればよいですか?
問題を実証するために、JPA サンプルを次のように変更しました。
PersonService.java
public interface PersonService {
...
void deletePerson(Person person);
}
Main.java
private static void deletePerson(final PersonService service) {
final List<Person> people = service.findPeople();
Person p1 = people.get(0);
service.deletePerson(p1);
}
spring-integration-context.xml
<int:gateway id="personService"
service-interface="org.springframework.integration.samples.jpa.service.PersonService"
default-request-timeout="5000" default-reply-timeout="5000">
<int:method name="createPerson" request-channel="createPersonRequestChannel"/>
<int:method name="findPeople" request-channel="listPeopleRequestChannel"/>
<int:method name="deletePerson" request-channel="deletePersonChannel"/>
</int:gateway>
<int:channel id="deletePersonChannel"/>
<int-jpa:outbound-channel-adapter entity-manager-factory="entityManagerFactory"
channel="deletePersonChannel" persist-mode="DELETE" >
<int-jpa:transactional transaction-manager="transactionManager" />
</int-jpa:outbound-channel-adapter>
deletePerson を呼び出すと、例外が発生します。
スレッド「メイン」での例外 java.lang.IllegalArgumentException: デタッチされたインスタンスの削除 org.springframework.integration.samples.jpa.Person#1001
アップデート:
Artem が行ったように、ここではプログラムで新しいトランザクションを作成し、関数呼び出しの取得と削除の両方をラップできるため、実際のプロジェクトに近いサンプルを選択する必要があったようです。
私のプロジェクトでは、アウトバウンドチャネルアダプターに接続されたトランスがあります。トランスフォーマーがエンティティーを取得し、outbound-channel-adapter がそれを削除します。この場合、Transformer と outbound-channel-adapter で同じトランザクションを使用するにはどうすればよいですか?