簡體   English   中英

KafkaListener 不更新 jpa 實體

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM