当我尝试使用出站通道适配器删除实体时,我总是会删除一个分离的实例异常。我知道应该在同一个事务中检索和删除实体以避免此异常,但是如何使用 Spring Integration 来实现呢?
为了演示我修改了 JPA 示例的问题:
人事服务.java
public interface PersonService {
...
void deletePerson(Person person);
}
主.java
private static void deletePerson(final PersonService service) {
final List<Person> people = service.findPeople();
Person p1 = people.get(0);
service.deletePerson(p1);
}
弹簧集成上下文.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 那样以编程方式创建一个新事务并在其中包装检索和删除函数调用。
在我的项目中,我有一个连接到出站通道适配器的变压器。转换器检索一个实体,而出站通道适配器将其删除。在这种情况下,如何让转换器和出站通道适配器使用相同的事务?