2013-10-07 3 views
0

Когда я пытаюсь удалить объект с использованием адаптера исходящего канала, я всегда удаляю исключение отдельного экземпляра. Я знаю, что объект должен быть извлечен и удален в той же транзакции, чтобы избежать этого исключения, но как я могу достичь этого с помощью Spring Integration?Не удается удалить объект JPA с использованием Spring Integration

Чтобы продемонстрировать эту проблему я модифицированную the JPA sample:

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); 
} 

весна-интегрально-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

UPDATE:

Видимо, я должен был выбран образец ближе к моему фактическому проекту, потому что здесь вы можете просто создать новую транзакцию программной и завернуть как получить и функцию удаления звонит в нее, как это сделал Артем.

В моем проекте у меня есть трансформатор, подключенный к адаптеру исходящего канала. Трансформатор извлекает объект, а адаптер исходящего канала удаляет его. Как я могу заставить трансформатор и адаптер исходящего канала использовать эту транзакцию в этом случае?

ответ

2

Чтобы это сработало, вы должны перенести все операции в deletePerson на транзакцию, например.

private static void deletePerson(final PersonService service) { 
     new new TransactionTemplate(transactionManager) 
     .execute(new TransactionCallbackWithoutResult() { 

      protected void doInTransactionWithoutResult(TransactionStatus status) { 
       final List<Person> people = service.findPeople(); 
       Person p1 = people.get(0); 
       service.deletePerson(p1); 

      } 
     }); 
} 

В этом случае вы должны каким-то образом обеспечить ваш метод TransactionManager боб тоже.

UPDATE:

Я показал вам образец для сценария использования в оригинальный вопрос. Теперь re. <transformer> -><jpa:outbound-channel-adapter>. В этом вы должны понимать, где начинается ваш поток сообщений:

  1. Если <inbound-channel-adapter> с Poller, так просто сделать <poller><transactional>
  2. Если бы это <gateway>, которые называют <transformer>, так что это просто достаточно, чтобы отметить Вратах метод с @Transactional
  3. Вот еще один транзакционный совет трюк: Keep transaction within Spring Integration flow

Во всех случаях вам следует избавиться от <transactional> от вашего <jpa:outbound-channel-adapter>

+0

Спасибо Артем, это сработало, но есть ли способ сделать это через xml? – John29

+0

См. Мой обновленный вопрос. – John29

+0

Я обновил свой ответ –

Смежные вопросы