![](/img/trans.png)
[英]@Caching method called from spring boot test [annotated with @Transactional] not working
[英]Spring Boot With @Transactional annotated method, calls other transactional methods and throws an Exception
我正在嘗試在@Transactional
注釋方法中處理記錄。 在處理其他一些次要(但必要)的業務邏輯之前,必須注意其他方法的一些依賴性。 主記錄似乎在事務內部沒有問題地保存,但是當我嘗試使用其他服務清理一些數據時,它會拋出一個JpaEntityNotFoundException
。
我在導致問題的方法中使用了Propagation.REQUIRES_NEW
,但沒有成功。 有沒有人知道我錯過了什么或做錯了什么? 在執行其余的事務操作之前,我不能提交主記錄。
我得到的例外是: org.springframework.orm.jpa.JpaObjectRetrievalFailureException: Unable to find com.myproject.repository.entity.Book with id 5851445; nested exception is javax.persistence.EntityNotFoundException: Unable to find com.myproject.repository.entity.Book with id 5851445...............
org.springframework.orm.jpa.JpaObjectRetrievalFailureException: Unable to find com.myproject.repository.entity.Book with id 5851445; nested exception is javax.persistence.EntityNotFoundException: Unable to find com.myproject.repository.entity.Book with id 5851445...............
這是一個以某種方式顯示我的問題的示例:
服務A類
@Service
public class ServiceA {
public void nonTransactionalMethodA(Book book) {
//..... Any independent logic from ServiceB
updateAuthor(book);
nonTransactionalMethodB();
}
public void nonTransactionalMethodB() {
//post process logic ......
}
}
服務B類
@Service
public class ServiceB {
@Autowired
private BookRepository bookRepository;
@Autowired
private OfferRepository offerRepository;
@Transactional
private void updateAuthor(Author author) {
Book book = new Book(1);
book.setAuthor(author);
bookRepository.save(book);
removeUnavailableOffers(book);
}
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void removeUnavailableOffers (Book book) {
/*throwing org.springframework.orm.jpa.JpaObjectRetrievalFailureException: Unable to find com.myproject.repository.entity.Book with id 5851445; nested exception is javax.persistence.EntityNotFoundException: Unable to find com.myproject.repository.entity.Book with id 5851445............*/
offerRepository.deleteByBookIdIsNullAndBookAuthorIdNot(book.authorId);
}
}
對此的任何想法將不勝感激。
確保使用@Transactional
注釋的方法聲明為public
並由不同的類調用。
事務方法必須是公共的,以便 Spring 可以覆蓋它,並且必須從定義類的外部調用它,以便調用可以通過代理。
這是使用@Transactional 時常見的陷阱之一,有關更多信息,請參閱https://codete.com/blog/5-common-spring-transactional-pitfalls/
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.