我有一個控制器,它做了以下作業
。- 一個提交端點,在資料庫中保存一個條目,然后異步呼叫一些外部服務。
- 一個提交端點,在db中保存一個條目,然后異步呼叫一些外部服務 通過觀察資料庫來跟蹤異步呼叫的更新(該呼叫會更新一個相關的表),并更新第一步中創建的條目的狀態
我正在使用 @Query 注解來驗證資料庫中是否存在第一步條目,但它總是回傳空。我試著將其改為默認的 Spring 方法,它開始回傳插入的值。
我閱讀了關于代理、@Transactional以及JPARepository中的非CRUD方法是非事務性的,并嘗試了一些東西,如事務傳播和自我注入,甚至明確標記 repo方法為@Transactional。但這些都沒有解決這個問題。使用spring data方法解決了這個問題,但我還是不明白發生了什么。誰能幫我解釋一下這種行為。
基本的代碼片段如下
MyController@RestController
public class MyController {
private final MyService myService。
private final MyRepository myRepository;
@Autowired
public MyController(MyService myService,
MyRepository myRepository) {
this.myService = myService。
this.myRepository = myRepository;
}
@PostMapping(value = "/submit")。
public ResponseEntity<MyResponse> submit(@Valid @RequestBody MyRequest) {
return ResponseEntity
.accepted()
.body(MyResponse.success(myService.submit(myRequest), "SUBMITTED") )。
}
/***。
* 該方法是為了更新由/submit端點創建的條目的狀態。
*如果由提交端點觸發的異步行程更新了一個相關的表
*/
@PostConstruct
private void trackUpdates() {
..
someObserver.subscribe(trackedAssociatedEntity -> { .
myService.trackAndUpdateBasedOnAssociatedEntity(trackedAssociatedEntity)。
});
}
}
MyService
@Service
@Transactional
public class MyService {
private finally MyRepository myRepository;
@Autowired
public MyService(MyRepositorymyRepository) {
this.myRepository=myRepository。
}
submit(MyRequest myRequest) {
myRepository.save(myEntity)。
//makes that asynchronous call。
}
title function_">trackAndUpdateBasedOnAssociatedEntity(@NotNullMyAssociatedEntity myassociatedEntity) {
//這個被評論的呼叫總是回傳空,但未被評論的代碼可以正常作業。
// List<MyEntity> existingEntity =。
// myRepository.findEntityByField1AndField2(myassociatedEntity.getField1(),myassociatedEntity.getField2());
List<MyEntity> existingEntities =
myRepository.findByField1AndField2(myassociatedEntity.getField1(),myassociatedEntity.getField2() ) 。
if(existingEntities.isEmpty()){
//創建新的。
}else{
//update else{
}
}
}
}
}
MyRepository
@Repository
public interface MyRepository extends JpaRepository<MyEntity, Long> {
@Query("SELECT e FROM MyEntity e WHERE e.field1 = ':field1' and e.field2 = ':field2'" /span>)
List<MyEntity> findEntityByField1AndField2(String field1, String field2);
List<MyEntity> findByField1AndField2(String field1, String field2) 。
}
uj5u.com熱心網友回復:
我認為不需要''/code>。請嘗試以下方法:
@Repository。
public interface MyRepository extends JpaRepository<MyEntity, Long> {
@Query("SELECT e FROM MyEntity e WHERE e.field1 = :field1 and e.field2 = :field2")
List<MyEntity> findEntityByField1AndField2(String field1, String field2)。
List<MyEntity> findByField1AndField2(String field1, String field2)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/317516.html
標籤:
上一篇:當pageable.size=1時,JPARepositorynativeQuery與pageable,連接表不作業。
