[英]KafkaListener does not update jpa entity
背景:
我在 class 級別上有一個帶有@Transactional的實體。 下面是一個示例,它包含實體所需的一切。
@Entity
Entity {
boolean flag;
}
我有一個JPA 存儲庫。 還有一個使用存儲庫的服務。
情況1:
在服務中,我讀取實體並在實用程序方法中更新標志。
updateFlag(int id, boolean value){
value = repository.get(id);
value.setFlag(xyz);
}
更改會反映在數據庫中,無需調用repository.save(entity).
案例二:
在上述案例運行之后,KafkaListener 立即運行並使用新值更新實體,但這次更新不會反映在數據庫中,除非我執行repository.save(entity).
問題:
為什么我們需要為第二種情況顯式調用 save 以及為什么它在第一種情況下有效,即使它們是相同的。 此外,更新標志值的方法是@Transactional,它應該保持更改而不需要調用保存。 有什么線索嗎?
附加信息:
SQL 日志顯示,在情況 1 中,有一個更新查詢正在運行。 在情況 2 中,只有 select 查詢正在運行。
@Transactional
適用於代理機制。 因此,只要您不進行保存並且在連續的行檢查值中,它將保留該值
@Transactional
public int A(){
int id= myRepository.save(myEntity)
myRepository.get(id); //won't work because it hasn't been persisted yet
}
public int A(){
call B();
myRepository.get(id); //will work because it's been persisted
}
@Transactional
public int B(){
int id= myRepository.save(myEntity); // proxy works once execution point surpasses this method
}
主要針對案例 1 和案例 2,您提到了您在代碼庫中執行的上述任一場景
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.